在图形方面,我是一个相对缺乏经验的Java程序员。我正在尝试制作一个简单的Pong游戏,以了解有关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) {
}
}
答案 0 :(得分:3)
public class Panel extends JPanel implements KeyListener {
请勿致电您的班级Panel
。有一个具有该名称的AWT类,因此令人困惑。您的班级名称应更具描述性。也许像PongPanel
。
public void paint(Graphics g) {
不要覆盖paint(...);
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。相反,您应该使用“键绑定”来查看Motion Using the Keyboard,以获取更多信息和工作示例。