二维盒子碰撞 - 我做错了什么? (C ++)

时间:2011-04-24 21:10:06

标签: c++ graphics block collision

我正在尝试用C ++制作一个平台游戏,我制作了一个块矢量, 我只是循环遍历向量并单独检查碰撞:

//Pseudo code
class Block{
...int x
...int y
...int width
...int height
};

class Player{
int x
int y
int width
int height
int hsp //horizontal speed
int vsp //vertical speed
int facing //0 = no direction, -1 = left, 1 = right
...



void loop()
{

    if(keyboard_pressed(key_left) { x-=hsp; facing = -1;}
    if(keyboard_pressed(key_right) {x+=hsp; facing = 1;}
    if(keyboard_pressed(key_up) {y-=vsp;}
    if(keyboard_pressed(key_down) {y+=vsp;}
    if(keyboard_released(key_left | key_right) {facing = 0;}

    for(int i = 0; i < blocks.size(); i++)
    {
        Block b = blocks.at(i);
        check_Collision(b);
    }
}

};

正如您所看到的,我的播放器只是根据hsp和vsp移动。很简单。 我的问题的主要部分是check_Collision()。首先,我检查一下玩家 在街区的顶部,如果他是,让他留在那里。 然后我检查玩家是否在街区的两侧。 但由于某种原因,存在问题。出于某种原因,当我走到街区顶部时, 他停留在顶端,但随后他转移到了左侧。

老实说,我不知道该怎么做。 以下代码仅检查顶部和左侧:

check_Collision(){
///////////////////////////////////
var myLeft, myRight, myTop, myBot;
var bLeft, bRight, bTop, bBot;
myLeft = x;
myRight = x + width;
myTop = y;
myBot = y + height;
/////////////////////
bLeft = b.x;
bRight = b.x + b.width;
bTop = b.y;
bBot = b.y + b.height;
//////////////////////////////////


//Check if we are at the top
if(myBot + vsp > bTop+1){
y = bTop - height;
}

//Check if we are at the sides
if(myBot > bTop+2){

    if(myRight + hsp > bLeft)
    {
        x = bLeft - width;
    }

}
}

如果有人能指出我的二维盒子碰撞教程,那就太棒了。

1 个答案:

答案 0 :(得分:0)

你使用的逻辑对我没有意义。仅仅检查玩家是否处于阻滞状态是不够的:你是否还需要确保玩家站在它上面,即距离区块的右侧或左侧不太远?同样,在你的第二次检查中,你必须确保玩家​​没有跳过块(或站在它上面)。你的if部分检查了这一点,但没有考虑到第一次检查可能修改了玩家位置这一事实。

你能否认为玩家不能走在街区之下?你能否假设玩家永远不会快速移动到隧道中完全“隧道”(hsp&gt; b.width等)?

如果其中任何一个的答案为否,那么您将需要更复杂的碰撞检测。