Нажатие двух клавиш сразу

Рейтинг: 2Ответов: 1Опубликовано: 15.02.2015

Итак, решил я, значит, начать изучение языка Java, изучал себе, изучал, по обучающим роликам создал что-то похожее на змейку (игра). И вот все бы ничего, но при нажатии двух кнопок одновременно происходит ужасное - змейка съедает сама себя. Подскажите, где же ошибка?

Вся суть в том, что мне нужно сделать так, чтобы проверялось нажатие двух кнопок одновременно, и если они нажаты, змейка не поворачивала. Ну, надеюсь, поймете.

P.S. Я еще совсем начинающий, не ругайтесь сильно на мой мега код. )
P.P.S. Все лишнее я убрал, поэтому не пишите "втф афтар у тебя же змейка не объявлена".

public class Main extends JPanel implements ActionListener {

    public static final int SCALE  = 32;
    public static final int WIDTH  = 20;
    public static final int HEIGHT  = 20;
    public static  int SPEED  = 10;

    Snake s = new Snake(10, 10, 9, 10);
    Timer t = new Timer(1000/SPEED, this);

    private class keyboard extends KeyAdapter{
        public void keyPressed(KeyEvent Kevent){
            int key = Kevent.getKeyCode();

            //я пытался...
            if((((key == KeyEvent.VK_RIGHT & s.direction!= 2)& key != KeyEvent.VK_DOWN) & key != KeyEvent.VK_UP )& key != KeyEvent.VK_LEFT) s.direction = 0;
            if((((key == KeyEvent.VK_DOWN & s.direction!= 3)& key != KeyEvent.VK_UP) & key != KeyEvent.VK_RIGHT )& key != KeyEvent.VK_LEFT)  s.direction = 1;
            if((((key == KeyEvent.VK_LEFT & s.direction != 0)& key != KeyEvent.VK_UP) & key != KeyEvent.VK_RIGHT )& key != KeyEvent.VK_DOWN) s.direction = 2;
            if((((key == KeyEvent.VK_UP & s.direction != 1)& key != KeyEvent.VK_DOWN) & key != KeyEvent.VK_RIGHT )& key != KeyEvent.VK_LEFT) s.direction = 3;
        }
    }

    public Main(){
       t.start();
       addKeyListener(new keyboard());
       setFocusable(true);
    }

    public static void main(String[] args) {
        JFrame f = new JFrame("Amazing snake");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(false);
        f.setSize(WIDTH * SCALE+6 , HEIGHT * SCALE + 29);
        f.setLocationRelativeTo(null);
        f.add(new Main());
        f.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        s.move();
        repaint();
    }
}

Ответы

▲ 1

Я бы посмотрел в сторону стека, чтобы обрабатывать все в порядке очереди (в google: java стек). Можно попробовать флаги выставлять при нажатии клавиши и по таймеру выставлять в false и выполнять, где внутри таймера проверялось бы логичность действия.

Посмотрите stackoverflow, там, конечно, нет прямо ответа на Ваш вопрос, но, может, идею под себя адаптируете:

  1. https://stackoverflow.com/questions/14301775/get-key-combinations?lq=1
  2. https://stackoverflow.com/questions/752999/how-do-i-handle-multiple-key-presses-in-java