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メソッドを呼び出します)。この単一の敵は 1 回だけスポーンされます。spawnEnemy関数はinitメソッド内で引数のみで呼び出されます1

敵のスポーン アルゴリズムを作り直す必要があります。以下は、敵のスポーン率を増加させるかなり良いサンプルです:

  1. number関数から引数を削除spawnEnemy: 敵を 1 体だけスポーンする

  2. 関数をからEnemy.prototype.recycleEnemy削除するように変更します。注意: ループ内でこの関数を呼び出す場合は、カウンターを減らして、次の敵をスキップしないようにする必要があります。thisenemiesenemies--i

  3. を追加しますfunction getSpawnCooldown() { return 100 / spawnAmount; }(100 はおおよその定数です。これを変化させて初期スポーン率を変更できます)

  4. time最初から有効な呼び出しの数を意味する変数を追加しますLoop。デフォルトは 0 です

  5. 変数を追加し、lastSpawnTime0 に設定します

  6. if関数のブロック内に、次のLoop行を追加します。

    1. ++time

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

  7. spawnEnemy関数に、次の行を追加します。lastSpawnTime += getSpawnCooldown()

一般に、コードをより適切に構造化する必要があります。少なくとも、アプリケーションのさまざまな部分を担当するいくつかの js ファイルに分割してください。

于 2013-06-22T06:04:16.257 に答える