2017-05-05 9 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

を見ている必要があります/javase/tutorial/extra/fullscreen/rendering.html) –

+0

スイングについて学びたいのであれば、あなたは何をしているのですか?しかし、あなたが実際にゲームを作ろうとしているならば、[Swingはおそらくうまくいかないでしょう。](https://pavelfatin.com/low-latency-painting-in-awt-and-swing/)そこに[ゲームのためのより良いオプションです。](https://www.lwjgl.org/) – markspace

答えて

0

私はすべてのゲームが

オブジェクトうん、良い

の位置を変更するupdateメソッドを持っていると私はすべての更新位置を描画するdrawメソッドを持っています前記対象物のうち

ああ...あまり良くない

paint()メソッドを呼び出すべきですか?

いいえ、実際にはgetGraphicsに電話してはいけません。これは塗装の仕方ではありません。

通常は、repaintを呼び出して、新しいペイントサイクルを開始します。

は、Swingでどのように絵画作品のPainting in AWT and SwingPerforming Custom Paintingを見てください - Concurrency in Swingを参照してください - 私は、Swingは単一スレッドで、注意してください、あなたはまた

を使用している方法に基づいてスイングを使用していると仮定しています詳細についてはHow to use Swing Timersを参照してください。

Threadを依然として使用したい場合、その絵画はあなたのコントロールを超えて何らかの理由でいつでも発生する可能性があるので、更新状態のときには汚れた塗料のリスクに気づく必要があります

あなたは、塗料/更新サイクルをより細かく制御したい場合

、あなたはあなたが呼び出す `再描画()`または[アクティブレンダリング](https://docs.oracle.comに切り替えBufferStrategy and BufferCapabilities

関連する問題