C++ 碰撞检测在最后一次检查时不起作用?

标签 c++ collision-detection

在过去的几天里,我一直在尝试对使用 OpenGL 绘制的对象实现简单的碰撞检测。 在 Pearson,Computer Graphics with OpenGL 的帮助下,我成功编写了以下函数:

void 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
    } // always glitches on whatever is last else if above?!?!
    else{ glTranslatef(sprite.x+x_Vel, sprite.y+y_Vel, 0.0); }
}

我的 Sprite 根据键盘输入(箭头键)移动。如果它与静止物体发生碰撞,它会停止移动并保持原位。

到目前为止,它在与静止物体的顶部、左侧和底部发生碰撞时起作用。不幸的是(即使我使用相同的逻辑)右侧不起作用,并且在碰撞时 Sprite 会在其原始 x/y 坐标处重新绘制。我很困惑。

事实证明,move() 函数中的最后一个检查(最后一个 else-if)是不起作用的...我已经将 leftright 交换,当 left 是最后一个和播放的那个时,果然足够了 :(

关于如何改进它并阻止它出现故障,有什么建议或想法吗?

请原谅我的天真和业余编码。我只是一个自学的初学者。谢谢。

最佳答案

你不应该使用 else if。它有可能在同一帧中击中一侧和顶部或底部。尝试将它们更改为所有 ifs,因为您想检查每一个。或者至少将其更改为此。

if( /* check top */)
{

}
else if( /* check bot */)
{

}

if( /* check right */ )
{

}
else if( /* check left */)
{

}

此外,您应该避免声明像 Y_VEL 和 X_VEL 这样​​的全局变量,因为这会造成混淆。你这样做可能只是为了弄湿你的脚,但我会避免它。为每个对象创建一个类,然后将速度作为该类的成员。

关于C++ 碰撞检测在最后一次检查时不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15554735/

相关文章:

java - Box2D(处理中): how to solve the 'Could not invoke the "beginContact( )"method for some reason' error?

c++ - 两个物体的蛮力碰撞检测速度太慢

Java - 两条线的碰撞检测

java - 扩展类的问题

c++ - Move ctor 在所有情况下都有效吗?

c++ - 毫秒 mpi 错误 : unable to allocate launching block

c++ - 如何获取 crtdbg.h 文件?

c++ - 关于指针对齐,有没有办法使指针与某个给定的内存边界对齐?

c++ - 防止 McAfee Dll 注入(inject)

ios - Swift 3 Sprite 节点接触/碰撞行为不正常