在图形方面,我是一个相对缺乏经验的Java程序员。我正在尝试制作一个简单的乒乓球游戏,以了解有关图形如何在 Java 中完成的更多信息。
在程序中,当按下键盘上的"W"时,左拨片(迄今为止实现的唯一拨片(应向上移动 5 像素。根据控制台,它正在识别正在按下该键,并且正在相应地更新一个表示左桨的 y 坐标的变量。但是,桨的位置实际上并未在屏幕上更新。
帮助?
游戏类:
import javax.swing.JFrame;
public class Game {
static int WIDTH = 500;
static int HEIGHT = 500;
public static void main(String[] args) {
window();
}
public static void window() {
JFrame frame = new JFrame();
frame.setSize(WIDTH, HEIGHT);
frame.setLocationRelativeTo(null);
frame.setAlwaysOnTop(true);
frame.setVisible(true);
frame.setResizable(false);
frame.add(new Panel());
frame.addKeyListener(new Panel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
面板类:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
public class Panel extends JPanel implements KeyListener {
int leftPaddlePos = 100;
public void paint(Graphics g) {
g.clearRect(0, 0, Game.WIDTH, Game.HEIGHT);
g.setColor(Color.black);
g.fillRect(0, 0, Game.WIDTH, Game.HEIGHT);
g.setColor(Color.white);
g.fillRect(75, leftPaddlePos, 15, 100);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_W) {
System.out.println("W pressed");
leftPaddlePos = leftPaddlePos + 5;
System.out.println(leftPaddlePos);
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}
public class Panel extends JPanel implements KeyListener {
不要称你的班级Panel
。有一个具有该名称的AWT类,因此令人困惑。您的类名应该更具描述性。也许像PongPanel
.
public void paint(Graphics g) {
不要覆盖油漆(...(;
public void paintComponent(Graphics g) {
Swing 中的自定义绘画是通过覆盖paintComponent(...)
来完成的。
g.clearRect(0, 0, Game.WIDTH, Game.HEIGHT);
g.setColor(Color.black);
g.fillRect(0, 0, Game.WIDTH, Game.HEIGHT);
不要使用上面的代码来绘制面板的背景。相反,您只需使用:
super.paintComponent(g);
因此,在类的构造函数中,您可以调用setBackground(...)
来设置所需的背景颜色。
但是,桨的位置实际上并未在屏幕上更新。
leftPaddlePos = leftPaddlePos + 5;
您更新了位置,但尚未告诉组件类的属性已更改,因此它不知道需要再次绘制自己。
不应更改侦听器中类的属性。相反,你应该有一个像adjustLeftPaddlePosition(int value)
这样的方法
方法是:
public void adjustLeftPaddlePostion(int value)
{
leftPaddlePos = leftPaddlePos + value;
repaint();
}
然后在 KeyListener 中,您将使用:
adjustLeftPaddlePosition(5);
此外,您不应该使用 KeyListener。相反,您应该使用"键绑定"查看使用键盘的运动以获取更多信息和工作示例。