Змеиная игра - KeyListener не работает - PullRequest
0 голосов
/ 13 мая 2018

Эй, ребята, у меня проблемы с моим кодом.Пожалуйста, игнорируйте любые другие вещи, которые не имеют смысла, у меня все еще есть много работы ...

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

Проверьте, что Direction является частной переменной ... idk, если это что-то изменит

    @Override
    public void paint(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillRect(appleXPosition, appleYPosition, 10, 10);
        g.setColor(Color.GREEN);
        g.fillRect(snakeXPosition, snakeYPosition, 10, 10);


        if (checkDirection == 0) {
            snakeXPosition = right(snakeXPosition);
        } else if(checkDirection == 1) {
            snakeXPosition = left(snakeXPosition);
        } else if (checkDirection == 2) {
            snakeYPosition = up(snakeYPosition);
        } else {
            snakeYPosition = down(snakeYPosition);
        }
    }

  @Override
    public void keyPressed(KeyEvent ke) {
        int code = ke.getKeyCode();
        switch (code) {
            case KeyEvent.VK_RIGHT:
                checkDirection = 0;
                break;
            case KeyEvent.VK_LEFT:
                checkDirection = 1;
                break;
            case KeyEvent.VK_UP:
                checkDirection = 2;
                break;
            case KeyEvent.VK_DOWN:
                checkDirection = 3;
                break;
            default:
                break;
        }
    }

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Я исправил, ребята! Просто нужно запросить фокус на JPanel.

0 голосов
/ 13 мая 2018

Давайте начнем с ...

@Override
public void paint(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.RED);
    g.fillRect(appleXPosition, appleYPosition, 10, 10);
    g.setColor(Color.GREEN);
    g.fillRect(snakeXPosition, snakeYPosition, 10, 10);


    if (checkDirection == 0) {
        snakeXPosition = right(snakeXPosition);
    } else if(checkDirection == 1) {
        snakeXPosition = left(snakeXPosition);
    } else if (checkDirection == 2) {
        snakeYPosition = up(snakeYPosition);
    } else {
        snakeYPosition = down(snakeYPosition);
    }
}

Вы переопределяете paint, но звоните super.paintComponent. paint сам выполняет много важных заданий, а paintComponent - только одна из них.

Вместо этого вы должны переопределить paintComponent напрямую (и назвать его super)

Подробнее см. Выполнение пользовательской живописи и Рисование в AWT и Swing

Живопись не должна принимать логические решения, она должна просто рисовать текущее состояние модели. Вместо этого эти решения должны приниматься как часть этапа «обновления», выполняемого как часть «основного цикла»

«Основной цикл» будет проверять состояние входных данных, принимать решения о том, как следует обновлять состояние, и планировать проход рендеринга.

Простым местом для начала может быть использование Swing Timer

Я бы также рекомендовал использовать API привязок клавиш вместо KeyListener, это исправит проблемы с ненадежностью, связанные с KeyListener

0 голосов
/ 13 мая 2018

В этом методе вы обновляете переменную checkDirection

public void keyPressed(KeyEvent ke) {

, но ваш paint() не запланирован на последующее выполнение, следовательно, он не знает о новых checkDirectionизменить.

Чтобы назначить перерисовку после установки checkDirection(), наберите repain();

 case KeyEvent.VK_RIGHT:
            checkDirection = 0;
            repaint(); // Add this
            break; 
...