首页 > 解决方案 > 贪吃蛇游戏 - KeyListener 不起作用

问题描述

嘿伙计们,我的代码有问题。请忽略任何其他没有意义的事情,我还有很多工作要做......

正如您在下面看到的那样,我所做的是更改名为 checkDirection 的变量,然后检查相同的变量。

检查方向是一个私有变量......如果这改变了什么

    @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;
        }
    }

标签: javaswingkeylistener

解决方案


让我们从...

@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.paintComponentpaint本身做了很多重要的工作,打电话paintComponent只是其中之一。

相反,您应该直接覆盖paintComponent(并调用它super

有关详细信息,请参阅在 AWT 和 Swing中执行自定义绘画和绘画

绘画不应该是做出逻辑决策,而应该只是绘画模型的当前状态。相反,这些决定应该作为“更新”传递的一部分,作为“主循环”的一部分执行

“主循环”将检查输入的状态,决定如何更新状态并安排渲染通道。

一个简单的起点可能是使用SwingTimer

我还建议使用key bindings API over KeyListener,它将解决与相关的不可靠性问题KeyListener


推荐阅读