Java 在动态背景上实现移动对象,Swing(Pacman游戏)

Java 在动态背景上实现移动对象,Swing(Pacman游戏),java,swing,background,pacman,Java,Swing,Background,Pacman,我正在编写一个吃豆人游戏,在尝试实现它时遇到了一些问题 我有一个主要的JFrame,它保存背景和背景上的点,这些点被添加到paint()方法中 我在框架中添加了一个JPanel,它构成了Pacman所在的板,Pacman由paintComponent()绘制。 Pacman的移动由帧上的“KeyListener”决定 我遇到的问题是: 如果按下一个键,我调用框架的paint功能,该功能随后调用面板的paintComponent方法,我的屏幕会闪烁,因为每次它都会重新绘制所有点 如果按下一个键,我

我正在编写一个吃豆人游戏,在尝试实现它时遇到了一些问题

我有一个主要的
JFrame
,它保存背景和背景上的点,这些点被添加到
paint()
方法中

我在框架中添加了一个
JPanel
,它构成了Pacman所在的板,Pacman由
paintComponent()绘制。
Pacman的移动由帧上的“KeyListener”决定

我遇到的问题是:

  • 如果按下一个键,我调用框架的
    paint
    功能,该功能随后调用面板的
    paintComponent
    方法,我的屏幕会闪烁,因为每次它都会重新绘制所有点

  • 如果按下一个键,我直接调用面板
    paintComponent()
    方法并绘制Pacman,它会像gif数字2一样留在板上

  • 1:

    2:

    这是框架的
    绘制方法:

    public void paint(Graphics g) {
        super.paint(g);
            for (int i = 0; i < 800; i++)
                for (int j = 0; j < 800; j++)
                    if (boardPanel.getBoard().getTileXY(i, j).getPill() != null) 
                       g.drawImage(yellowPil, i, j, null);
        boardPanel.paintComponent(g);
    }
    
    这就是我调用每个方法的方式(在jframe类中):


    1) 为了更快地获得更好的帮助,请发布一个or。2) 例如,获取图像的一种方法是热链接到中看到的图像。3) 基于以上内容,我建议不要更改框架的绘制方法,而是从面板中进行所有自定义绘制。切勿直接调用
    paint
    paintComponent
    -始终只需在组件或任何父容器上调用
    repaint()
    。嘿,安德鲁,谢谢你的帮助。我在线程中添加了更多代码。我曾尝试调用panel.repaint(),但它在代码中没有改变任何内容。有什么方法可以删除问题2中出现的所有以前的“吃豆人”吗?再次感谢。“我在线程中添加了更多代码。”。。。为什么?更重要的是,你真的读过相关的建议吗?减1,因为我认为你随机猜测了什么是MCVE/SSCCE,这是非常糟糕的研究。
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.drawImage(pacmanImage,pacman.getX(),pacman.getY(),null);
    }
    
        public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        switch (keyCode) {
            case KeyEvent.VK_RIGHT:
                boardPanel.movePacman(Direction.RIGHT);
                boardPanel.paintComponent(getGraphics()); // this will casue ` 
                                                             problem 2`
                break;
            case KeyEvent.VK_LEFT:
                boardPanel.movePacman(Direction.LEFT);
                repaint(); // this will cause problem 1
                break;
            case KeyEvent.VK_DOWN:
                boardPanel.movePacman(Direction.DOWN);
                repaint();
                break;
            case KeyEvent.VK_UP:
                boardPanel.movePacman(Direction.UP);
                repaint();
                break;
        }
    }