我正在用OpenGL和SDL写一个乒乓球游戏。我对SDL_GetTicks()的工作原理略知一二,但我正在努力想出一种方法来实现如何让球移动,例如每1000毫秒移动一次。
简短的例子,解释,帮助,任何东西都会非常感谢。
发布于 2011-10-12 21:58:53
Ye Olde Fix Your Timestep!
你不必使用RK4,“最后两个模拟状态之间的插值”是重要的部分。
发布于 2016-05-16 20:45:51
我通过创建自己的Timer类解决了这个问题。从技术上讲,您要做的是在构造函数中使用GetTicks()指定一个开始毫秒值。
Timer::Timer(uint32_t ToWait, void (*call_back)(void*), void* context) : Callback(call_back), Context(context), Running(true), ToWait_private(ToWait)
{
StartTicks = SDL_GetTicks();
}
现在,您将实现一个update()函数,在该函数中,您每次都会保存当前的刻度
void Timer::Update()
{
if(!Running)
return;
CurrentTicks = SDL_GetTicks(); //get the current ticks
if(CurrentTicks - ToWait > StartTicks) //if the ticks are more than how much to wait
{
Running = false;
Callback(Context); //call my callback or whatever
}
}
这并不是所有的代码,但它应该给你一个点,比如如何实现它。由于SDL_ticks计算毫秒数,您还可以实现一些转换函数来设置时间(以秒为单位)。
在你的游戏机制中,当你需要等待时,创建一个实例。然后,调用timer的Update()。好消息是它不需要经常调用,因为SDL_getTicks每次都会给你这个值。
关键是设置一个函数的回调,取决于它是否是成员函数,然后你应该使用一些包装器。在静态函数的情况下,没有什么好害怕的,只需使用经典的指针指向函数即可。Lambda和许多其他的东西,停止销,暂停计时器也可以实现,只要有创意:]
为了最终回答你关于如何让球移动的问题,你可以调用一些
Move()
在时间到的时候作为回调函数。但是,在移动球时,您应该重新启动计时器。:]
https://stackoverflow.com/questions/7747008
复制相似问题