0

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

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

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

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

有任何想法吗?

4

3 回答 3

2

您可以使用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);
}
于 2013-03-06T12:03:22.610 回答
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 )。

于 2013-03-06T11:57:31.607 回答
0

这称为速度,用户输入应该改变速度。

如果你有一个位置,并且在一定时间后X你有一个速度(x 的速度),你会得到一个新的位置vxtX'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可以工作。如果您计划进行更复杂的运动,例如碰撞,您将需要评估您正在集成的功能的稳定性......(尽管这超出了您所描述的范围。)

于 2013-03-06T11:56:23.747 回答