2011-04-24 59 views
2

我试图做一个成熟的游戏在C++和我进行了块的矢量, 和我简单地遍历向量和检查单独的碰撞:2D Box Collisions - 我做错了什么? (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; 
    } 

} 
} 

如果任何人都可以点我到二维盒碰撞一些教程,将是巨大的。

回答

0

您使用的逻辑对我没有意义。仅仅是为了检查玩家是否在阻挡下是不够的:你是否还需要确保玩家站在其上,也就是说,距离街区的左侧或右侧不太远?同样,在第二次检查时,您必须确保玩家​​不会跳过,而是跳过(或站在上面)。您的if部分检查了这一点,但没有考虑到第一次检查可能会改变玩家位置的事实。

你能否假设玩家永远不能走下街区?你能否假设玩家永远不会移动得足够快,从而完全通过该块(hsp> b.width等)来“隧道”?

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