2017-01-25 2 views
0

У меня есть игра, в которой вы можете запускать пули, добавляя пули к классу Controller при нажатии клавиши. Вот код от KeyPressed();Добавление задержки между снимками (нажатия клавиш)

else if (key == KeyEvent.VK_Q && !is_shooting) 
    { 
     is_shooting = true; 
     c.addBullet(new Bullet(p.getX(), p.getY(), this)); 
    } 

из KeyRealeased:

 else if (key == KeyEvent.VK_Q) 
    {    
     is_shooting = false; 
    } 

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

+0

'Thread.sleep' не блокирует плеер, но все события очереди, если вы реализуете его непосредственно в методах обработки ключей. В принципе, полный графический интерфейс зависает. – Paul

ответ

1

С таким небольшим контекстом, который будет продолжаться, трудно быть на 100% лучшим решением для вашей непосредственной проблемы.

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

что-то вроде ...

long timeNow = System.currentTimeMillis(); 
long time = timeNow - timeOfLastProjectile; 
if (time < 0 || time > 1000) { 
    timeOfLastProjectile = timeNow; 
    // Trigger associated action 
} 

в качестве примера.

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

Также согласен с Судно на воздушной подушке Full Of Угри, вы бы лучше использования API Key Bindings

+0

Это отлично сработало! – Brandyn

1

Ваш код выглядит, чтобы быть из GUI Swing - вы не говорите, но на самом деле должны, поскольку это ключевая информация, а если не правда, полностью изменит подход. Если это так, то не используйте Thread.sleep, так как если вызов в потоке событий GUI поместит весь графический интерфейс в режим сна, он будет бесполезен. Вместо этого используйте таймер Swing (пожалуйста, уточните Swing Timer Tutorial). Вместо цикла for метод ActinPerformed Timer ActionListener будет вызываться повторно , пока вы не назовете stop() на таймер.

Боковой вопрос: если это графический интерфейс Swing, вам, скорее всего, лучше использовать привязки клавиш, а не KeyListener. Подробнее о том, что здесь: Key Bindings Tutorial

+0

Не оспаривая наш ответ (+1), который, вероятно, является самым простым решением для OP, в прошлом я также подхватил последний «действие» и рассчитал разницу во времени и, если не указано порог прошёл, проигнорировал триггер, но поскольку в этом вопросе так много контекста, трудно понять, какое решение лучше всего подходит;) – MadProgrammer

+0

@MadProgrammer: and .... done! Благодаря! –

+0

Рад, что кому-то нравятся мои ответы;) – MadProgrammer

Смежные вопросы