我正在用OpenGL和SDL编写一个乒乓球游戏。我对SDL_GetTicks()如何工作知之甚少,但我正在努力想出一种方法来实现如何使我的球移动,例如每1000毫秒是我的新手。
简短的例子,解释,帮助,任何事情都将受到极大的赞赏。
答案 0 :(得分:0)
Ye Olde Fix Your Timestep!
您不必使用RK4,“最后两个SIM状态之间的插值”是重要的部分。
答案 1 :(得分:0)
我通过创建自己的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正在计算毫秒数,因此您还可以实现一些转换功能,以便在几秒钟内设置时间。
在你的游戏机制中,你需要等待,创建一个实例。然后,调用计时器的Update()。好的是它不必定期调用,因为SDL_getTicks每次都会给你一个值。
问题是设置一个函数的回调,取决于它是否是成员函数,那么你应该使用一些包装器。在静态函数的情况下,没有什么可担心的,只需使用经典指针来起作用。 Lambda和许多其他东西,stoppin,pausding计时器也可以实现,只需要有创意:]
最后回答关于如何让球移动的问题,你可以打电话给
Move()
每次时间都起到回调的作用。移动球时,应该重新启动计时器。 :