2012-05-07 166 views
1

我正在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; 
} 

任何人都可以給我一點幫助,使每個敵人產卵與它和最後一個之間的延遲?

+0

一個簡單的延遲方法是'Thread.Sleep(int milliseconds)',但是在XNA上下文中可能更適合。 – phg

+2

你可能不想睡覺遊戲線程,phg;) – Joey

回答

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

定義了3個第一個「int」,如果它在一個函數內,它就是靜態的。 –

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

好得多,你可能還想讓坦克之間的間隔看起來更隨機。

+0

Xna提供了一個循環遊戲,爲您提供幀間流逝的時間...此解決方案可以,但對於此場景並不理想 – Blau