1

リストから敵をスポーンしようとしています。私はそうするために複数の方法を試しました。しかし、私はそれを機能させることができません。3秒ごとに敵をスポーンする簡単な方法はありますか? 編集

私はこのようにそれを生成しようとしました:問題:一度しか生成されません

    protected void AdjustSpawnTimes(GameTime gameTime)
    {
        // If the spawn maximum time is > 500 milliseconds,
        // decrease the spawn time if it's time to do so
        // based on spawn-timer variables
        if (enemySpawnMaxMilliseconds > 500)
        {
            timeSinceLastSpawnTimeChange += gameTime.ElapsedGameTime.Milliseconds;
            if (timeSinceLastSpawnTimeChange > nextSpawnTimeChange)
            {
                timeSinceLastSpawnTimeChange -= nextSpawnTimeChange;
                if (enemySpawnMaxMilliseconds > 1000)
                {
                    enemySpawnMaxMilliseconds -= 100;
                    enemySpawnMinMilliseconds -= 100;
                }
                else
                {
                    enemySpawnMaxMilliseconds -= 10;
                    enemySpawnMinMilliseconds -= 10;
                }
            }
        }
    }

そしてこのように:問題:再び一度スポーンする

private void SpawnEnemy()
    {
        Vector2 speed = Vector2.Zero;
        Vector2 position = Vector2.Zero;

        // Default frame size
        Point frameSize = new Point(75, 75);

        int screenWidth = GraphicsDevice.PresentationParameters.BackBufferWidth;
        int screenHeight = GraphicsDevice.PresentationParameters.BackBufferHeight;

        // Randomization:
        // - Randomly choose which side of the screen to place the enemy
        // - Randomly create a position along that side of the screen
        // - Randomly choose a speed for the enemy
        switch (rand.Next(4))
        {
            case 0: // Left to right
                position = new Vector2(-frameSize.X,
                                       (rand.Next(0, screenHeight - frameSize.Y)));
                speed = new Vector2(rand.Next(needleMinV, needleMaxV),
                                    0);
                break;

            case 1: // Right to left
                position = new Vector2(screenWidth,
                                       (rand.Next(0, screenHeight - frameSize.Y)));
                speed = -new Vector2(rand.Next(needleMinV, needleMaxV),
                                    0);
                break;

            case 2: // Bottom to top
                position = new Vector2(rand.Next(0, screenWidth - frameSize.X),
                                       screenHeight);
                speed = -new Vector2(0,
                                    (rand.Next(needleMinV, needleMaxV)));
                break;

            case 3: // Top to bottom
                position = new Vector2(rand.Next(0, screenWidth - frameSize.X),
                                       -frameSize.Y);
                speed = new Vector2(0,
                                   rand.Next(needleMinV, needleMaxV));
                break;
        }

これはスポーンしますが、update と draw メソッドをいじって動かしませんが、何も機能しないようです

List<Enemy> needleList = new List<Enemy>();
    Texture2D needle;
    float spawnTime = 10;
    const float TIMER = 10;
    bool spawnN = true;

更新中:

    timer = (float)gameTime.TotalGameTime.TotalSeconds;

        spawnTime -= (float)gameTime.ElapsedGameTime.TotalSeconds;
        if (timer < 0)
        {
            foreach (Enemy needele in needleList)
            {
                spawnN = !spawnN;
                needele.Update(gameTime);
                spawnTime = TIMER;
            }

ドロー中:

    if (spawnN)
        {
            foreach (Enemy needele in needleList)
            {
                needele.Draw(gameTime, spriteBatch);
            }
        }
4

2 に答える 2

1

この問題をいくつかのステップに分割する必要があります。

タイマーを表し、待機する時間を表すには、いくつかのグローバル変数が必要です。

float spawnTimer;
const float TIME_TO_WAIT = 3.0f; // don't make const if you need to change.

次の更新では、最後の更新から経過した時間をインクリメントする必要があります。複数のタイマーを使用しているようで、必要以上にぎこちなくしています。複数のタイマーが必要な場合にのみ、複数のタイマーが必要です。

spawnTimer += gameTime.ElapsedGameTime.TotalSeconds;

次に、経過時間が待機に必要な時間よりも長い場合。敵をスポーンし、タイマーをゼロにリセットします。

一度に複数の敵をスポーンしたい場合は、イテレータがスポーンする敵の数よりも少ない間ループするという条件で for ループを追加します。

最後の 2 つの領域については意図的に説明していませんが、概説されている手順は比較的簡単です。これが完了すると、コードの残りの部分が機能するはずです。

これが機能しない場合は、コードをデバッグして、spawnEnemy が正常に呼び出されたかどうかを確認してください。

于 2013-04-19T12:37:35.017 に答える
1

また、新しい敵をリストに追加する必要があります。

したがって、 update メソッドでは、次のようなことを行います。

timeToSpawn += gameTime.ElapsedGameTime.Milliseconds; //adds the time since last update
if (timeToSpawn > 3000)
{
    enemyList.Add new Enemy(); //adds a new enemy to the list
    timeToSpawn -= 3000; subtract 3000ms off the timer.
}
foreach (Enemy e in enemyList)
{
    //Do stuff like updating enemy positions
    e.Update();
}
//In your draw method you do this as well:
foreach (Enemy e in enemyList)
{
    //Do stuff like updating enemy positions
    e.Draw();
}
于 2013-04-21T13:11:20.077 に答える