1

私は XNA でタワー ディフェンス ゲームに取り組んでおり、A* 経由で見つかったマップの周りのルートをたどる敵を作成する Tank というクラスがあります。現在、Tank の複数のインスタンスを作成できますが、それらはすべて同時にスポーンします。これは、ルートをたどるとまったく同じ場所にいることを意味し、敵が 1 人しかいないように見えます。

新しいウェーブをロードするための私のコードは次のとおりです。

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

各敵のスポーンを、最後の敵のスポーンとの間に遅延させて作成するのを手伝ってくれる人はいますか?

4

3 に答える 3

2

これに似た、時間に基づくスポーン作成率が必要です...

   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
         }
      }
    }
于 2012-05-07T11:16:28.897 に答える
0

私はそのようにします:

//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;
            }
        }
于 2012-05-07T11:29:42.580 に答える
0

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

タンクの表示間隔をよりランダムにすることもできます。

于 2012-05-07T11:54:07.707 に答える