我正在使用OpenGL在C ++中编写一个程序。
我的游戏中有一艘船和敌舰。
此刻我可以移动我的船,因为我对我的键盘很满意。
但我很乐意向我的敌舰提供一些动作。例如,它们位于某些坐标x,y中,我希望有一种方法可以将它们向右移动5步,在一定时间内重复5步。
有什么想法吗?
答案 0 :(得分:2)
你可以使用void glutTimerFunc(unsigned int msecs,void (*func)(int value), value);
来做
第一个参数是以毫秒为单位的时间,第二个参数是您更新敌舰的坐标的功能。您可以找到详细说明here.您可以在下面看到如何使用它。
void update(int value) {
//do your logic to change the cordinate of the enemy ships
glutPostRedisplay();
glutTimerFunc(25, update, 0);
}
这是函数名称更新,您可以使用逻辑来更改敌舰的坐标。在它里面你看到了glutTimerFunc,其中时间是25毫秒,这意味着每25毫秒调用一次功能更新,并且敌舰的坐标根据你的逻辑而变化。你必须在main函数中调用glutTimerFunc。
int main(int argc,char** argv)
{
//your program code
glutTimerFunc(25, update, 0);
}
答案 1 :(得分:0)
这称为速度,用户输入应改变速度。
如果你有一个位置,X
,并且在一定时间后你有一个vx
(x中的速度),t
你会得到一个新的位置{{1} } 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
值都可以。如果您计划进行更复杂的运动,例如碰撞,则需要评估正在集成的函数的稳定性......(尽管这远远超出了您的描述。)
答案 2 :(得分:0)
将船舶从 A 移至δt秒内的 B (从 t 0 开始),你只需在 A +( B - A )( t - <每个帧上的em> t 0 )/ δt(其中 t 是当前时间),直到 t = t 0 + δt。
请注意,这会引起线性运动。如果你想在运动的开始和结束时加速和减速,那就更复杂了。为了使其平滑而没有全部陷入物理学,你可以使用Smoothstep函数,替换( t - t 0 )/ δt with smoothstep( t 0 , t 0 + δt, t )。