2013-06-22 3 views
3

У меня есть игра творю: http://www.taffatech.com/DarkOrbit.htmlCanvas увеличение игры враги нерест

То, что я хочу быть в состоянии сделать это, когда я убить определенное количество врагов будет уровень вверх. Эта часть работает, однако я также хочу, чтобы количество икры увеличилось, когда вы повышаете уровень.

В моей функции петли:

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

    } 

} 

Мой INIT:

function init() 
{ 

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

} 

Я попытался добавить: spawnEnemy (spawnAmount); после того, как я изменил значение порога global var в функции updateLevel, но поскольку это получило название каждого кадра, он заставляет меня сотнями врагов. Как я могу решить эту проблему?

Если я пытаюсь что-то вроде этого сотни врагов являются genrated, я предполагаю, потому что она вызывается каждый кадр:

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

введите код, на который вы предлагаете spawnEnemy() plz – Stephan

+0

Я вызываю его в своем init, то, что я пробовал делать, заключалось в вызове метода spawnEnemy после того, как я установил spawnAmount при повышении уровня, но это просто вызывает как его в цикле. Я не могу понять, как это сделать. –

ответ

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 переменную, как вы считаете нужным.

+0

Эффективно дроссель для скорости икры. – donfede

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-файлов, которые отвечают за разные части вашего приложения.

+0

С номером 2, как бы удалить его из массива врагов? что-то вроде enemy.remove (это); –

+0

'enemy.splice (enemy.indexOf (this), 1);' –