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