我有这个使用ProcessingJS库的Javascript代码
// Game
var player = {
x: 50,
y: 100,
width: 30,
height: 30,
speed: 10.5,
score: 0
};
var food = {
x: 200,
y: 200,
width: 30,
height: 30,
speed: 10.5
};
var up = 38;
var down = 40;
var left = 37;
var right = 39;
draw = function() {
background(155, 154, 156);
fill(0, 255, 85);
rect(player.x,player.y,player.width,player.height);
fill(245, 3, 3);
rect(food.x,food.y,food.width,food.height);
text('Score: ' + player.score,50,50);
};
var collided = function(){
if (player.x < food.x + food.width &&
player.x + player.width > food.x &&
player.y < food.y + food.height &&
player.height + player.y > food.y) {
return true;
} else {
return false;
}
};
keyPressed = function(){
switch(keyCode){
case up:
player.y -= player.speed;
break;
case down:
player.y += player.speed;
break;
case right:
player.x += player.speed;
break;
case left:
player.x -= player.speed;
break;
default:
break;
}
if(collided()){
while(collided()){
if(/* condition */){
// Do What?
};
}
}
};
由于某种原因,我将对象命名为“食物”,所以不要记住这一点。 我试图这样做,以便当玩家与“食物”物体碰撞时,它会像“食物”物体是一个固体物体,并且无法通过它(就像你正在尝试穿过一堵墙。)
我尝试从玩家的X位置减1,直到碰撞停止。我让玩家与“食物”对象的一侧发生碰撞,它起作用了。但是当我在物体的顶部或底部碰撞时,它会将玩家移动到物体的边缘。我不知道如何解决这个问题,所以请帮助我们。
答案 0 :(得分:2)
1)我不是试图猜测玩家应该回到哪里,而是先将玩家位置存储在每个keyPressed的开头
keyPressed = function(){
var oldX = player.x;
var oldY = player.y;
//do the other stuff
现在,如果发生碰撞,你可以通过player.x = oldX等将他设置回旧位置。当然,这有可能让他回到太远。
2)相反,你可以使用更接近你的方法的东西。你知道玩家来自哪个方向,因为你有keyPressed,你知道你需要多远才能让他回来,因为你的坐标是&#39; food&#39;。我们可以跳过&#34; while(碰撞)if(condition)&#34;并将另一个开关直接放入&#34; if(碰撞)&#34;
if(collided()){
switch(keyCode){
case up:
player.y = food.y + food.height;
break;
case down:
player.y = food.y - player.height;
break;
//etc.
3)最后,可能是您编写了连续签到,因为您想添加更多障碍,并认为这是确保玩家不与任何东西发生碰撞的最简单方法。如果是这样的话,我建议你再多看一下类和对象是如何工作的(如果你想自己编写代码)或者寻找一个碰撞库(如果你想让它更有效) 。如果你想扩大游戏范围或添加功能,这种硬编码方法似乎可能会让你头疼。