【问题标题】:Spawn delay between enemies敌人之间的生成延迟
【发布时间】:2012-05-15 21:27:38
【问题描述】:

我正在 XNA 中开发一款塔防游戏,我有一个名为 Tank 的类,它创建一个敌人,该敌人沿着通过 A* 找到的地图的路线前进。 现在,我可以创建多个 Tank 实例,但它们都是同时生成的。这意味着他们在沿着路线走的时候完全在同一个地方,看起来好像只有一个敌人。

这是我加载新浪潮的代码:

if (spawn == true)
{
    maxTanks += 2;
    killsInWave += 2;

    tanks = new Tank[maxTanks];
    for (int i = 0; i < maxTanks; i++)
    {
        tanks[i] = new Tank();
        tanks[i].Initialize(map);
        tanks[i].LoadContent(Content);                                  
    }
    waveNum += 1;
    spawn = false;
}

谁能给我一点帮助,让每个敌人在它和最后一个之间产生延迟?

【问题讨论】:

  • 一个简单的延迟方法是Thread.Sleep(int milliseconds),但在 XNA 上下文中可能会有更合适的方法。
  • 你可能不想让游戏线程休眠,phg ;)

标签: c# xna delay spawning


【解决方案1】:

您需要一个基于时间的生成率,类似于此...

   SpawnUnitsCount = n;
   Units_Per_Second = 5; // 5 Per second

   void Update(float ElapsedSeconds)  // (float) gametime.ElapsedTime.TotalSeconds
   {      
    if (SpawnUnitCount>0)
    {
      CreationRate += Units_per_second * ElapsedSeconds;
      while ( CreationRate >= 1 )
      {
         CreationRate--;
         MakeNewUnit(); 
         SpawnUnitsCount --;
         if (SpawnUnitCount == 0)
         {
            CreationRate = 0; // The wave is finished
         }
      }
    }

【讨论】:

    【解决方案2】:

    我会这样做:

    //need to be defined in your loop
    int nextTankToCreate(0);
    int iterationCount(0);
    int CreateTime(500); //create every 500 iteration
    
    iterationCount++;
    if (spawn == true && iterationCount >= createTime)
            {
                iterationCount = 0;
                maxTanks += 2;
                killsInWave += 2;
    
                tanks = new Tank[maxTanks];
                tanks[nextTankToCreate] = new Tank();
                tanks[nextTankToCreate].Initialize(map);
                tanks[nextTankToCreate].LoadContent(Content);                                  
                nextTankToCreate++;
    
                if (nextTankToCreate == maxTanks)
                {
                    nextTankToCreate = 0;
                    waveNum += 1;
                    spawn = false;
                }
            }
    

    【讨论】:

    • 将前 3 个ints 定义为静态(如果它在函数内)。
    【解决方案3】:

    不确定 XNA 的具体情况,但如果您需要执行一些有间隔的重复操作,您可以使用类似的东西:

            Action addTank = null;
            int interval = 1000; // 1000 milliseconds
            int requiredNumberOfTanks = 10;
            int tanksCreated = 0;
    
            var timer = new Timer(o => addTank());
            addTank = () =>
                             {
                                 CreateTankMethod();  // your method to create tank
                                 tanksCreated = tanksCreated + 1;
                                 if (tanksCreated < requiredNumberOfTanks)
                                     timer.Change(interval, 0);
                             };
            timer.Change(interval, 0);
    

    此代码将以最有效的方式利用线程。比Thread.Sleep()好多了

    您可能还想让坦克之间的间隔显得更加随机。

    【讨论】:

    • Xna 提供了一个循环游戏,为您提供帧之间经过的时间......这个解决方案还可以,但不适合这种情况
    猜你喜欢
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多