`
public0821
  • 浏览: 238040 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SDL游戏开发教程03(消息循环和键盘事件响应)

阅读更多

    对于窗口程序来说,消息循环和事件响应是非常重要的,这节将介绍如何利用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游戏开发经典教程03源代码

    通过这个教程,你将深入理解SDL事件处理机制,这对于任何使用SDL开发的游戏至关重要。实践这些源代码,不仅可以提升你的编程技巧,还能让你更好地理解游戏如何响应用户的实时操作。继续学习和实践,你将能够创建出更...

    SDL 游戏开发 经典教程

    【标题】"SDL 游戏开发 经典教程"涵盖了使用Simple DirectMedia Layer(SDL)进行游戏开发的基础...通过学习和实践这个教程,开发者将具备使用SDL开发基础游戏的能力,并为进一步深入学习和开发更复杂的游戏奠定基础。

    lazyfoo SDL游戏入门教程 紫冀魔王 翻译版

    紫翼魔王 翻译版》是一份专为初学者设计的游戏开发教程,由知名游戏开发资源提供者lazyfoo的原版教程翻译而来,紫翼魔王负责了中文版的翻译工作,使得国内的学习者能够更加方便地理解和掌握SDL(Simple DirectMedia ...

    SDL.rar_SDL知名游戏_sdl教程_sdl游戏

    通过学习"SDL.rar_SDL知名游戏_sdl教程_sdl游戏"提供的资料,尤其是"SDL教程.docx"文档,你将逐步掌握SDL的基本用法,为开发自己的游戏奠定坚实的基础。随着对SDL的熟练运用,你甚至可以参与制作出具有专业水准的...

    SDL1.2中文教程

    1. **环境搭建**:介绍如何在不同的操作系统上安装和配置SDL开发环境,包括Windows、Linux和Mac OS等。 2. **基础示例**:通过简单的程序示例,如创建窗口、处理键盘输入、绘制图形等,帮助初学者快速入门。 3. **...

    C++ SDL教程翻译 Lesson 03博文的附件

    SDL是一个跨平台的多媒体库,它为开发人员提供了丰富的功能,包括图形渲染、音频处理、键盘和鼠标输入、游戏控制器支持等。在Lesson 03中,我们将专注于如何使用SDL来构建一个基于事件的程序。 ### 1. SDL事件模型 ...

    此图书对大家更加深刻的讲解SDL使用游戏制作

    4. **输入设备管理**:SDL可以检测和响应键盘、鼠标、游戏手柄等各种输入设备的事件,实现游戏中的交互控制。 5. **时间管理**:SDL提供计时器功能,帮助开发者实现游戏循环、帧率控制和动画同步。 6. **文件操作*...

    SDL.rar_sdl_sdlref pdf_sdl中文教程_sdl教程_怎样学sDL画图

    **SDL(Simple DirectMedia Layer)** 是一个跨...通过深入学习和实践,你将能够熟练地使用SDL开发自己的游戏或多媒体应用。无论你是对游戏编程感兴趣,还是想提升你的跨平台开发技能,SDL都是一个值得探索的优秀库。

    sdl 开发教程

    在这个“SDL开发教程”中,我们将深入探讨SDL的关键特性、安装过程、基本用法以及如何利用它来创建简单的应用程序。 首先,让我们从安装SDL开始。在不同的操作系统上,安装SDL的方法略有不同。在Windows上,你可以...

    SDL-2.0.6-11541.zip_debian sdl驱动_sdl_sdl图形渲染_sdl游戏开发pdf

    3. **事件管理**:它提供了处理键盘、鼠标、触摸屏、游戏手柄等各种输入设备事件的能力,使得游戏和多媒体应用能够响应用户交互。 4. **文件I/O**:SDL可以帮助开发者读写文件,这对于游戏中的资源管理非常重要。 ...

    sdl基础教程 终极版

    SDL(Simple DirectMedia Layer)是跨平台的多媒体库,主要用于开发图形、音频和...通过学习这套教程,你将具备使用SDL开发多媒体应用和游戏的基础能力。同时,实践这些例子将加深你对SDL的理解,并提升你的编程技能。

    sdl学习教程

    2. 时间管理:SDL提供了一套时间管理API,如`SDL_GetTicks`和`SDL_Delay`,可以帮助你实现游戏循环和定时事件。 五、高级特性 1. 物理模拟:虽然SDL本身不包含物理引擎,但你可以结合其他库(如Box2D)来实现物理...

    SDL 教程.zip

    4. **事件处理**:SDL提供了丰富的事件处理机制,包括键盘、鼠标和游戏手柄输入,以及窗口事件。你会学习如何编写事件循环来响应用户的交互。 5. **音频处理**:通过SDL Mixer模块,你可以播放和混合音效或背景音乐...

    sdl教程下载

    SDL(Simple DirectMedia Layer)是一个跨平台的开发库,主要用于处理多媒体和图形用户界面,尤其在游戏开发领域中被广泛使用。它提供了低级别的硬件访问,包括音频、图形、输入设备和时间管理等功能,简化了游戏...

    SDL教程+API(全英文)

    2. **事件处理**:通过SDL,你可以捕获和响应各种用户输入事件,如键盘、鼠标、游戏手柄的动作,以及窗口管理器的事件,如窗口大小改变或关闭请求。 3. **音频处理**:SDL提供了音频流播放和混音的功能,可以处理...

    SDL2.0教程.zip

    9. **游戏循环**:典型的 SDL 游戏循环包括更新、渲染和事件处理三个阶段,确保游戏的实时性和响应性。 10. **关闭与清理**:当应用结束时,别忘了使用 `SDL_DestroyWindow`, `SDL_Quit` 等函数正确地释放资源和...

    linux sdl 库和头文件

    5. **事件处理**:SDL的事件模型允许程序响应用户输入,如键盘、鼠标和游戏控制器事件。通过`SDL_PollEvent`或`SDL_PeepEvents`函数,你可以检测并处理这些事件。 6. **音频处理**:SDL支持音频播放和录音。你可以...

    SDL 图形界面程序设计.pdf

    事件处理是图形界面程序设计中的关键部分,包括了事件处理流程、事件队列、应用程序退出事件和用户自定义事件的处理。例如,在处理键盘输入时,程序需要捕获按键事件,并根据按键信息执行相应的行为。 在处理图形...

    sdl入门书籍源代码,书籍查看本站资料教程1.rar

    2. 时间管理:使用`SDL_GetTicks`和`SDL_Delay`来控制程序的执行时间和响应时间,实现游戏循环或定时任务。 四、SDL音频处理 1. 音频设备:`SDL_InitSubSystem(SDL_INIT_AUDIO)`初始化音频系统,然后使用`SDL_...

    sdl中文文档---很简单很容易入门

    3. **事件处理**:讲解如何接收和响应用户输入,如键盘、鼠标、触摸屏事件,以及如何处理系统级事件,如窗口大小改变或关闭请求。 4. **音频处理**:说明如何加载、播放和管理音频文件,包括音乐和音效。可能还会...

Global site tag (gtag.js) - Google Analytics