Игры Java2D: как правильно обращаться с клавиатурой?

Я нашел очень хороший учебник о том, как создавать игры с помощью Java2D. В этом уроке есть раздел «Движение спрайтов», в котором показано, как перемещать маленькое изображение космического корабля на экране. Я играл с крафтом и понял, что иногда он "блокируется" на экране. После некоторых тестов и размышлений над проблемой я обнаружил, что проблема блокировки возникает из-за того, что при использовании стрелок на клавиатуре иногда вы нажимаете, например, влево и вправо одновременно, и это блокирует движение.

Итак, мой вопрос: как мне обработать такое событие клавиатуры - когда вы нажимаете кнопку ВЛЕВО, продолжайте нажимать ее, а затем нажмите кнопку ВПРАВО - чтобы движение персонажа не блокировалось?

Я думаю, что это очень часто случается, потому что, когда вы играете, вы переключаетесь слева направо, но на мгновение вы нажимаете влево и вправо одновременно.


person ceklock    schedule 05.05.2012    source источник


Ответы (1)


Вы можете сделать это несколькими способами. Один из способов — использовать логические значения в вашей программе.

Вы можете установить логические значения в true, когда вы нажимаете определенную клавишу, и в false, когда вы их отпускаете. то есть:

int x,xSpeed;

boolean movingLeft  = false;
boolean movingRight = false;

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if(key == KeyEvent.VK_LEFT){
        movingLeft = true;
    }
    if(key == KeyEvent.VK_RIGHT){
        movingRight = true;
    } 
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    if(key == KeyEvent.VK_LEFT){
        movingLeft = false;
    }
    if(key == KeyEvent.VK_RIGHT){
        movingRight = false;
    } 
}

public void moving(){
    if(movingLeft){
        x -= xSpeed;
    }
    if(movingRight){
        x += xSpeed;
    }
}

Хорошо, давайте посмотрим на этот код. Потому что мы используем «иначе, если» вы либо двигаетесь вправо, либо двигаетесь влево. Я не тестировал этот код, поэтому не совсем уверен, что это сработает :)

Дайте мне знать, что вы думаете, и удачи!

person Byron Voorbach    schedule 05.05.2012