移动对象(OpenGL)

时间:2013-03-06 11:44:31

标签: c++ object move

我正在使用OpenGL在C ++中编写一个程序。

我的游戏中有一艘船和敌舰。

此刻我可以移动我的船,因为我对我的键盘很满意。

但我很乐意向我的敌舰提供一些动作。例如,它们位于某些坐标x,y中,我希望有一种方法可以将它们向右移动5步,在一定时间内重复5步。

有什么想法吗?

3 个答案:

答案 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 )。