Клавишный ввод не работает, пока не нажата клавиша Enter

Я делаю Java-игру, и всякий раз, когда я ее запускаю, ни одна из клавиш не работает, пока я не нажму клавишу ввода. Вот ключевой код ввода:

if(KeyInput.currentKey(KeyInput.W)) player.setUp();
if(KeyInput.currentKey(KeyInput.A)) player.setLeft();
if(KeyInput.currentKey(KeyInput.S)) player.setDown();
if(KeyInput.currentKey(KeyInput.D)) player.setRight();
if(KeyInput.currentKey(KeyInput.UP)) player.setDirection(0);
if(KeyInput.currentKey(KeyInput.RIGHT)) player.setDirection(1);
if(KeyInput.currentKey(KeyInput.DOWN)) player.setDirection(2);
if(KeyInput.currentKey(KeyInput.LEFT)) player.setDirection(3);
if(KeyInput.currentKey(KeyInput.ENTER)) player.setPunching();

У меня есть класс с именем KeyInput, и метод currentKey просто проверяет, есть ли нажатая клавиша, и если есть, он проверяет, является ли клавиша в параметрах текущей. Вот этот код:

public class KeyInput {

public static final int NUM_KEYS = 11;

public static boolean keyState[] = new boolean[NUM_KEYS];
public static boolean prevKeyState[] = new boolean[NUM_KEYS];

public static int W = 0;
public static int A = 1;
public static int S = 2;
public static int D = 3;
public static int ENTER = 4;
public static int UP = 5;
public static int LEFT = 6;
public static int DOWN = 7;
public static int RIGHT = 8;
public static int ESCAPE = 9;
public static int SHIFT = 10;

public static void setKey(int i, boolean b) {
    if(i == KeyEvent.VK_W) keyState[W] = b;
    else if(i == KeyEvent.VK_A) keyState[A] = b;
    else if(i == KeyEvent.VK_S) keyState[S] = b;
    else if(i == KeyEvent.VK_D) keyState[D] = b;
    else if(i == KeyEvent.VK_ENTER) keyState[ENTER] = b;
    else if(i == KeyEvent.VK_UP) keyState[UP] = b;
    else if(i == KeyEvent.VK_LEFT) keyState[LEFT] = b;
    else if(i == KeyEvent.VK_DOWN) keyState[DOWN] = b;
    else if(i == KeyEvent.VK_RIGHT) keyState[RIGHT] = b;
    else if(i == KeyEvent.VK_ESCAPE) keyState[ESCAPE] = b;
    else if(i == KeyEvent.VK_SHIFT) keyState[SHIFT] = b;
}

public static void update() {
    for(int i = 0; i < NUM_KEYS; i++) {
        prevKeyState[i] = keyState[i];
    }
}

public static boolean currentKey(int i) {
    return keyState[i];
}

}

Этот метод setKey вызывается в классе Main:

public void keyTyped(KeyEvent key) {}
public void keyPressed(KeyEvent key) {
    KeyInput.setKey(key.getKeyCode(), true);
}
public void keyReleased(KeyEvent key) {
    KeyInput.setKey(key.getKeyCode(), false);
}

Я не знаю, почему это происходит, и я не знаю, сможете ли вы, ребята, помочь, не зная всего о том, как моя игра была запрограммирована. Заранее спасибо! :)


person sparklyllama    schedule 24.01.2014    source источник
comment
Вы не показали самую интересную часть кода. Типа, Док, вот фото моего пса два года назад, но он сейчас болеет, можешь сказать, что с ним не так?   -  person Amadan    schedule 24.01.2014
comment
Как у вас дела с вводом? Это программа с графическим интерфейсом? Или вы пытаетесь ввести данные в окно командной строки или оболочку Unix? На какой ОС вы работаете?   -  person ajb    schedule 24.01.2014
comment
Так как же выглядит KeyInput?   -  person nico_c    schedule 24.01.2014
comment
@ajb Это программа с графическим интерфейсом для Mac OSX.   -  person sparklyllama    schedule 24.01.2014


Ответы (1)


imho ваш код не содержит достаточно информации для решения проблемы.

Проверьте точку/объект, который вы инициализируете KeyListener. может быть, он вызывается в первый раз при действии, связанном с клавишей Enter?

edit: вы должны добавить keyListener на свою панель. вы не можете обрабатывать Listener как обычные классы, это особый вид классов, называемый интерфейсом, это как расширение для обычного класса. Добавьте интерфейс KeyListener на игровую панель, и он будет наблюдать за панелью для действий, связанных с клавиатурой.

вы можете найти пример, связанный с игрой, здесь: http://www.edu4java.com/en/game/game4.html

это должно выглядеть примерно так:

JPanel gamePanel = new JPanel();
gamePanel.addKeyListener(new KeyListener(){

    @Override
    public void keyPressed(KeyEvent arg0) {
        if(arg0.getExtendedKeyCode() == KeyEvent.VK_ENTER) player.setPunching();
        //and so on
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent arg0) {

    }

});
person Prunkton    schedule 24.01.2014
comment
Я не думал, что люди смогут это решить... ну ладно, я сам посмотрю на это поближе. Спасибо, в любом случае! :) - person sparklyllama; 24.01.2014