我在P5.js环境中做了一个简单的Snake游戏,我有一件事需要修复。
所以,我有这个keyPressed()
函数的代码
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_ARROW
或DOWN_ARROW
并快速按下LEFT_ARROW
,蛇就会立即向左转并撞到自己。
因此,我希望在按下其中一个箭头键之后为keyPressed()
函数添加一个缓冲时间。
我如何在P5.js中做到这一点?
发布于 2018-08-15 07:30:46
我也做了一个snake game,遇到了这个问题。我用普通的javascript写的,并将fps设置为12,这给了玩家足够的时间在两个周期之间改变方向两次。
解决方案
我的解决方案是有一个缓冲区变量来存储最后按下的方向。在您的例子中,它可能是这样的
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()
方法之前,它才会改变方向
function draw() {
...
snake.direction(dir);
snake.update();
snake.draw();
...
}
您只需要检查移动在direction()
方法中是否有效。
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()
将获得一个包含LEFT
的dir
参数,该参数将被忽略(因为蛇指向的是RIGHT
),并且蛇本身不会倒退。
我希望这是有意义的,你可以检查我的代码here,如果它有帮助。
https://stackoverflow.com/questions/51833745
复制相似问题