1

libgdxを使って簡単なゲームを作ろうとしています。私が立ち往生していることの1つは、特定の時間に敵をスポーンさせることです。私が何かをするなら

if (t == 10) 
    new Enemy();

この特定の時間を逃したり、同じ敵を2回スポーンしたりする可能性があります。私が今持っているのは

float t = 0
float timeElapsed = 0;

update (float delta) {
    timeElapsed += getDeltaTime();
    if (timeElapsed > 0.1) {
        t++;
        timeElapsed = 0;
    }
}

これにより、tのおよそ10分の1秒の経過時間がわかりますが、実際には、これを行うべき方法とは思えません。

4

3 に答える 3

1

また、たとえばフレームが遅い場合。getDeltaTime() = 0.2、敵のスポーンが遅れます。

頭に浮かぶ最も簡単な方法は、t を取り除くことです。timeElapsed と直接比較し、オブジェクト参照を追跡して、各敵をスポーンしたかどうかを確認します。すなわち。

if (enemy1 == NULL && elapsedTime > 10) {
    enemy1 = new Enemy();
}
if (enemy2 == NULL && elapsedTime > 30) {
    enemy2 = new Enemy();
}

よりスケーラブルなアプローチとして、スポーン時間のリンク リストを作成し、敵をスポーンするときにリスト ポインターを進めることができます。そうすれば、フレームごとに 1 回 (現在のリスト ノードのスポーン時間) と比較するだけで済みます。

補遺: 浮動小数点数のコンテキストで == を使用することはめったに良い考えではありません。詳細については、 http: //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html を参照してください。

于 2013-01-15T07:40:50.390 に答える
1

ゲームで使用する便利なソリューションがあります。実際に Timer クラスを作成しました。

public class Timer
{
    protected float remaining;
    protected float interval;

    public Timer(float interval)
    {
        this.interval = interval;
        this.remaining = interval;
    }

    public boolean hasTimeElapsed() { return (remaining < 0.0F); }

    public void reset() { remaining = interval; }

    public void reset(float interval) {
        this.interval = interval;
        this.remaining = interval;
    }

    public void update(float delta) { remaining -= delta; }
}

Timer を特定の期間に初期化し、update(delta) メソッドですべての Timer に対して Timer.update(delta) を呼び出し、Timer.hasTimeElapsed() を呼び出して経過したタイマーがあるかどうかを確認します。

あなたの場合、敵は順番にスポーンされるため、Timer オブジェクトは 1 つだけ必要です。敵をスポーンしたら、タイマーをリセットし (必要に応じてスポーン期間を変更します)、タイマーが再び作動するのを待ちます。

また、Timer オブジェクトを変更して、タイマーがオフになったときにコールバックをトリガーするために、サブジェクト-オブザーバー パターンを使用することもできます。これは、時限イベントがいつ発生するかを知る必要があるロジックがあるが、ロジックがデルタ時間に直接アクセスできない場合に役立ちます。

于 2013-02-17T01:04:38.160 に答える
0

なぜインクリメントtしてから、値に基づいて敵をスポーンするのですかt。こんな風にやってみませんか?

final float step = 0.1f;
float timeElapsed = 0f;

update (float delta) {
    timeElapsed += delta;
    while (timeElapsed > step){
         timeElapsed-=step;
         createEnemy();
    }
}

このアプローチでは、ゲームが遅れてデルタが発生した場合、たとえば0.5fで、ステップが0.1の場合、5人の敵を作成します。あなたがこの行動を望んでいるかどうかはわかりません

于 2013-01-15T08:46:13.730 に答える