SDL_GetTicks()-based movement?

SDL_GetTicks()-based movement?

本文关键字:-based movement GetTicks SDL      更新时间:2023-10-16

我正在用OpenGL和SDL编写一个乒乓游戏。我对SDL_GetTicks()的工作原理有一点了解,但我正在努力想出一种方法来实现如何使我的球移动,例如每1000毫秒作为新手。

简短的例子,解释,帮助,任何东西都将非常感激。

我通过创建自己的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和许多其他东西,停止,暂停定时器也可以实现,只是有创意:]

要最终回答你关于如何使球移动的问题,你可以调用一些

Move()

函数在每次时间结束时作为回调。当移动球时,你应该重新开始计时。:]

请修改您的时间步长!

你不必使用RK4,"在最后两个sim状态之间插入"是重要的部分。