2017-05-05 93 views
0

我正在用java創建一個galaga克隆。我想了解遊戲循環的基礎知識,並且有幾個問題/問題。我有一個更新方法可以改變所有遊戲對象的位置,我有一個繪製方法可以繪製所有對象的所有更新位置。我是否應該調用paint()方法?如何重新繪製對象(清除屏幕然後再繪製一切)?另外,以固定速率調用update()方法的最佳方式是什麼?感謝您的任何意見。Java圖形/基本遊戲循環

public Galaga() throws IOException 
{ 
    //set the background 
    setBackground(Color.BLACK); 

    //create a controller 
    c = new Controller(); 
    addKeyListener(c); 
    setFocusable(true); 

    //create a player 
    player = new Ship(40,50); 
    running = true; 

} 


public void paint(Graphics g) 
{ 
    super.paint(g); 
} 

//game loop 
public void run() 
{ 
    while(running) 
    { 
     draw(getGraphics()); 
     if(c.right()) 
      player.move(1, 0); 
    } 
} 

//update logic 
public void update() 
{ 

} 

//renders all objects 
public void draw(Graphics g) 
{ 
    player.draw(g); 
} 
+1

你叫'重繪()'或切換到[活躍渲染(https://docs.oracle.com /javase/tutorial/extra/fullscreen/rendering.html) –

+0

如果你只是想了解Swing,你在做什麼是好的。但是,如果你真的打算製作遊戲,[Swing可能不適合你。](https://pavelfatin.com/low-latency-painting-in-awt-and-swing/)是[更好的遊戲選項]。(https://www.lwjgl.org/) – markspace

回答

0

我必須改變所有的遊戲的位置更新方法的對象

是的,好

和我有吸引所有的更新位置的抽籤方法的物體

啊......不太好

我是否應該調用paint()方法?

不,你不應該這樣做,事實上,你也不應該打電話給getGraphics,這不是繪畫是如何完成的。

您通常會呼叫repaint觸發新的塗料循環。

看一看Painting in AWT and SwingPerforming Custom Painting繪畫在Swing中如何工作 - 我假設你正在使用基於Swing的方法,你使用

此外,要小心,Swing是單線程的 - 見Concurrency in Swing欲瞭解更多詳情和How to use Swing Timers更多簡單的解決方案。

如果您仍然想使用Thread,請注意,由於任何原因(無法控制),隨時都可能出現此繪畫,因此您需要了解更新狀態時出現髒污的風險

如果你想在油漆/更新週期更多的控制,那麼你應該看看BufferStrategy and BufferCapabilities