6/0 SDL事件驱动
什么是事件?
比如,我们对窗口的大小做出调整的行为叫做事件,既一个个不同的操作叫做不同的事件,窗口将对这些事件作出响应。
什么是事件驱动?
事件由发送器发出;由收集器进行收集;由处理器进行处理。前两者由系统完成,而开发人员需要解决处理器如何处理。
项目的配置
使用了标准库和扩展库。
目标事件处理:1.初始化操作 2.释放SDL库操作 3.加载图片操作
1.初始化操作 0代表初始化不成功 1 代表初始化成功。
int init()
{
// 初始化SDL库
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
printf("SDL初始化失败!%s\n", SDL_GetError());
return 0;
}
// 创建窗口
g_pWindow = SDL_CreateWindow("Lesson04",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
if(NULL == g_pWindow)
{
printf("创建窗口失败!%s\n", SDL_GetError());
return 0;
}
// 创建渲染器
g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, SDL_RENDERER_TARGETTEXTURE);
if(NULL == g_pRenderer)
{
printf("创建渲染器失败!%s\n", SDL_GetError());
return 0;
}
return 1;
}
2.完成释放操作。
为什么进行非空判断?
避免由于初始化部分成功和部分不成功,在释放时进行一个必要性的判断。
void close(void)
{
// 释放图片纹理
if(g_pTexture != NULL)
{
SDL_DestroyTexture(g_pTexture);
g_pTexture = NULL;
}
// 释放渲染器
if(g_pRenderer != NULL)
{
SDL_DestroyRenderer(g_pRenderer);
g_pRenderer = NULL;
}
//释放窗口
if(g_pWindow != NULL)
{
SDL_DestroyWindow(g_pWindow);
g_pWindow = NULL;
}
// 退出SDL库
SDL_Quit();
printf("程序释放成功!\n");
}
3.加载图片操作,0代表失败 1 代表成功。根据文件路径加载图片纹理。
int load(const char * szPath)
{
g_pTexture = IMG_LoadTexture(g_pRenderer, szPath);
if(NULL == g_pTexture)
{
printf("加载 %s 图片失败!\n", szPath);
return 0;
}
return 1;
}
4.事件处理。
// 往渲染器绘制图像并刷新
SDL_RenderCopy(g_pRenderer, g_pTexture, NULL, NULL);
SDL_RenderPresent(g_pRenderer);
while(1)
{
// 轮寻取事件
while(SDL_PollEvent(&e) != 0)
{
switch(e.type) // UInt32 32位无符号整型
{
case SDL_QUIT: // 退出事件
{
printf("程序将要关