2D Box Collisions - 我做错了什么? (C++)
问题描述:
我试图做一个成熟的游戏在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;
}
}
}
如果任何人都可以点我到二维盒碰撞一些教程,将是巨大的。
答
您使用的逻辑对我没有意义。仅仅是为了检查玩家是否在阻挡下是不够的:你是否还需要确保玩家站在其上,也就是说,距离街区的左侧或右侧不太远?同样,在第二次检查时,您必须确保玩家不会跳过,而是跳过(或站在上面)。您的if
部分检查了这一点,但没有考虑到第一次检查可能会改变玩家位置的事实。
你能否假设玩家永远不能走下街区?你能否假设玩家永远不会移动得足够快,从而完全通过该块(hsp> b.width等)来“隧道”?
如果其中任何一个的答案都是否定的,您将需要更复杂的碰撞检测。