(Программирование игры) Как добавить задержку между атаками?

Я делаю игру, в которой вы управляете своим персонажем с помощью клавиш со стрелками и атакуете с помощью «А». Моя проблема в том, что у атаки нет задержки, поэтому, когда я удерживаю «А», здоровье врага быстро истощается. Как добавить задержку? Я попытался добавить задержку, вот мой код:

var DELAY = 2;
var cooldown = 0;

function update(time) {

// UP
if (38 in keysDown) { 
    player.y -= player.speed * time;
}
// DOWN
if (40 in keysDown) { 
    player.y += player.speed * time;
}
// LEFT
if (37 in keysDown) {
    player.x -= player.speed * time;
}
// RIGHT
if (39 in keysDown) { 
    player.x += player.speed * time;
}

// 'A'
if(65 in keysDown) {
    player.attacking = true;
    cooldown -= time;
}
else
    player.attacking = false;

// Collision
if( (player.x + pImage.width-5) >= monster.x && 
    (player.x + pImage.width-5) < monster.x + enImage.width &&
    player.y >= monster.y && player.y < (monster.y + enImage.height) &&
    player.attacking) 
    {
        if(cooldown <= 0) {
            monster.hp -= player.dmg;
            cooldown = DELAY;
        }

        if(monster.hp <= 0) {
            relocEn();
        }
    }

}

Проблема в том, что время восстановления считается только тогда, когда я держу «А», и сбрасывается только тогда, когда игрок касается монстра. Я хочу что-то вроде того, когда я нажимаю «A», таймер перезарядки отключается. Кроме того, я хочу, чтобы спрайт (в атакующем состоянии) согласился с задержкой и вернулся в «стоящее» состояние. заранее спасибо


person Zik    schedule 12.01.2013    source источник


Ответы (2)


Вот что я бы сделал:

Я бы создал переменную для времени последней атаки и перенес весь ваш код, относящийся к атаке, в другую функцию. Я предполагаю, что время измеряется в миллисекундах, поэтому вы, вероятно, захотите, чтобы ваша задержка исчислялась сотнями.

var DELAY = 400; //Change this to a higher value if it's not long enough.
var timeSinceLastAttack = -400; // The opposite of the DELAY if you want to attack at the start. 

function update(time) {

...

// 'A'
if(65 in keysDown 
    && time > (timeSinceLastAttack + DELAY) ) {
    player.attack();
    timeSinceLastAttack = time;
} 

Затем в вашей функции Attack() вы можете выполнить обнаружение столкновений.

person Tom Grasman    schedule 16.01.2013
comment
Мне удалось заставить это работать, я поставил «A» в событие нажатия клавиши вместо нажатия клавиши. :) - person Zik; 18.01.2013
comment
Просто из любопытства, когда у вас были keysDown, вы могли атаковать каждый раз, когда нажимали клавишу «A»? - person Tom Grasman; 18.01.2013

Хорошо,

1- Попробуйте назначить большее значение для ЗАДЕРЖКИ

2- Распечатайте значение «время», чтобы увидеть, сколько вы добавляете каждый цикл к ЗАДЕРЖКЕ, если это было большое значение — больше 0,00x — разделите его

Еще одна вещь: поместите «перезарядку - = время» вне круглых скобок «A нажата». Нехорошо заставлять пользователя удерживать кнопку A в течение определенного времени каждый раз, когда он хочет выстрелить.

person Ahmed U3    schedule 15.01.2013