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

时间:2018-05-29 11:34:03

标签: java swing background pacman

我正在编写一个Pacman游戏,但在尝试实现它时遇到了一些问题。

我有一个主JFrame,其中包含背景和点,点数会添加到paint()方法中。

我在框架中添加了一个JPanel,它构成了Pacman所在的棋盘,Pacman正由paintComponent()绘制。 吃豆子运动由一个在框架上的“KeyListener”决定。

我遇到的问题:

  1. 如果按下某个键,我会调用该帧的paint功能,后来调用该面板的paintComponent方法,我的屏幕闪烁,因为每次重新绘制所有的分。

  2. 如果按下某个键,我会直接调用面板paintComponent()方法并绘制Pacman,它就像2号gif一样留在电路板上。

  3. 1:

    2:

    这是框架的paint方法:

    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);
    }
    

    这是paintComponent

    protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.drawImage(pacmanImage,pacman.getX(),pacman.getY(),null);
    }
    

    这就是我如何调用这些方法(在jframe类中):

        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;
        }
    }
    

0 个答案:

没有答案