2015-04-12 145 views
0

之前有人說這已被回答,我找不到任何地方,因爲我沒有使用緩衝圖像,即時通訊使用g.drawRect(...)等等。 ..畫我的對象,這是我被告知要做的,因爲我現在正在學習如何編碼。但由於某種原因,屏幕一直閃爍,我想要一些幫助。使用BreezyGUI閃爍的paint方法[Java]

所以,我很新的編碼,而我正在嘗試編寫一個非常簡單的炸彈人遊戲。而且我不使用BufferedImages,我只是使用Graphics畫圖來繪製角色。而且,當我添加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

回答

0
  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框架中。當你目前的方法通常會起作用時,通常你會有某種「遊戲循環」,它負責更新遊戲的當前狀態和安排遊戲狀態的渲染。

這意味着,而不是你的按鍵偵聽器中修改狀態,您只需設置一個標誌,表明這是目前壓制,並允許「遊戲圈」,以更新狀態accoridingly

在這種情況下鍵,你可以簡單地使用像a Swing Timer