2011-11-09 13 views
3

私は古典的な小惑星に傾いて、少しJavaゲームに取り組んでいます。多くのオブジェクトの定期的な更新を処理する方法は?

すべてのフレーム:移動または回転させるオブジェクト

このゲームでは一定の時間間隔で更新する必要があるオブジェクトのトンがあります。
毎秒:ゲームタイマー。
数秒ごと:敵AI、敵の産卵
数秒ごと:船の武器から新しい弾を発射する。もちろん

//This method is called by a timer that is run every 30 milliseconds 
//It will iterate through all objects that require periodic updates and call their 
//update method every 30ms. 
public void frameUpdateLoop(){ 
    for(Updating u : allObjectsThatNeedPeriodicUpdates){ 
     u.update(); 
    } 
} 

public class EnemySpawner implements Updating{ 
    private static final int SPAWN_TRESHOLD=500; 
    private int timeUntilNewEnemySpawns=SPAWN_TRESHOLD; 

    //This method is called by frameUpdateLoop() 
    //It is only supposed to do work once every 500ms, but is called every 
    //30ms nonetheless. 
    public void update(){ 
     timeUntilNewEnemySpawns -= 30; //Subtract time since last update 
     if(timeUntilNewEnemySpawns <= 0){ 
      SpawnNewEnemy(); 
      timeUntilNewEnemySpawns = SPAWN_TRESHOLD; 
     } 
    } 
} 

これは、私はそれを使用していますどのようにの一例に過ぎないので、私は不要な部分を削除:

現在、私はこのようにそれを処理しています。

私の質問は: このようなアップデートシステムを実装するのは正しいですか? 私は周りを読んでいるとき、ほとんどの時間はタイマーがそのようなタスクに使用されていることに気づいた。

しかし、それは私が数多くのタイマーを一度に実行する必要があります(更新が必要なオブジェクトごとに1つ)。
Timerの各インスタンスが正しく理解されていれば、新しいスレッドも作成されるため、ある時点で問題が発生する恐れがあります(現在のシステムのスレッド処理パフォーマンスの損失よりも、スレッドの数が多くなりすぎます)。

私はJavaには新しいので、私の恐怖が根拠がないのか、そう多くのタイマーを持っているのは本当に悪い考えか分かりません。

このトピックに関するご意見、ご要望、訂正ありがとうございます。

答えて

0

私は本当にあなたのデザインがUpdatingのインターフェイスを使って実際に更新が必要なものの詳細を抽象化しているのが好きです。もちろん、現在の実装はそれほどエレガントではありません。たぶんupdateEveryFrame()updateEverySecond()などのようないくつかのメソッドを作成する必要がありますか?各オブジェクトは、必要なメソッドだけを実装し、他の人には何もしません。 (何千人もが問題を提示してはならない)

は、しかし、私はに分割するallObjectsThatNeedPeriodicUpdatesをお勧めします、同時にスケジュールされたタスクの多くに

このクラスのスケール:

Timer

は、実際にここに as well良い選択です。 allObjectsThatNeedUpdateEveryFrameallObjectsThatNeedUpdateEverySecondなど。最初の収集のための1つの周期的なタスクを作成し、もう1つの周期的なタスクを作成します。

0

あなたの方法は上手く見えますが、それはHalf-Lifeと同じです。唯一の違いは、Half-Life(およびあなたを含む多くの他の多くのユーザー)がデルタタイムをアップデート機能に送信するため、すべてのアップデート機能に30msハードコードする必要がないことです。従って:

public void update(int deltaTime){ 
    timeUntilNewEnemySpawns -= deltaTime; //Subtract the delta time 
    if(timeUntilNewEnemySpawns <= 0){ 
     SpawnNewEnemy(); 
     timeUntilNewEnemySpawns = SPAWN_TRESHOLD; 
    } 
} 

このようなデルタ時間を使用すると、必要に応じて更新間隔を変更することができます。そして、はい、さまざまなゲーム内イベントを追跡するカウンターがたくさんあります。

また、deltaTimetimeUntilNewEnemySpawnsTimeSpanのJavaに相当するものに変更して、TotalSecondsなどの便利なメソッドにアクセスできるようにすることもできます。しかしそれは必要ではありません。

+0

フレームレンダリングにはミリ秒がかかり、フィジックスの式ではどれくらいの時間が経過したかを知る必要があるため、deltaTimeを渡すこともお勧めします。遅い時間に、もっと長いジャンプなどを取らせてください。 – Karl

+0

@ Karl、それは多くの場合に当てはまりますが、ここで読む価値のある固定vs可変タイムステップに関する大きな議論があります:http://gamedev.stackexchange。 com/questions/1589/fixed-time-step-vs-variable-time-step –

関連する問題