我正在尝试用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 :(得分:0)
你使用的逻辑对我没有意义。仅仅检查玩家是否处于阻滞状态是不够的:你是否还需要确保玩家站在它上面,即距离区块的右侧或左侧不太远?同样,在你的第二次检查中,你必须确保玩家没有跳过块(或站在它上面)。你的if
部分检查了这一点,但没有考虑到第一次检查可能修改了玩家位置这一事实。
你能否认为玩家不能走在街区之下?你能否假设玩家永远不会快速移动到隧道中完全“隧道”(hsp&gt; b.width等)?
如果其中任何一个的答案为否,那么您将需要更复杂的碰撞检测。