2012-05-07 1 views
1

Je travaille sur un jeu de défense de tour dans XNA, et j'ai une classe appelée Tank qui crée un ennemi qui suit un itinéraire autour d'une carte trouvée via A *. En ce moment, je peux créer plusieurs instances de Tank, mais elles apparaissent toutes en même temps. Cela signifie qu'ils sont exactement au même endroit qu'ils suivent la route, ce qui donne l'impression qu'il n'y a qu'un seul ennemi.Temps de réapparition entre ennemis

Voici mon code pour le chargement d'une nouvelle vague:

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

Quelqu'un pourrait-il me donner un peu d'aide faire chaque spawn ennemi avec un retard entre elle et le dernier?

+0

Un moyen facile de retarder est Thread.Sleep (int millisecondes), mais il pourrait y avoir quelque chose de plus approprié dans un contexte XNA. – phg

+2

Vous ne voulez probablement pas dormir le fil du jeu, phg;) – Joey

Répondre

1

Vous avez besoin d'un taux de création de spawn basé dans le temps, quelque chose de similaire à ce ...

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

je le ferais comme ça:

//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

définissez les 3 premiers 'int' comme statique si c'est dans une fonction. –

0

ne suis pas sûr particulary XNA, mais si vous devez exécuter des actions répétitives avec intervalle, vous pouvez utiliser quelque chose comme ça:

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

Ce code sera utiliser les threads de la manière la plus efficace. Il est beaucoup mieux que Thread.Sleep()

Vous pouvez également faire l'intervalle entre le réservoir semble plus aléatoire.

+0

Xna fournit un jeu en boucle qui vous donne le temps écoulé entre les images ... cette solution est correcte mais n'est pas idéale pour ce scénario – Blau