Реализация движущегося объекта на динамическом фоне Swing (игра Pacman) - PullRequest
0 голосов
/ 29 мая 2018

Я кодирую игру Pacman и столкнулся с несколькими проблемами, пытаясь ее реализовать.

У меня есть основной JFrame, который содержит фон, а точки на нем, точки добавляются вpaint() метод.

Я добавил к кадру JPanel, который делает доску, на которой находится Пакман, Pacman закрашивается paintComponent().Движение Pacman определяется `KeyListener, который находится на раме.

Проблемы, с которыми я сталкиваюсь:

  1. Если при нажатии клавиши я вызываю paint функция кадра, которая позже вызывает метод paintComponent панели, мой экран мигает, потому что каждый раз, когда он перерисовывает все точки.

  2. Если после нажатия клавиши Iвызовите непосредственно метод панели paintComponent() и раскрасьте Pacman, он останется на доске, как в GIF № 2.

1: image

2:image

Это 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;
    }
}
...