无法在简单的乒乓球游戏中更新绘画功能



在图形方面,我是一个相对缺乏经验的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。相反,您应该使用"键绑定"查看使用键盘的运动以获取更多信息和工作示例。

相关内容

  • 没有找到相关文章

最新更新