Как мне обрабатывать одновременные нажатия клавиш в Java?
Как мне обрабатывать одновременные нажатия клавиш в Java?
Я пытаюсь написать игру, и мне нужно обрабатывать нажатия нескольких клавиш одновременно.
Когда я держу клавишу (скажем, чтобы двигаться вперед), а затем я держу другую клавишу (например, чтобы повернуть налево), новая клавиша обнаруживается, но старая нажатая клавиша больше не обнаруживается.
4 ответа
Один из способов - следить за тем, какие клавиши в данный момент не работают.
Когда вы получите событие keyPressed, добавьте новый ключ в список; когда вы получите событие keyReleased, удалите ключ из списка.
Затем в игровом цикле вы можете выполнять действия в зависимости от того, что находится в списке ключей.
Вот пример кода, иллюстрирующий, как выполнить действие при нажатии CTRL+Z:
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
class p4 extends Frame implements KeyListener
{
int i=17;
int j=90;
boolean s1=false;
boolean s2=false;
public p4()
{
Frame f=new Frame("Pad");
f.setSize(400,400);
f.setLayout(null);
Label l=new Label();
l.setBounds(34,34,88,88);
f.add(l);
f.setVisible(true);
f.addKeyListener(this);
}
public static void main(String arg[]){
new p4();
}
public void keyReleased(KeyEvent e) {
//System.out.println("re"+e.getKeyChar());
if(i==e.getKeyCode())
{
s1=false;
}
if(j==e.getKeyCode())
{
s2=false;
}
}
public void keyTyped(KeyEvent e) {
//System.out.println("Ty");
}
/** Handle the key pressed event from the text field. */
public void keyPressed(KeyEvent e) {
System.out.println("pre"+e.getKeyCode());
if(i==e.getKeyCode())
{
s1=true;
}
if(j==e.getKeyCode())
{
s2=true;
}
if(s1==true && s2==true)
{
System.out.println("EXIT NOW");
System.exit(0);
}
}
/** Handle the key released event from the text field. */
}
Вообще говоря, то, что вы описываете, может быть достигнуто с помощью битовых масок.
О, у меня тоже была такая проблема!
Я попытался сделать простую игру в понг, следуя найденному учебнику.
Но в большинстве случаев, если я удерживал одну кнопку и нажимал другую, новое нажатие клавиши, казалось, регистрировалось, в то время как предыдущее, казалось, переставало регистрироваться, даже если я все еще удерживал клавишу нажатой.
Я подумал, что это, возможно, ограничение функции KeyListener, поэтому я попытался переписать свою программу, чтобы вместо этого использовать привязки клавиш.
Но, во всяком случае, это сделало все еще хуже.
Итак, я понял, что проблема была в учебнике, которому я следовал. То, как он обработал логику после прослушивания ключей.
Поэтому, если вы сталкиваетесь с подобными проблемами, я бы порекомендовал вам устранить неполадки в коде, с которым вы работаете!
Также обратите внимание, что поведение клавиш, по-видимому, может различаться в зависимости от вашей операционной системы.
Таким образом, в Windows при нажатии клавиши она будет повторяться, как вы знаете, в текстовом редакторе. Таким образом, когда клавиша нажата, она фактически будет вызываться повторно, а затем, когда вы ее отпустите, она даст вам одно событие освобождения.
Так что имейте это в виду!
Также стоит отметить, что разные клавиатуры будут иметь разные ограничения на количество клавиш, которые вы можете нажимать одновременно, и это число обычно также будет отличаться в зависимости от того, какая именно комбинация клавиш нажимается.