C++碰撞检测在上次检查时不起作用?
C++ Collision Detection doesn't work on last check?
在过去的几天里,我一直在尝试实现使用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
(是不起作用的。。。我已经用right
交换了left
,当left
是最后一个和最后一个时,我确信:(
关于如何改进并阻止它出现故障,有什么建议或想法吗?
请原谅我的天真和业余编码。我只是一个自学成才的开始。谢谢
您不应该使用else if。它有可能在同一帧中击中侧面和顶部或底部。尝试将这些更改为所有如果,因为你想检查每一个。或者至少把它改成这样。
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函数都不会被调用。
我的意见是,你应该从else {...}
中提取glTranslateF()
调用,只是每次都调用它。然而,似乎你对每个矩形都使用了完全相同的"绘制"功能,而不仅仅是玩家的精灵。您可能需要找到一种方法来区分常规矩形(如平台(和播放器矩形。也许实现这一点的最简单方法是拥有两个不同的drawSprite
函数:一个用于常规平台,另一个用于播放器。仅从玩家的抽奖函数(可能称为drawPlayer()
?(中调用move()
函数
我现在没有时间仔细查看您的所有代码,以提出更具教育意义和具体的建议;然而,如果这个问题仍然悬而未决,需要帮助,我今晚晚些时候会有空。
正如您已经发现的,这个问题与glTranslate((有关。由于您对精灵的位置和速度都进行了操作,因此应该使用速度重复更新位置。即:
sprite.x += x_vel;
sprite.y += y_vel;
并一直简单地执行(即,如果scne被重复刷新,则通过某个定时器或每帧执行(。碰撞相当于以某种方式改变速度矢量(x_vel,y_vel(以模拟碰撞效果:要么将其归零以停止任何运动,要么改变速度分量符号(x_vel = -x_vel)
以使其以绝对弹性的方式反弹,或者做其他适合的事情。
现在glTranslate()
的情况是,x_vel, y_vel
实际上保持了与起始位置的偏移,但不保持运动速度。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- C++ 模板类型检查标准::is_same不起作用?
- 如果检查不起作用,则 C++
- 检查字符串中的小写字符或空格.布尔值不起作用
- 检查刻度中的坐标不起作用(OpenGL)
- 为什么 OpenService() 在我检查窗口服务状态时不起作用?
- 检查用户输入是否正确的函数不起作用
- 按类检查枚举不起作用
- 检查 CUDA 内核中的device_vector不起作用
- Strchr不起作用,或者我需要一个替代方案来检查给定字符串中的任何字符是否是另一个字符串的一部分
- 检查ifstream,错误后不起作用?
- 文件结束检查不起作用 (C++)
- 我尝试创建一个类来检查函数的参数数量是否有效,但它不起作用
- C++碰撞检测在上次检查时不起作用?