2011-12-22 20 views
2

私は現在Drawable型のオブジェクトを取り出し、Listに追加するアニメーションエンジンを使用しています。このリストをJavaでアニメーションを作成する最良の方法は?

public void draw(Graphics2D g2d); 

延びるアニメーションマネージャ反復スイング成分から得られたGraphics2Dオブジェクトを渡して、すべてのオブジェクト上に描画()メソッドを呼び出す:描画可能な一の方法を有するインタフェースです。

このメソッドは最初はうまくいくように見えましたが、恐らく私は恐らく複数のオブジェクトを長期間に渡って処理することはできないようです。

2つのDrawableが登録されていて、どちらも画面に画像を描画していますが、30〜60秒後に少し点滅しています。

この方法を最適化する方法はありますか?現在、AWTスレッド(invokeLater)を呼び出してすべてのタスクを処理します。並行描画は実際にはオプションではありません。なぜなら、Swing/AWTでは、ほとんどの場合、Graphicsが同期していないという事実が原因です。

これはただ単にアニメーションの悪い方法がある場合は、すべてが自分の特定の変数ゲームでレンダリング物事を必要とする複数のオブジェクトを持っている場合は、より良い方法は何ですか?

ご協力いただければ幸いです。ありがとう!

EDIT:

私は私のエンジンがすでにものをペイントするAWTスレッドを呼び出しbeacuse)(再描画を使用することはできません。 AWTスレッドからinvokeLaterを呼び出すと、何らかの理由でイメージが描画されることはありません。

また、ティックとfpsのシステムを使用しています。 60チックス@ 120 fps。

各ティックはゲームロジックを更新し、各フレームレンダリングコールはフレームマネージャで描画します。

これは悪い考えですか?私はちょうどFPSを使用し、ダニではないでしょうか?

答えて

5

paintComponent(Graphics g)をオーバーライドし、JPanelやTimerで描画しているものを定期的にrepaintメソッドで呼び出す方が適切だと思います。あなたの問題は、引き分けようとしていることによるかもしれません。

public class Main { 
public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    JPanel panel = new JPanel() { 
     public void paintComponent(Graphics g) { 
      //draw here 
     } 
    }; 
    panel.setPreferredSize(800, 600); 
    frame.add(panel); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true) 

    new Timer(16, new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      panel.repaint(); 
     } 
    }).start(); 
} 
} 
+0

タイマーを使用する必要がありますか?または、ちょうどxミリ秒間スリープし、repaint()を呼び出すスレッドを使用できますか? – bgroenks

+0

これまでどんなことができるのですが、タイマーはかなり良いです。私はタイマーがAWT Eventスレッドで管理されていると信じているので、マルチスレッドのようにしか見えません。 paintComponentメソッドの中にsynchronized(this){wait();}のようなものを置くと、GUI全体が応答を停止します。 – user615457

関連する問題