【问题标题】:paint method with BreezyGUI flickering [Java]带有 BreezyGUI 闪烁的绘制方法 [Java]
【发布时间】:2015-06-18 04:07:59
【问题描述】:

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

所以,我对编码很陌生,我正在尝试编写一个非常简单的炸弹人游戏。而且我没有使用 BufferedImages,我只是使用图形绘制来绘制角色。而且,当我添加 KeyBinding 时,我使用 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();
    }

}

我真的需要一些帮助,谢谢。如果你确实需要完整的代码,那就是:PASTEBIN-CODE

【问题讨论】:

    标签: java graphics paint keylistener repaint


    【解决方案1】:
    1. 避免直接从JFrame 等顶级容器扩展(我不知道GBFrame 是什么,但我猜它源自JFrame 或其他一些窗口)
    2. 避免覆盖顶级容器的 paint,它们不是双缓冲的,如果您破坏了(您拥有的)绘制链,它可能会导致无穷无尽的问题。
    3. 避免使用KeyListener,它在对焦方面存在许多问题,并且很容易变得无响应。相反,请考虑使用键绑定 API。详情请参阅How to Use Key Bindings
    4. 避免过度使用staticstatic 不是跨对象通信机制,随着您的程序变得越来越复杂,它会导致无穷无尽的问题。

    相反,创建一个从 JPanel 类扩展的自定义组件并覆盖它的 paintComponent 方法并在那里执行您的自定义绘画...

    public class BomberManPanel extends JPanel {
        //...
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            // Your painting goes here...
        }
    }
    

    更多详情请参阅Painting in AWT and SwingPerforming Custom Painting

    我还将把你所有的核心逻辑移到这个组件中,然后简单地将它的一个实例添加到你的BomberMan 框架中。

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

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

    在这种情况下,您可以简单地使用类似a Swing Timer

    【讨论】:

      猜你喜欢
      • 2016-10-29
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 2011-09-22
      • 2011-11-04
      • 2022-01-20
      • 2011-03-10
      • 2018-11-15
      相关资源
      最近更新 更多