SDL中文教程

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

第三节:SDL扩展库

| Comments

原文地址:http://twinklebeardev.blogspot.com/2012/09/lesson-7-taking-advantage-of-classes.html

通过上一节的学习,你也许会怀疑SDL是否能读取BMP以外的图片格式。尽管SDL本身并不提供读取非BMP图片的功能,但包括读取多种图片格式的SDL_image,渲染true-type字体的SDL_ttf,支持更多音乐格式的SDL_mixer,支持网络的SDL _net,数量庞大而又健壮有力的库扩展着SDL的功能。

通过使用这些库,我们可以给我们的程序增加更多功能并使很多事情变得容易许多。在此我们只使用SDL_image,以后的课程中我们会讲到其他的扩展库。

在第0节中,当你从Mercurial中同步下来一份源码,并且生成库文件之后,你还需要下载并编译SDL_image,SDL_ttf还有SDL_mixer的源码,尽管在写这篇教程的时候我没能在Visual Studio里把SDL_mixer编译成功。(译注:现在去掉MP3格式支持就可以编译成功,详见第〇节译注)当SDL2.0正式发布的时候,我会更新这个教程并提供编译好的库以直接下载。

如果你还没做完这些,回到SDL的mercurial版本库中同步到代码并生成这些扩展库。

在windows下,要包含头文件和库文件,只需要把SDL2.0文件夹中对应路径粘贴到include和lib路径设置中,然后把SDL_image.lib还有其他等等的一些lib文件添加到连接器选项中。在linux中,使用configure,make还有make install的方式,它会告诉你在链接时需要的库安装的路径,

除此之外,你还需要把外部文件夹中的dll放到项目生成dll的文件夹内。某些dll是动态加载的,当你需要它的功能才需要添加。你可以参考扩展库的主页来弄明白哪些dll是这么工作的。

本节除了研究SDL_image库之外,我们还会通过为loadimage函数添加一些错误处理的代码来学习throw与catch异常,以此替代检测返回值是否为NULL的错误处理机制。这允许我们获取实际发生的错误的更多信息,并帮我们更快地追踪到导致错误的原因。

在本节中,我们只会在第二节的代码中添加一些额外的东西,所以让我们打开它。IDE用户需要按前文中所说的,给连接器选项添加SDL_image。对那些使用G++的人来说,取决于你SDL2.0的库名,你可以添加比如-lSDL_image或者-lSDL2_image的链接选项。

我们还要把新东西,SDL_image和stdexcept,include进去.

从这里开始我们和以往一样设定好屏幕参数并且创建全局的window和renderer。如果你觉得用全局对象不太好,你也许需要等一会儿了。

现在,我们开始用SDL_image的IMG_LoadTexture函数把之前的LoadImage改成直接从图像文件中读取texture。SDL_image支持许多图像格式:BMP,GIF,JPEG,LBM,PCX,PNG,PNM,TGA,TIFF,WEBP,XCF,XPM,XV.它是个非常强大的库。有了它,我们就不再被BMP格式限制啦~

这回对这个函数的返工简单得让人惊讶。我们只需要去掉SDL_Surface的工作,直接加载texture。注意我们现在使用IMG_GetError()替代SDL_GetError(),因为我们现在正在使用的是SDL_image库来加载图像,因此,对应的错误信息应该在IMG而不是SDL里。

但是我们这里又有另外一个新东西。因为我们决定要让程序变得更智能,并让它的错误处理方式能提供更多错误信息。当我们的图片加载失败之后,我们需要抛出(throw)一个runtime_error的异常,它告诉我们发生了什么,并且告诉我们哪一个图片导致了这项错误。虽然这样,如果你没有捕捉(catch)到这项错误,但之后的运行中这项错误发生了,这个程序还是会崩溃。取决于实际的情况,这或许是可以预计的,但是到崩溃的时候,我们还是希望它告诉我们实际发生了什么而不是直接崩溃。

现在我们准备好绘制图像了,本节我们会用这张图做背景:

前景图是这张:

观察了前景图之后你就会发现它的背景是透明的。我这样做是为了示范IMG_LoadTexture函数可以接受Alpha通道,而当texture绘制出来的时候,会显示出透明的效果。

现在我们有图了,开始编写加载代码。但是先回想一下为了进行错误处理,我们需要添加try/catch结构。还有,别忘了正确地设置图片的文件路径。

在catch语句中我们让程序打印出了e.what(),它会显示出我们之前放在runtime_error里的信息。注意,取决于你怎样配置的你的项目,你很可能看不到标准输出的结果(译注:比如VS中的某些编译选项会导致目标程序没有控制台窗口),如果遇到这种情况,你可以把错误信息输出到一个文件里。

剩下的代码我没有放在这里,因为它和第二节中的一样。如果你想改图像的位置,那就改吧。当运行和第二节中图片位置相同的程序的时候,你应该可以看到这个:

注意前景图的透明度被保留了。这个效果很有用,因为有了它我们就不必使用color key(色彩键?透明色?)来把图片的背景色抠出来,直接使用透明度就可以了。但如果你想使用color key,后面的教程中会讲到。

第三节的结束。

如果你编译或者运行的时候出现了问题,确认你正确地添加了include路径和链接设置,并且把SDL_image还有它的依赖库放在你的可执行文件的文件夹里了。

我们第四节:事件驱动的编程见!

Comments