1

C# と XNA で Windows Phone 用の 2D 横スクロール (ちょっと) ゲームを作成しています。

スプライトが動いているように見えるキャラクター アニメーションがありますが、動いているのは背景と敵だけです。敵のテクスチャを読み込んでいて、画面上の位置が固定されているので問題ありません。しかし、私の問題は、これらの敵をランダムな間隔で生成したいということです。乱数ジェネレーター、int、およびいくつかの TimeSpan 変数をセットアップしました。

UpdateEnemies メソッドに配置したコードを次に示します。

:アップデートでは、私は呼んでいますUpdateEnemies(gameTime);

random = new Random();
spawnSeconds = random.Next(1, 6);
enemySpawnTime = TimeSpan.FromSeconds(spawnSeconds); 
if (gameTime.TotalGameTime - previousSpawnTime > enemySpawnTime)
{
    previousSpawnTime = gameTime.TotalGameTime;
    // Add an Enemy
    AddEnemy();
}

敵のスポーンはランダムではないため、ここで問題が発生しています。それらは、その特定の実行に対して同じ間隔で生成されます。

私はブレークポイントを使用しており、毎回正常spawnSecondsenemySpawnTime更新されていますが、それでもこの問題は発生します。

どんな助けでも大歓迎です。

4

2 に答える 2

2

ランダム = 新しいランダム ();

update 関数を呼び出すたびに、Random の新しいインスタンスを作成しています。これを行うと、ランダム関数は同じシードに基づいているため、同じ値を生成します。

Update 関数の外部で、おそらくコンストラクターで Random オブジェクトをインスタンス化します。これを行うと、コードが改善され、問題が修正されます。

于 2012-04-23T14:58:39.073 に答える
2

UpdateEnemies がすべての Update() で呼び出されると仮定すると、すべての Update() で energySpawnTime が変更されますが、これは意味がありません。敵がスポーンするときのみ変更する必要があります。つまり、次のようになります。

if (gameTime.TotalGameTime - previousSpawnTime > enemySpawnTime)
{
    // Add an Enemy
    AddEnemy();

    // Update the time left next enemy spawn
    previousSpawnTime = gameTime.TotalGameTime;
    var spawnSeconds = random.Next(1, 6); // random should be a member of the class
    enemySpawnTime = TimeSpan.FromSeconds(spawnSeconds); 
}

前述のように、たとえば Initialize() で Random() オブジェクトを 1 回だけ作成し、それをクラスのメンバーにします。

于 2012-04-23T16:48:53.557 に答える