【问题标题】:XNA Simple way to spawn enemysXNA 生成敌人的简单方法
【发布时间】:2013-04-11 22:55:24
【问题描述】:

我正在尝试从列表中生成敌人。我已经尝试了多种方法。然而我不能 让它工作。有没有一种简单的方法可以每 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);
            }
        }

【问题讨论】:

  • “我不知道该怎么做”不是问题。你都尝试了些什么?为什么没有成功?
  • 我试过这个,当它返回true时,绘制。 @ColeCampbell spawnTime-(float)gameTime.ElapsedGameTime.TotalSeconds; if (timer &lt; 0) { foreach (Enemy needele in needleList) { spawnN = !spawnN; needele.Update(gameTime); spawnTime = TIMER; } }
  • 你贴的代码是什么,你试过多种方法?发布您尝试过的内容并给我们一些详细信息!
  • 我试过了^^^^。 @Cyral

标签: timer xna spawning


【解决方案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 是否被成功调用。

【讨论】:

    【解决方案2】:

    您还应该将新敌人添加到列表中。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      相关资源
      最近更新 更多