使用BreezyGUI闪烁的绘制方法[Java]

使用BreezyGUI闪烁的绘制方法[Java],java,graphics,paint,keylistener,repaint,Java,Graphics,Paint,Keylistener,Repaint,在任何人回答这个问题之前,我在任何地方都找不到,因为我没有使用缓冲图像,我使用g.drawRect(…)等等。。。为了画我的对象,这是我被要求做的,因为我现在正在学习如何编码。但是由于某种原因,屏幕一直在闪烁,我想得到一些帮助 所以,我对编码相当陌生,我正在尝试编写一个非常简单的轰炸机游戏。我没有使用BuffereImage,我只是使用图形绘制来绘制角色。当我添加键绑定时,我使用repaint()在按下键时“更新”游戏。但这是一个非常糟糕的问题,当我按下其中一个按钮时,它会出现故障并显示一个空白

在任何人回答这个问题之前,我在任何地方都找不到,因为我没有使用缓冲图像,我使用g.drawRect(…)等等。。。为了画我的对象,这是我被要求做的,因为我现在正在学习如何编码。但是由于某种原因,屏幕一直在闪烁,我想得到一些帮助

所以,我对编码相当陌生,我正在尝试编写一个非常简单的轰炸机游戏。我没有使用BuffereImage,我只是使用图形绘制来绘制角色。当我添加键绑定时,我使用repaint()在按下键时“更新”游戏。但这是一个非常糟糕的问题,当我按下其中一个按钮时,它会出现故障并显示一个空白屏幕。我想这是因为我重新粉刷了它,但我不知道如何着手修复它。下面是我正在使用的一些代码

    public static void left(Graphics g) {
    bomberManLowerLeft(g, -90 + dx, -20 + dy);
    bomberManBodyLeft(g, -90 + dx, -20 + dy);
    bomberManFaceLeft(g, -90 + dx, -20 + dy);
}

public static void right(Graphics g) {
    bomberManLowerRight(g, -90 + dx, -20 + dy);
    bomberManBodyRight(g, -90 + dx, -20 + dy);
    bomberManFaceRight(g, -90 + dx, -20 + dy);
}

public void paint(Graphics g) {
    if (down) {
        front(g);
    } else if (up) {
        back(g);
    } else if (left) {
        left(g);
    } else if (right) {
        right(g);
    }
}

public static void main(String[] args) {
    Frame frm = new BomberMan();
    frm.setSize(750, 750);
    frm.setVisible(true);
    frm.add(panel);
    frm.setBackground(Color.black);
}

@Override
public void keyPressed(KeyEvent e) {
    int kCode = e.getKeyCode();
    if (kCode == KeyEvent.VK_D) {
        System.out.println("Right");
        dx += 3;
        down = false;
        right = true;
        left = false;
        up = false;
        repaint();
    } else if (kCode == KeyEvent.VK_A) {
        System.out.println("Left");
        dx -= 3;
        down = false;
        right = false;
        left = true;
        up = false;
        repaint();
    } else if (kCode == KeyEvent.VK_W) {
        System.out.println("Up");
        dy -= 3;
        down = false;
        right = false;
        left = false;
        up = true;
        repaint();
    } else if (kCode == KeyEvent.VK_S) {
        System.out.println("Down");
        dy += 3;
        down = true;
        right = false;
        left = false;
        up = false;
        repaint();
    } else if(kCode == KeyEvent.VK_SPACE){
        placeBomb = true;
        bombdx = dx;
        bombdy = dy;
        repaint();
    }

}
我真的需要一些帮助,谢谢。如果您确实需要完整的代码,请参阅:

  • 避免直接从顶级容器扩展,如
    JFrame
    (我不知道
    GBFrame
    是什么,但我想它是从
    JFrame
    或其他窗口派生的)
  • 避免覆盖顶级容器的
    paint
    ,它们不是双缓冲的,如果你破坏了paint链(你有),它可能会导致无止境的问题
  • 避免使用
    KeyListener
    ,因为它在焦点方面有很多问题,并且很容易变得没有反应。相反,考虑使用密钥绑定API。有关更多详细信息,请参阅
  • 避免过度使用
    静态
    <代码>静态不是一种跨对象通信机制,当程序变得更加复杂时,它将导致无休止的问题
  • 相反,创建一个自定义组件,该组件从
    JPanel
    扩展,并覆盖它的
    paintComponent
    方法,并在那里执行自定义绘制

    public class BomberManPanel extends JPanel {
        //...
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            // Your painting goes here...
        }
    }
    
    有关详细信息,请参阅和

    我还将把您的所有核心逻辑移到这个组件上,只需将它的一个实例添加到您的
    BomberMan
    框架中

    虽然您当前的方法通常会起作用,但通常情况下,您会有某种“游戏循环”,负责更新游戏的当前状态并安排游戏状态的渲染

    这意味着,您不需要修改按键侦听器中的状态,只需设置一个标志,指示当前按下的按键,并允许“游戏循环”相应地更新状态

    在这种情况下,您可以简单地使用