更新Canvas时如何避免使用bufferstrategy闪烁

时间:2014-05-17 10:22:57

标签: java graphics awt java-canvas

我正在用Java编写一个平台游戏。一切正常,没有更大的问题,除了Canvas更新时屏幕上的闪烁。

我将大致解释我的游戏"引擎"作品: 在我的主要方法中,我有一个循环,它每秒重复30次:

while (play) {
    Date delay_time = new Date();
    delay_time.setTime(delay_time.getTime() + (int) (1000*(1.0/FPS)));

    // Here is all the game stuff, like the motion of the player,
    // function calling, etc.

    Graphics g = can.getGraphics();
    can.update(g);
    while(new Date().before(delay_time)) {

    }

}

我的FPS变量是static final int,目前设置为30。 所以我每秒更新我的Canvas 30次。

Play是一个布尔值,用于控制游戏是否仍在播放,或者玩家是否死亡。

Can是我班MyCanvas.java的一个实例。 paint()方法的代码如下所示:

   if (Main.play) {
       //NOW
       //Draw the now Level Caption
       //SIZE: 240
       g2.setFont(new Font("Bank Gothic", Font.PLAIN, 240));
       g2.setColor(new Color(Math.abs(bg.getRed() - 30), Math.abs(bg.getGreen() - 30), Math.abs(bg.getBlue() - 30)));
       g2.drawString("LEVEL " + Main.lvl, 80, 80 + 300 - Main.groundY);

       //Draw the ground
       g2.setColor(haba);
       g2.fillRect(0, Main.screenSize.height - Main.groundY, Main.screenSize.width, Main.groundY);

       //Draw the level
       g2.setColor(haba);
       for (int i = 0; i < Main.LVLWIDTH; i++) {
            for (int j = 0; j < Main.LVLHEIGHT; j++) {
                if (Main.level[i][j] == '1') {
                    g2.fillRect(i*(Main.BLOCK_X), (j - Main.LVLHEIGHT)*(Main.BLOCK_Y) + Main.screenSize.height - Main.groundY, Main.BLOCK_X, Main.BLOCK_Y);
                }

        }

        //More drawing stuff...

    }

所以,正如你所看到的,我正在更新很多 - 每秒30次。这导致我的游戏(以全屏模式BTW播放)一直闪烁的问题。怎么解决那个问题? Bufferstrategy是正确的方式吗?如果是,我应该怎么做?您能否解释一下Bufferstartegy或提供有很好的教程或解释的链接,哪些与技术和非初学者友好?那会很棒。

1 个答案:

答案 0 :(得分:0)

BufferStrategy类解决了我的问题。这是一个很好的链接,有一个很好的例子,如何使用它:
http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferStrategy.html