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;
        }

这个产生但不动我玩过更新和绘制方法,但似乎没有任何效果

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

此外,您应该将新敌人添加到列表中。

因此,在您的更新方法中,您可以执行以下操作:

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 回答
1

您需要将此问题分解为以下步骤:

您需要一些全局变量来表示计时器并表示等待的时间量,例如

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

接下来在您的更新中,您需要增加自上次更新以来经过的时间。您似乎正在使用多个计时器,并使其比您需要的更尴尬。如果您需要为多件事计时,您应该只需要多个计时器。

spawnTimer += gameTime.ElapsedGameTime.TotalSeconds;

接下来,当经过的时间大于等待所需的时间时。生成一个敌人,然后将计时器重置为零。

如果您想一次生成多个敌人,请添加一个 for 循环,其条件是在迭代器小于要生成的敌人数量时循环。

我故意没有给你最后两个区域,概述的步骤应该相对简单。完成此操作后,您的其余代码应该可以工作。

如果这不起作用,请调试您的代码并检查 spawnEnemy 是否被成功调用。

于 2013-04-19T12:37:35.017 回答