我正在编写一个Pacman游戏,但在尝试实现它时遇到了一些问题。
我有一个主JFrame
,其中包含背景和点,点数会添加到paint()
方法中。
我在框架中添加了一个JPanel
,它构成了Pacman所在的棋盘,Pacman正由paintComponent()
绘制。
吃豆子运动由一个在框架上的“KeyListener”决定。
我遇到的问题:
如果按下某个键,我会调用该帧的paint
功能,后来调用该面板的paintComponent
方法,我的屏幕闪烁,因为每次重新绘制所有的分。
如果按下某个键,我会直接调用面板paintComponent()
方法并绘制Pacman,它就像2号gif一样留在电路板上。
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;
}
}