C ++碰撞检测不适用于最后检查?

时间:2013-03-21 17:55:07

标签: 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); }
}

我的精灵根据键盘输入(箭头键)移动。如果它与静止物体碰撞,它会停止移动并保持在其位置。

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

事实证明,move()函数(最后一个else-if)中的最后一次检查是不起作用的...我换了{{1使用left并确定当right是最后一个和播放的那个:(

关于如何改善这一点并阻止它出现故障的任何建议或想法?

请原谅我的天真和业余编码。我只是一个自学成才的开始。感谢。

3 个答案:

答案 0 :(得分:2)

你不应该使用else if。它有可能在同一框架中撞击一侧和顶部或底部。尝试将这些更改为所有ifs,因为您要检查每个ifs。或者至少改变它。

if( /* check top */)
{

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

}

if( /* check right */ )
{

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

}

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

答案 1 :(得分:1)

嗯,在我看来,在翻译实际对象时遇到了问题。 您的移动代码说明

if(there is a collision)
{ 
    //do stuff
}
else
{
    glTranslateF( );
}

因此,只要发生碰撞,就不会调用translate函数。

我的意见是你应该从glTranslateF()拨打else {...}来电,只是每次都要拨打电话。但是,似乎你正在为每个矩形使用完全相同的'draw'函数,而不仅仅是玩家精灵。您可能需要设法区分常规矩形(例如平台)和播放器矩形。也许最简单的方法是实现这个,就是拥有两个不同的drawSprite函数:一个用于常规平台,另一个用于播放器。只能在玩家的绘图功能中调用move()函数(可能称为drawPlayer()?)

我现在没有时间查看您的所有代码,以便提供更有教育意义的具体建议;但是,如果这个问题仍然存在并需要帮助,我将在今晚晚些时候获得自由。

答案 2 :(得分:1)

正如您已经发现的那样,问题与glTranslate()有关。由于您同时操作精灵的位置和速度,您应该使用速度重复更新位置。那就是:

sprite.x += x_vel;
sprite.y += y_vel;

并且一直这样做(即通过一些计时器或每一帧,如果重复重绘scne)。然后碰撞等效于以某种方式改变速度矢量(x_vel,y_vel)以模拟碰撞效果:要么将其归零以完全停止任何移动,要么改变速度分量符号(x_vel = -x_vel)以使其反弹绝对有弹性的方式,或做其他适合的事情。

glTranslate()现在发生的事情是x_vel, y_vel实际上与起始位置有偏移,但不是移动速度。