SDL2新手入门 —— 定时器

SDL2 阅读(181)

# 定时器  
[`SDL_Delay`](http://wiki.libsdl.org/SDL_Delay)函数可以用来进行延时,参数是要延时的时间,单位是毫秒,这是一个阻塞函数,大多数时候不能满足我们的需要。   
```C
#include <SDL_Timer.h>
void SDL_Delay(Uint32 ms);
```

[`SDL_AddTimer`](http://wiki.libsdl.org/SDL_AddTimer)函数可以创建一个定时器,并立即开始计时。
```C
#include <SDL_Timer.h>
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void* param);
// 成功返回定时器ID,失败返回0
```
* `interval`参数是定时器的定时时间,单位是毫秒
* `callback`参数是定时器到达定时时间时调用的回调函数
* `param`参数是传递给`callback`的任意数据

回调函数原型 :  
```C
Uint32 SDL_TimerCallback(Uint32 interval, void* param);
```

调用[`SDL_RemoveTimer`](http://wiki.libsdl.org/SDL_RemoveTimer)可以删除不需要的定时器。  
```C
#include <SDL_Timer.h>
SDL_bool SDL_RemoveTimer(SDL_TimerID id);
// 成功返回SDL_TRUE,失败返回SDL_FALSE
```

## 一段完整的使用定时器的代码
```C
#include <SDL2/SDL.h>

typedef struct TimerUserData
{
    int times;
    SDL_TimerID timer;
}TimerUserData;

Uint32 timeout(Uint32 interval, void* param);

int main(int argc,char* argv[])
{
    /* 初始化Timer子系统 */
    SDL_Init(SDL_INIT_TIMER | SDL_INIT_EVENTS);

    TimerUserData data = {0};
    data.timer = SDL_AddTimer(1000, timeout, &data);
 
    SDL_Event e;//定义保存事件的变量
    while(1)
    {
        SDL_PollEvent(&e); //捕获事件
        if(e.type == SDL_QUIT) //如果事件类型是退出,则跳出循环
        {
            break;
        }
    }
    
    SDL_Quit();
     
    return 0;
}
 
Uint32 timeout(Uint32 interval, void* param)
{
    TimerUserData* data = (TimerUserData*)param;
    data->times += 1;
    SDL_Log("timeout %d times." , data->times);
    SDL_RemoveTimer(data->timer);
    
    if(data->times < 10)
    {
        data->timer = SDL_AddTimer(1000, timeout, data);
    }
    else
    {
        SDL_Event e;
        e.type = SDL_QUIT;
        SDL_PushEvent(&e); // 产生一个退出事件
    }
}
```

Markdown使用 帮助


匿名

我有一头小毛驴,我从来也不骑。

匿名

在山的那边,海的那边,有一群蓝精灵。

匿名

我有一头小毛驴,我从来也不骑。