SDL中文教程

_(:3」∠)_目前一团乱还请各位见谅
总之各位随意~

第四节:事件驱动的编程

| Comments

原文地址:http://twinklebeardev.blogspot.com/2012/07/lesson-4-event-driven-programming.html

既然我们已经学习了怎样往屏幕上绘制图像,现在该学习怎样读取用户的输入了。如果都不能玩的话,那就连游戏都不是了!本节我们会学习SDL的简单事件处理并开始设计一个基本的主循环(“main loop”).

在我们开始之前,要先提到一个重要的问题,本节所使用的大部分代码是上一节中写的。我们假定你已经有了这些代码,所以这些代码这里将不在赘述,直接在上一节代码的基础上添加代码。如果你没有这些代码,你可以回头去看前面的几节。又或者如果已经你理解了从github上获取到的第三节的代码,那么就让我们开始改代码吧。

像以前一样创建renderer和window。loadImage和ApplySurface函数保持原来的样子不变。第一个更改是把加载的图像改成另一幅图像,注意你需要更改文件路径以便与可执行文件的路径匹配,否则的话程序会运行失败。

我们使用和之前一样的方程将图像居中显示。本节我们用这幅图像:

现在,在我们专注于编写主循环和事件处理代码之前,我们需要弄明白SDL event系统是怎样工作的。

一个事件就是指用户做出的与程序交互的行为,比如:按下键,移动鼠标,鼠标点击,手柄移动,窗口改变大小、最小化或者关闭,等等。SDL提供了一个叫做SDL_Event的结构体来存储这些事件。现在我们创建一个SDL_Event。

无论什么时候发生事件,它都会被按时间顺序被存放在一个栈里。如果我们想要读取一个事件,我们可以使用SDL_PollEvent取出一个最老的事件。这可能让人困惑,但是幸运的是,下面这张示意图会使这个问题清晰一点。

在此情况下,用户更改了窗口大小,然后点了鼠标,然后按了一个键。 当我们调用SDL_PollEvent,它会获取到第一个发生的事件,或者说是最老的那个时间,然后把它放在我们的SDL_Event结构体中,以便于让我们看到这个事件的数据。

如果我们希望处理队列中每一帧的消息的话,我们需要循环直到队列中没有任何消息剩余,然后继续做其他的诸如逻辑、绘制之类的工作。这听起来像在主循环中调用的东西。

在循环中的每一次遍历中,我们都希望处理事件队列,处理一些程序逻辑然后将这一帧绘制出来,然后重复这些工作直到用户退出程序。

下一步,我们需要做的是事件轮询。我们的目标是读取每帧中的所有事件,所以我们使用另一个while循环。因为当没有未处理的消息的时候,PollEvent会返回1,也就是true,所以我们的循环会持续直到队列中再没有任何事件。首先,我们使用SDL_PollEvent得到一个事件,因为函数声明是 SDL_PollEvent(SDL_Event*) 所以我们需要传入一个地址,然后我们对获得的输入做所有我们需要的处理。在本例中,我们想要当用户按下任意按键,点击鼠标或者关闭窗口的时候直接退出程序,所以如果发生了什么事件的话,我们就把quit设为true。注意,单击窗口右上的红叉会被识别为SDL_QUIT.

SDL的event结构可以获取很多种类型的事件,并且能够提供与每个事件有关的所有有用的信息供你决定怎样处理用户输入。如果你想知道关于多种事件类型和event类型的数据的信息,就去看SDL_Event的相关文档吧。

主循环的下一步是把我们程序该计算的计算出来,比如判断移动、碰撞输出等等……尽管如此,因为我们的程序非常原始,现在我们不需要做太多的逻辑操作,所以我们继续绘制图像。

代码和之前的是相同的,但是我们必须确定我们每次绘制新的场景之前都清空了屏幕。不这么做的话,我们会让上一帧绘制的图像在下一帧里依旧显示着。

最后你需要释放掉texture、renderer还有window所占用的内存,退出SDL。

当你运行这个程序的时候,你可以通过在窗口激活的状态下点击窗口的红叉、在窗口中点击或者按下任何一个按键来退出程序。如果你查看了CPU占用的话,你也许会注意到一个有趣的东西。如果你看过讨论主循环的教程,或者写过SDL1.2的代码,你会发现我们本节的程序会把你CPU的一个核心占用到最大程度,这是因为这个程序并没有对帧率做任何限制。但这已经不是问题了,因为我们创建的renderer使用了SDL_PRESENTVSYNC这个flag,它会告诉renderer延迟绘制以匹配显示器的刷新率,让SDL自动为我们控制帧率,为我们省下了一到两行的代码。

Lesson 4 Extra Challenge!

Hint

第四节的额外挑战!

试着让图像移动起来吧~

提示

第四节的结束 感谢加入!我们第五节:裁剪精灵表见~

Comments