对于窗口程序来说,消息循环和事件响应是非常重要的,这节将介绍如何利用SDL提供的API函数实现消息循环和键盘ESC键响应。
将上节中的这部分代码注释掉:
//if( SDL_Flip( screen ) == -1 )
//{
// return 1;
//}
//SDL_Delay( 2000 );
上面的代码主要是将内存中的内容显示到屏幕上,然后等待两秒,让用户有机会看到图片。
下面要将这部分带代码替换成一个消息循环,让程序可以响应用户消息,代码如下:
bool bQuit = false; //程序是否退出的标志
SDL_Event event;
while(!bQuit) //如果bQuit不为true的话,循环一直进行
{
//从消息循环中尝试取出一个消息,如果有的话返回ture,否则返回false
//SDL_PollEvent不会等待,而是立刻返回
while( SDL_PollEvent( &event ) )
{
switch(event.type) //处理取到的消息,判断消息类型
{
case SDL_KEYDOWN: //如果是键盘按下事件
if(event.key.keysym.sym == SDLK_ESCAPE) //如果按的是ESC键
{
bQuit = true; //退出循环
}
break;
case SDL_QUIT: //如果是窗口关闭事件,例如点击窗口的关闭按钮
bQuit = true; //退出循环
break;
default:
break;
}
}
//将内存中的内容显示到屏幕上,该函数每调用一次就会更新一次窗口的内容,即游戏中的一帧
//由于在这个循环中我们没有修改内存中的内容,所以屏幕窗口中显示的内容不会发生变化
if( SDL_Flip( screen ) == -1 )
{
break;
}
}
学过windwos API编程的人一定对上面的这段代码非常熟悉,因为它和windows的消息循环机制很相似,对于windows的消息循环来说我们一般这样写:
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
在这里windows和SDL消息循环的区别在于GetMessage在消息队列中没有消息的情况下会等待,直到有消息为止;而SDL_PollEvent是不管有没有消息都马上返回。
其实在windows api中也有与SDL的SDL_PollEvent对应的函数,那就是PeekMessage。同样在SDL中也有与GetMessage对于的SDL_WaitEvent函数。
在这里,我们为什么用SDL_PollEvent而不用SDL_WaitEvent?是因为SDL_WaitEvent在没有用户消息的时候会造成程序等待,从而影响到游戏的帧数,这样在有动画的游戏中,就会出现用户不操作的时候界面停止,当用户再次操作时,界面发生跳跃的情况。试想玩俄罗斯方块的时候,你操作一下它就动一下,你不操作他就不动;或者刚刚方块还在上面,你等了一下没操作键盘,等你再操作键盘的时候,方块已经到下面了,这个是因为方块的下落一般是在定时器中处理的,是后台处理,没有用户消息的时候,后台的定时器还在运行,但界面没有和后台同步,从而造成画面跳跃前进的状况。
对于消息处理来说,SDL还提供了一些函数,由于我们暂时对消息处理没有进一步更深的需求,所以在这里不详细介绍,等用到的时候再说。如果你想了解一下的话,可以阅读SDL的文档。
下面分析SDL_Event的结构:
typedef union SDL_Event
{
Uint8 type; //消息类型
SDL_ActiveEvent active; //窗口焦点、输入焦点及鼠标焦点的失去和得到消息
SDL_KeyboardEvent key; //键盘消息,键盘按下和释放
SDL_MouseMotionEvent motion;//鼠标移动消息
SDL_MouseButtonEvent button;//鼠标按键消息
SDL_JoyAxisEvent jaxis; //手柄消息
SDL_JoyBallEvent jball; //手柄消息
SDL_JoyHatEvent jhat; //手柄消息
SDL_JoyButtonEvent jbutton; //手柄消息
SDL_ResizeEvent resize; //窗口大小变化事件
SDL_ExposeEvent expose; //窗口重绘消息
SDL_QuitEvent quit; //退出消息
SDL_UserEvent user; //用户自定义事件
SDL_SysWMEvent syswm; //平台相关的系统消息
} SDL_Event;
SDL_Event是一个联合体,type字段决定了其中的哪个结构体数据有效。
本节中只用到了键盘消息,所以这里主要介绍键盘消息,如果后面用到了其他消息,将做详细解释。SDL_KeyboardEvent定义:
typedef struct
{
Uint8 type; //消息类型,SDL_KEYDOWN/UP
Uint8 state; //键盘状态,表示按下还是释放,在这里和type字段代表的意义相同
SDL_keysym keysym; //具体的按键信息
} SDL_KeyboardEvent;
这里是键盘消息结构体的定义,type表示类型,由于SDL_Event是联合体,所以SDL_KeyboardEvent中的type等于SDL_Event中的type字段。下面看SDL_keysym:
typedef struct
{
Uint8 scancode; //按键对应的硬件扫描码
SDLKey sym; //按键对应的SDL枚举定义,SDL定义的键盘键以SDLK_开头(如SDLK_DELETE表示删除键)
SDLMod mod; //哪个辅助键被按下,辅助键指ALT,SHIFT之类的键
Uint16 unicode; //输入对应的unicode编码(需要调用SDL_EnableUNICODE开启unicode,SDL默认不开启)
} SDL_keysym;
其中scancode 暂时用不着,判断哪个键被按下一般都是用sym ,SDLKey和SDLMod都是SDL定义的枚举,在头文件SDL_keysym.h中。具体的可参考SDL文档或者源代码。
到这里为止,我们可以在窗口中显示一张图片,并且可以移动和关闭窗口了,在这过程中用到的函数的具体相关细节,需要大家自己去尝试,去了解,这里只是介绍了一些常用的功能。下一节中将介绍如何用C++将这些代码封装起来。
分享到:
相关推荐
通过这个教程,你将深入理解SDL事件处理机制,这对于任何使用SDL开发的游戏至关重要。实践这些源代码,不仅可以提升你的编程技巧,还能让你更好地理解游戏如何响应用户的实时操作。继续学习和实践,你将能够创建出更...
【标题】"SDL 游戏开发 经典教程"涵盖了使用Simple DirectMedia Layer(SDL)进行游戏开发的基础...通过学习和实践这个教程,开发者将具备使用SDL开发基础游戏的能力,并为进一步深入学习和开发更复杂的游戏奠定基础。
紫翼魔王 翻译版》是一份专为初学者设计的游戏开发教程,由知名游戏开发资源提供者lazyfoo的原版教程翻译而来,紫翼魔王负责了中文版的翻译工作,使得国内的学习者能够更加方便地理解和掌握SDL(Simple DirectMedia ...
通过学习"SDL.rar_SDL知名游戏_sdl教程_sdl游戏"提供的资料,尤其是"SDL教程.docx"文档,你将逐步掌握SDL的基本用法,为开发自己的游戏奠定坚实的基础。随着对SDL的熟练运用,你甚至可以参与制作出具有专业水准的...
1. **环境搭建**:介绍如何在不同的操作系统上安装和配置SDL开发环境,包括Windows、Linux和Mac OS等。 2. **基础示例**:通过简单的程序示例,如创建窗口、处理键盘输入、绘制图形等,帮助初学者快速入门。 3. **...
SDL是一个跨平台的多媒体库,它为开发人员提供了丰富的功能,包括图形渲染、音频处理、键盘和鼠标输入、游戏控制器支持等。在Lesson 03中,我们将专注于如何使用SDL来构建一个基于事件的程序。 ### 1. SDL事件模型 ...
4. **输入设备管理**:SDL可以检测和响应键盘、鼠标、游戏手柄等各种输入设备的事件,实现游戏中的交互控制。 5. **时间管理**:SDL提供计时器功能,帮助开发者实现游戏循环、帧率控制和动画同步。 6. **文件操作*...
**SDL(Simple DirectMedia Layer)** 是一个跨...通过深入学习和实践,你将能够熟练地使用SDL开发自己的游戏或多媒体应用。无论你是对游戏编程感兴趣,还是想提升你的跨平台开发技能,SDL都是一个值得探索的优秀库。
在这个“SDL开发教程”中,我们将深入探讨SDL的关键特性、安装过程、基本用法以及如何利用它来创建简单的应用程序。 首先,让我们从安装SDL开始。在不同的操作系统上,安装SDL的方法略有不同。在Windows上,你可以...
3. **事件管理**:它提供了处理键盘、鼠标、触摸屏、游戏手柄等各种输入设备事件的能力,使得游戏和多媒体应用能够响应用户交互。 4. **文件I/O**:SDL可以帮助开发者读写文件,这对于游戏中的资源管理非常重要。 ...
SDL(Simple DirectMedia Layer)是跨平台的多媒体库,主要用于开发图形、音频和...通过学习这套教程,你将具备使用SDL开发多媒体应用和游戏的基础能力。同时,实践这些例子将加深你对SDL的理解,并提升你的编程技能。
2. 时间管理:SDL提供了一套时间管理API,如`SDL_GetTicks`和`SDL_Delay`,可以帮助你实现游戏循环和定时事件。 五、高级特性 1. 物理模拟:虽然SDL本身不包含物理引擎,但你可以结合其他库(如Box2D)来实现物理...
4. **事件处理**:SDL提供了丰富的事件处理机制,包括键盘、鼠标和游戏手柄输入,以及窗口事件。你会学习如何编写事件循环来响应用户的交互。 5. **音频处理**:通过SDL Mixer模块,你可以播放和混合音效或背景音乐...
SDL(Simple DirectMedia Layer)是一个跨平台的开发库,主要用于处理多媒体和图形用户界面,尤其在游戏开发领域中被广泛使用。它提供了低级别的硬件访问,包括音频、图形、输入设备和时间管理等功能,简化了游戏...
2. **事件处理**:通过SDL,你可以捕获和响应各种用户输入事件,如键盘、鼠标、游戏手柄的动作,以及窗口管理器的事件,如窗口大小改变或关闭请求。 3. **音频处理**:SDL提供了音频流播放和混音的功能,可以处理...
9. **游戏循环**:典型的 SDL 游戏循环包括更新、渲染和事件处理三个阶段,确保游戏的实时性和响应性。 10. **关闭与清理**:当应用结束时,别忘了使用 `SDL_DestroyWindow`, `SDL_Quit` 等函数正确地释放资源和...
5. **事件处理**:SDL的事件模型允许程序响应用户输入,如键盘、鼠标和游戏控制器事件。通过`SDL_PollEvent`或`SDL_PeepEvents`函数,你可以检测并处理这些事件。 6. **音频处理**:SDL支持音频播放和录音。你可以...
事件处理是图形界面程序设计中的关键部分,包括了事件处理流程、事件队列、应用程序退出事件和用户自定义事件的处理。例如,在处理键盘输入时,程序需要捕获按键事件,并根据按键信息执行相应的行为。 在处理图形...
2. 时间管理:使用`SDL_GetTicks`和`SDL_Delay`来控制程序的执行时间和响应时间,实现游戏循环或定时任务。 四、SDL音频处理 1. 音频设备:`SDL_InitSubSystem(SDL_INIT_AUDIO)`初始化音频系统,然后使用`SDL_...
3. **事件处理**:讲解如何接收和响应用户输入,如键盘、鼠标、触摸屏事件,以及如何处理系统级事件,如窗口大小改变或关闭请求。 4. **音频处理**:说明如何加载、播放和管理音频文件,包括音乐和音效。可能还会...