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

时间:2020-07-04 03:31:57

标签: java swing graphics 2d pong

在图形方面,我是一个相对缺乏经验的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) {
        
    }

}

1 个答案:

答案 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,以获取更多信息和工作示例。