SDL_GetTicks()-based movement?
SDL_GetTicks()-based movement?
我正在用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状态之间插入"是重要的部分。
相关文章:
- 迭代的"range-based for"召唤
- SFINAE-based ifdef
- mktime() 给出的结果与 Howard Hinnant 的日期库 (std::chrono based ) 不同
- 哈勒2D Diagonal Movement的SFML游戏开发书
- C++11 语法'type var : var'称为'range-based for'
- C++ SDL Movement 播放器"duplication"?
- std::shared_ptr::owner_before 和 std::owner_less:"owner-based order"到底是什么意思?
- "Unable to resolve template based identifier X" - 从模板类调用模板参数类的方法 (C++)
- 如何使我的自定义类型与"range-based for loops"一起使用?
- SDL_GetTicks()-based movement?
- (Pop in Array Based Stack)是否删除元素?
- how to compile ASL (boost based Adobe C++ gui library) on wi