我编写了一个小程序,当实现时会停止一个穿过较大矩形的小方块。
当调用collision()
函数时,它会检查形状是否发生碰撞。目前它执行以下操作:
up
时,它不会通过。
(喜欢它应该)down
时,朝向形状,它不会通过。
(喜欢它应该)right
时,它不会通过。 (但它向上移动一个键
按)left
时,它不会通过。 (但按一键按下向左移动一键按下)(见图)
这是我的collision()
功能:
if (sprite_Bottom +y_Vel <= plat_Top ){return false;}
else if(sprite_Top +y_Vel >= plat_Bottom ){return false;}
else if(sprite_Right +x_Vel <= plat_Left ){return false;}
else if(sprite_Left +x_Vel >= plat_Right ){return false;}
//If any sides from A aren't touching B
return true;
这是我的move()
功能:
if(check_collision(sprite,platform1) || check_collision(sprite,platform2)){ //if colliding...
if (downKeyPressed ){ y_Vel += speed; downKeyPressed = false;} //going down
else if(upKeyPressed ){ y_Vel -= speed; upKeyPressed = false;} //going up
else if(rightKeyPressed){ x_Vel -= speed; rightKeyPressed = false;} //going right
else if(leftKeyPressed ){ x_Vel += speed; leftKeyPressed = false;} //going left
}
glTranslatef(sprite.x+x_Vel, sprite.y+y_Vel, 0.0); //moves by translating sqaure
我希望left
和right
碰撞的工作方式与up
和down
相同。我的代码对每个方向使用相同的逻辑,所以我不明白为什么会这样做...
答案 0 :(得分:0)
我认为你应该首先检查精灵的角落是否有碰撞。然后,如果您的平台比您的精灵更厚,则无需进一步检查。否则,请检查精灵的每一面是否与平台发生碰撞。
if ((plat_Bottom <= sprite_Bottom + y_Vel && sprite_Bottom + y_Vel <= plat_Top)
&& (plat_Left <= sprite_Left + x_Vel && sprite_Left + x_Vel <= plat_Right))
// then the left-bottom corner of the sprite is in the platform
return true;
else if ... // do similar checking for other corners of the sprite.
else if ... // check whether each side of your sprite collides with the platform
return false;
答案 1 :(得分:0)
原因似乎是因为您在检查碰撞后将速度加到了速度上。
这是一个问题,因为您在碰撞过程中正在测试速度的旧版版本。然后,您将speed
添加到速度,这可能会使精灵移动到碰撞中。如果要在碰撞之后将速度加到速度,则还需要将速度合并到碰撞算法中。
在collision()
函数中尝试此操作:
int xDelta = x_Vel + speed;
int yDelta = y_Vel + speed;
if (sprite_Bottom +yDelta <= plat_Top ){return false;}
else if(sprite_Top +yDelta >= plat_Bottom ){return false;}
else if(sprite_Right +xDelta <= plat_Left ){return false;}
else if(sprite_Left +xDelta >= plat_Right ){return false;}
//If any sides from A aren't touching B
return true;