3

我正在制作一个游戏: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 函数中的生成量全局变量之后,但是由于每帧都会调用它,它会使数百个敌人飞向我。我怎么解决这个问题?

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

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

2 回答 2

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变量。

于 2013-06-22T05:27:15.653 回答
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()

通常,您应该更好地结构化您的代码。至少,将其拆分为几个负责应用程序不同部分的 js 文件。

于 2013-06-22T06:04:16.257 回答