SDL2入门教程(03_Event Driven Programming)

注: 本教程翻译自 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的教程,原教程戳这里.可能语言不准确,本翻译仅供参考,建议对比阅读。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SDL是Simple DirectMedia Layer(简易直控媒体层)的缩写。它是一个跨平台的多媒体库,以用于直接控制底层的多媒体硬件的接口。这些多媒体功能包括了音频、键盘和鼠标(事件)、游戏摇杆等。当然,最为重要的是提供了2D图形帧缓冲(framebuffer)的接口,以及为OpenGL与各种操作系统之间提供了统一的标准接口以实现3D图形。从这些属性我们可以看出,SDL基本上可以认为是为以电脑游戏为核心开发的多媒体库。 SDL支持主流的操作系统,包括Windows和Linux。在官方的介绍中,我们可以找到它所支持的其他平台。(SDL supports Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX. )。SDL本身从C语言开发,并且能很好的在C++等高级语言中使用。在官方可以看到SDL所支持的语言很多。(Including Ada, C#, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby, Smalltalk, and Tcl. ) SDL在GNU LGPL version 2下发布,这意味着你可以免费的使用。并且可以免费的用于商业软件的制作(只要你直接使用SDL的动态链接库,Windows下的SDL.dll)。如果你将SDL库编译进了自己的二进制代码中,你需要指明你所使用的SDL库的版本以及包括你自己修改的源代码,并说明这些代码的原始出处。这是很宽松的法律,你可以用如此强大的多媒体库完全合法的免费开发商业游戏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值