首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在P5.js中为keyPressed()函数设置时间缓冲?

如何在P5.js中为keyPressed()函数设置时间缓冲?
EN

Stack Overflow用户
提问于 2018-08-14 12:31:07
回答 1查看 417关注 0票数 0

我在P5.js环境中做了一个简单的Snake游戏,我有一件事需要修复。

所以,我有这个keyPressed()函数的代码

代码语言:javascript
复制
function keyPressed(){
    if(keyCode === LEFT_ARROW) {
        if(snake.yspeed == 1 || snake.yspeed == -1) {
            snake.yspeed = 0;
            snake.xspeed = -1;
        }
    }else if(keyCode === RIGHT_ARROW) {
        if(snake.yspeed == 1 || snake.yspeed == -1) {
            snake.yspeed = 0;
            snake.xspeed = 1;
        }
    }else if(keyCode === UP_ARROW) {
        if(snake.xspeed == 1 || snake.xspeed == -1) {
            snake.xspeed = 0;
            snake.yspeed = -1;
        }
    }else if(keyCode === DOWN_ARROW) {
        if(snake.xspeed == 1 || snake.xspeed == -1) {
            snake.xspeed = 0;
            snake.yspeed = 1;
        }
    }
}

yspeed是垂直移动,xspeed是水平移动。

所以,如果蛇向右移动,即使我按下LEFT_ARROW,蛇也不会向左转。但是,如果我按下UP_ARROWDOWN_ARROW并快速按下LEFT_ARROW,蛇就会立即向左转并撞到自己。

因此,我希望在按下其中一个箭头键之后为keyPressed()函数添加一个缓冲时间。

我如何在P5.js中做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2018-08-15 07:30:46

我也做了一个snake game,遇到了这个问题。我用普通的javascript写的,并将fps设置为12,这给了玩家足够的时间在两个周期之间改变方向两次。

解决方案

我的解决方案是有一个缓冲区变量来存储最后按下的方向。在您的例子中,它可能是这样的

代码语言:javascript
复制
let dir = '';
function keyPressed(){
    if(keyCode === LEFT_ARROW) dir = 'LEFT';

    if(keyCode === RIGHT_ARROW) dir = 'RIGHT';

    if(keyCode === UP_ARROW) dir = 'UP';

    if(keyCode === DOWN_ARROW) dir = 'DOWN';

}

实际上,只有在我在draw()中调用蛇的update()方法之前,它才会改变方向

代码语言:javascript
复制
function draw() {
    ...
    snake.direction(dir);
    snake.update();
    snake.draw();
    ...
}

您只需要检查移动在direction()方法中是否有效。

代码语言:javascript
复制
this.direction = function(d) {
    switch(d) {
        case 'LEFT':
            if (this.xv != 1) {this.xv = -1; this.yv = 0;}
            break;

        case 'RIGHT':
            if (this.xv != -1) {this.xv = 1; this.yv = 0;}
            break;

        case 'UP':
            if (this.yv != 1) {this.xv = 0; this.yv = -1;}
            break;

        case 'DOWN':
            if (this.yv != -1) {this.xv = 0; this.yv = 1;}
            break;

        default:
            this.xv = this.yv = 0;

    }

}

(我从我的代码中复制了这段代码,但您已经明白了)

它是如何工作的

让我们以你的例子为例。

在游戏中,它首先将蛇的速度更改为指向UP,然后更改为LEFT,所有这些都是在调用下一个snake.update()之前完成的。

现在,它所要做的就是将dir变量更改为UP,然后在调用下一个snake.update()之前更改为LEFT。因此,下一个snake.direction()将获得一个包含LEFTdir参数,该参数将被忽略(因为蛇指向的是RIGHT),并且蛇本身不会倒退。

我希望这是有意义的,你可以检查我的代码here,如果它有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51833745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档