我正在使用 OpenGL 用 C++ 编写程序。
我的游戏有一艘船和敌舰。
目前我可以移动我的船,因为我对我的键盘很满意。
但我很想给我的敌舰一些动作。例如,它们位于某些坐标 x、y 上,我希望有一种方法可以在一定时间内重复将它们向右移动 5 步,向左移动 5 步。
有任何想法吗?
您可以使用void glutTimerFunc(unsigned int msecs,void (*func)(int value), value);
第一个参数是以毫秒为单位的时间,第二个参数是更新敌舰坐标的函数。您可以在此处找到详细说明。您可以在下面看到如何使用它。
void update(int value) {
//do your logic to change the cordinate of the enemy ships
glutPostRedisplay();
glutTimerFunc(25, update, 0);
}
这是函数名称更新,您可以在其中放置更改敌舰坐标的逻辑。在它里面你看到了 glutTimerFunc ,其中时间是 25 毫秒,它的意思是每 25 毫秒调用一次函数更新,并且敌舰的坐标会根据你的逻辑发生变化。您必须在主函数中调用 glutTimerFunc。
int main(int argc,char** argv)
{
//your program code
glutTimerFunc(25, update, 0);
}
要在δt秒内将船从A移动到B(从t 0开始),您只需在每一帧的A + ( B - A )( t - t 0 )/ δt(其中t是当前时间)处绘制它,直到t = t 0 + δt。
请注意,这会引起线性运动。如果你想在动作的开始和结束时加速和减速,那就更复杂了。为了在不陷入物理问题的情况下将其平滑,您可以使用Smoothstep函数,将 ( t - t 0 )/ δt替换为 smoothstep( t 0 , t 0 + δt , t )。
这称为速度,用户输入应该改变速度。
如果你有一个位置,并且在一定时间后X
你有一个速度(x 的速度),你会得到一个新的位置vx
t
X'
X'=X+vx*t
只需调用类似
void update()
{
myObject.X += myObject.vx*t;
}
void leftArrow()
{
const float increment = 0.05f;
const float maxSpeed = 0.50f;
if (myObject.vx >= maxSpeed)
{
myObject.vx -=increment;
}
}
你如何选择t
?在您描述的平滑运动的情况下,几乎任何小的值都t
可以工作。如果您计划进行更复杂的运动,例如碰撞,您将需要评估您正在集成的功能的稳定性......(尽管这超出了您所描述的范围。)