注: 本教程翻译自 lazyfoo的教程,原教程戳这里.可能语言不准确,本翻译仅供参考,建议对比阅读。
事件驱动编程
除了在屏幕上展示图像,游戏还需要处理用户的输入。使用SDL的事件(Event)处理系统。
//主循环标志变量
bool quit = false;
//事件handler
SDL_Event e;
在SDL初始化和多媒体文件加载完毕后(就像之前的教程提到的),我们声明了一个用于确认用户是否选择退出的变量,既然我们才刚开始启动这个程序,当然初始化为false。
我们同样声明了一个SDL事件联合体(SDL Event union),一个SDL事件就是像按下键位,鼠标移动,按下手柄按键之类的事件。在这个程序中我们将要处理退出事件(quit Event)来关闭程序。
//当程序正在运行
while( !quit )
{
在之前的教程里,我们让程序在关闭之前延迟了几秒钟。而在这个程序中我们会让它一直运行直到用户选择关闭。
所以我们让程序在用户未退出时一直循环。保持程序在运行状态的循环叫做主循环(main loop),也叫游戏循环(game loop)。它是所有游戏的核心部分。
//处理队列中的事件
while( SDL_PollEvent( &e ) != 0 )
{
//用户选择退出
if( e.type == SDL_QUIT )
{
quit = true;
}
}
主循环的顶部是事件循环,它的作用就是持续处理事件队列直到它为空。
当你按下一个按键,或者触摸触控屏,一个事件就同时被放进了事件队列中。
事件队列会立刻把它们(事件)按事件发生顺序存储起来,等你来处理它们。当你想要了解发生什么事件以便处理这些事件时,你可以通过调用SDL_PollEvent()
来轮询事件队列以获取最新的事件。SDL_PollEvent()
的作用就是从事件队列中获取最先的事件并将从事件中获取的数据放进我们传递的参数中
SDL_PollEvent()
会一直从队列中获取事件直到队列为空为止。当队列为空,SDL_PollEvent()
会返回0。所以这一部分代码的作用就是持续从队列中获取事件直到队列空了为止。如果获取到的事件为SDL_QUIT
(用户点击窗口上的关闭按钮’X’),我们就将标志变量设定为true以退出程序。
//应用图像
SDL_BlitSurface( gXOut, NULL, gScreenSurface, NULL );
//更新surface
SDL_UpdateWindowSurface( gWindow );
}
处理完事件之后,我们将图像更新并绘制到屏幕(如同[之前的教程](http://blog.csdn.net/qq_31024569/article/details/77896974)提到的)。如果保存是否退出的标志变量被赋真值,那么这个程序就会在循环结束的时候终止。如果仍为假,那么循环将会使程序一直运行到用户点击窗口的关闭按钮位置。
下载多媒体文件和源代码请戳原作者链接
注: 本教程翻译自 lazyfoo的教程,原教程戳这里.可能语言不准确,本翻译仅供参考,建议对比阅读。