2D处理游戏中的碰撞

时间:2016-05-10 00:58:57

标签: javascript 2d processing

我有这个使用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,直到碰撞停止。我让玩家与“食物”对象的一侧发生碰撞,它起作用了。但是当我在物体的顶部或底部碰撞时,它会将玩家移动到物体的边缘。我不知道如何解决这个问题,所以请帮助我们。

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)最后,可能是您编写了连续签到,因为您想添加更多障碍,并认为这是确保玩家不与任何东西发生碰撞的最简单方法。如果是这样的话,我建议你再多看一下类和对象是如何工作的(如果你想自己编写代码)或者寻找一个碰撞库(如果你想让它更有效) 。如果你想扩大游戏范围或添加功能,这种硬编码方法似乎可能会让你头疼。