0

我做了一个简单的蛇游戏。它就像一个魅力,但有一个多重按键的错误。

例如,当您要向上方向并同时按下左下或右下时,蛇只是简单地死在同一条线上。

所以这是按键的代码

document.body.addEventListener('keydown', keyDown);

function keyDown(event){
    //up
    if(event.keyCode == 38){
        if(yVelocity == 1)
            return;
        yVelocity = -1;
        xVelocity = 0;
    }

    //down
    if(event.keyCode == 40){
        if(yVelocity == -1)
            return;
        yVelocity = 1;
        xVelocity = 0;
    }

    //left
    if(event.keyCode == 37){
        if(xVelocity == 1)
            return;
        yVelocity = 0;
        xVelocity = -1;
    }

     //right
     if(event.keyCode == 39){
        if(xVelocity == -1)
        return;
        yVelocity = 0;
        xVelocity = 1;
    }
}

有没有办法防止多次按键或任何其他方式来防止这种情况?

4

1 回答 1

0

问题可能是在蛇的形状更新之前方向改变了两次,所以这两个方向改变中的第一个实际上被忽略了。

克服这个问题的一种方法是缓冲队列中的方向变化(实现为数组)。

因此,在您的关键事件处理程序中,您不会这样做:

if (snake.direction != 1)  
    snake.direction = 3;

但反而:

if ((snake.queue.length ? snake.queue[0] : snake.direction) != 1) 
    snake.queue.unshift(3);

这个队列应该在Snake构造函数中初始化:

this.queue = [];

然后,当您更新蛇的位置(按时间间隔)时,如果其中有东西,您将使用该队列:

if (snake.queue.length)
    snake.direction = snake.queue.pop();
// Now apply this direction:
//   ... this would be code you already have...

您可以为此队列大小设置一个最大值,因为如果用户持续按下键的速度比蛇更新速度快,它会变得很尴尬。

于 2021-03-13T21:27:43.593 回答