帆布游戏增加敌人产卵

时间:2013-06-22 05:16:14

标签: javascript jquery html5 canvas

我正在制作一款游戏:http://www.taffatech.com/DarkOrbit.html

我想要做的是当我杀死一定数量的敌人时它会升级。这部分是有效的,但是当你升级时我也希望生成量增加。

在我的循环函数中:

function Loop()
{
if (isPlaying == true)
{
updateLevel(); //this updates the level but it calls it every frame which might be bad.
Player1.draw();
drawAllEnemies();
updateStats();
requestAnimFrame(Loop);
}

更新级别功能:

function updateLevel()
{

  if(Player1.enemiesKilled <3)
  {

   level = 1;



  }

  else if(Player1.enemiesKilled > 3 && Player1.enemiesKilled <= 9)
  {
   level = 2;


  }
   else if(Player1.enemiesKilled > 9 && Player1.enemiesKilled <=18)
  {
   level = 3;

  }
    else if(Player1.enemiesKilled > 18 && Player1.enemiesKilled <= 38)
  {
   level = 4;

  }
     else if(Player1.enemiesKilled > 38 && Player1.enemiesKilled <= 70)
  {
   level = 5;
   s
  }

  else if (Player1.enemiesKilled > 120)
  {
  level = 6;

  }



  if(level == 1)
  {
    spawnAmount = 1;



  }

  else if(level == 2)
  {
    spawnAmount = 2;



  }

  else if(level == 3)
  {
    spawnAmount = 3;


  }

   else if(level == 4)
  {
    spawnAmount = 4;

  }

   else if(level == 5)
  {
    spawnAmount = 5;

  }

   else if(level == 6)
  {
    spawnAmount = 6;

  }




}

产生敌人的功能:

function spawnEnemy(number) //total enemies starts at 0 and every-time you add to array
{
  for (var x = 0; x < number; x++)
   {

     enemies[enemies.length] = new Enemy();

   }

}

我的初学者:

function init()
{

spawnEnemy(spawnAmount);
drawMenu();
sndIntro.play();
document.addEventListener('click', mouseClicked ,false);

}

我尝试添加:spawnEnemy(spawnAmount);在更改updateLevel函数中的spawn amount global var之后,但是每次调用它都会让数百个敌人飞向我。我该如何解决这个问题?

如果我尝试这样的事情就会产生数百个敌人,我会假设因为每个帧都会被调用:

if(level == 1)
  {
    spawnAmount = 1;
  spawnEnemy(spawnAmount);
}

2 个答案:

答案 0 :(得分:1)

如果您的目的是提高每个级别的生成率,我建议您先从spawnRate开始。让spawnRate代表敌人产卵之间的游戏更新次数。每当敌人产生时,减少另一个变量(比如spawnRateCountdown),直到该变量达到0,然后产生一个敌人。将变量重置为spawnRate。冲洗并重复。

spawnRate = 60; /* one enemy every 60 updates. */
spawnRateCountdown = spawnRate;
function updateLoop() {
    spawnRateCountdown--;
    if (spawnRateCountdown == 0) {
        spawnRateCountdown = spawnRate;
        spawnEnemy();
    }
}

之后,您可以根据需要更新spawnRate变量。

答案 1 :(得分:0)

问题在于你不时不会创造新的敌人,而只是在爆炸时将同一个敌人转移得更远(即调用recycleEnemy方法)。这个单个敌人只产生一次:spawnEnemy函数仅在init方法中使用参数1调用。

你应该重做敌人的产卵算法。下面是一个非常好的样本,它会增加敌人的产卵率:

  1. number函数中删除spawnEnemy参数:只生成一个敌人

  2. 更改Enemy.prototype.recycleEnemy功能,从this删除enemies。要小心:如果你在enemies的循环中调用此函数,你需要减少计数器,以确保你不会跳过下一个敌人:--i

  3. 添加function getSpawnCooldown() { return 100 / spawnAmount; }(100是近似常数,您可以对其进行变量以更改初始产卵率)

  4. 添加变量time,表示从头开始有效Loop次调用的次数,默认为0

  5. 添加变量lastSpawnTime,将其设置为0

  6. if函数的Loop块内,添加行:

    1. ++time

    2. if (time >= lastSpawnTime + getSpawnCooldown()) spawnEnemy();

  7. spawnEnemy函数中添加一行:lastSpawnTime += getSpawnCooldown()

  8. 通常,您应该更好地构建代码。至少,将它拆分为几个js文件,这些文件负责应用程序的不同部分。