【发布时间】:2013-03-21 17:55:07
【问题描述】:
在过去的几天里,我一直在尝试对使用 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)是不起作用的...我已将 left 替换为 @987654326 @ 果然left 是最后一个,也是最后一个播放的:(
关于如何改进它并阻止它出现故障的任何建议或想法?
请原谅我的天真和业余编码。我只是一个自学的开始。谢谢。
【问题讨论】:
-
我会尝试将
float speed更改为int speed以及x_vel和y_vel,首先排除舍入错误问题... -
另外,不清楚你说的
redrawn at original x/y coordinates是什么意思 -
谢谢,我马上改一下类型。在按下任何键之前,精灵被绘制在屏幕的左下角,当它与静止物体的右侧发生碰撞时,它基本上会删除精灵并将其移动/重绘回左下角......