C++ C++;碰撞检测不需要';最后一张支票上没有工作吗?
在过去的几天里,我一直在尝试对使用OpenGL绘制的对象实现简单的碰撞检测。 在Pearson的帮助下,使用OpenGL的计算机图形学我成功地编写了以下函数:C++ C++;碰撞检测不需要';最后一张支票上没有工作吗?,c++,collision-detection,C++,Collision Detection,在过去的几天里,我一直在尝试对使用OpenGL绘制的对象实现简单的碰撞检测。 在Pearson的帮助下,使用OpenGL的计算机图形学我成功地编写了以下函数: void move(){ if(check_collision(sprite,platform1) || check_collision(sprite,platform2)){ //if colliding... if (downKeyPressed ){ y_Vel += speed; downKeyPr
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)是不起作用的检查。。。我已将左
与右
进行了交换,当左
是最后一个和播放的一个时,我确信:(
有什么建议或想法,我可以改善这一点,并停止它的故障
请原谅我的天真和业余编码。我只是一个自学成才的开始。谢谢。你不应该使用else if。它有可能在同一帧中击中一侧和顶部或底部。尝试将其更改为所有if,因为你想检查每个if。或者至少将其更改为此
if( /* check top */)
{
}
else if( /* check bot */)
{
}
if( /* check right */ )
{
}
else if( /* check left */)
{
}
此外,您应该避免声明全局变量,如Y_VEL和X_VEL,因为这会造成混乱。您可能只是为了让自己的脚湿了,但我会避免它。为每个对象创建一个类,然后将速度作为该类的成员。您不应该使用else if。它可能会撞到另一侧和另一侧同一帧中的顶部或底部。尝试将其更改为所有ifs,因为您希望检查每个ifs。或者至少将其更改为此
if( /* check top */)
{
}
else if( /* check bot */)
{
}
if( /* check right */ )
{
}
else if( /* check left */)
{
}
此外,您应该避免声明全局变量,如Y_VEL和X_VEL,因为这会造成混乱。您这样做可能只是为了让您的脚湿润,但我会避免它。为每个对象创建一个类,然后将速度作为该类的成员。嗯,在我看来,在转换实际速度时,您有一个问题对象
您的移动代码状态为
if(there is a collision)
{
//do stuff
}
else
{
glTranslateF( );
}
因此,无论何时发生冲突,都不会调用translate函数
我的意见是,您应该将glTranslateF()
调用从else{…}
中拉出,每次都要调用它。然而,似乎您对每个矩形使用完全相同的“绘制”函数,而不仅仅是播放器精灵。您可能必须找到一种方法来区分规则矩形(例如平台)和播放器矩形。可能实现这一点的最简单方法是使用两个不同的drawSprite
函数:一个用于常规平台,另一个用于播放器。仅从播放器的draw函数中调用move()
函数(可能称为drawPlayer()
?)
目前我没有足够的时间查看您的所有代码,以便提出更具教育性和具体的建议;但是,如果这个问题仍然存在,并且需要帮助,我今晚晚些时候将有空。嗯,在我看来,您在翻译实际对象时似乎有问题。
您的移动代码状态为
if(there is a collision)
{
//do stuff
}
else
{
glTranslateF( );
}
因此,无论何时发生冲突,都不会调用translate函数
我的意见是,您应该将glTranslateF()
调用从else{…}
中拉出,每次都要调用它。然而,似乎您对每个矩形使用完全相同的“绘制”函数,而不仅仅是播放器精灵。您可能必须找到一种方法来区分规则矩形(例如平台)和播放器矩形。可能实现这一点的最简单方法是使用两个不同的drawSprite
函数:一个用于常规平台,另一个用于播放器。仅从播放器的draw函数中调用move()
函数(可能称为drawPlayer()
?)
目前我没有足够的时间查看您的所有代码以提出更具教育性和具体的建议;但是,如果这个问题仍然存在并且需要帮助,我今晚晚些时候将有空。正如您已经了解到的,这个问题与glTranslate()有关。由于您同时操作sprite的位置和速度,因此应使用速度重复更新位置。即:
sprite.x += x_vel;
sprite.y += y_vel;
然后,碰撞就相当于以某种方式改变速度向量(x水平,y水平)来模拟碰撞效果:要么将其置零以停止任何运动,要么改变速度分量符号(x水平=-x水平)
使其以绝对有弹性的方式反弹,或做其他适合的事情
现在使用glTranslate()
发生的情况是x、y水平
实际上保持从起始位置的偏移,但不保持运动速度。正如您已经发现的,问题与glTranslate()有关。由于您同时操作sprite的位置和速度,因此应使用速度重复更新位置。即:
sprite.x += x_vel;
sprite.y += y_vel;
然后,碰撞就相当于以某种方式改变速度向量(x水平,y水平)来模拟碰撞效果:要么将其置零以停止任何运动,要么改变速度分量符号(x水平=-x水平)
使其以绝对有弹性的方式反弹,或做其他适合的事情
现在使用glTranslate()
所发生的事情是x、y级别