内容简介
1、课程大纲
2、第三部分第一课: SDL开发游戏之安装SDL
3、第三部分第二课预告:SDL开发游戏之创建窗口和画布
课程大纲
我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案。还会带大家用C语言编写三个游戏。
C语言编程基础知识
什么是编程?
工欲善其事,必先利其器
你的第一个程序
变量的世界
运算那点事
条件表达式
循环语句
实战:第一个C语言小游戏
函数
练习题
习作:完善第一个C语言小游戏
模块化编程
进击的指针,C语言王牌
数组
字符串
预处理
创建你自己的变量类型
文件读写
动态分配
实战:“悬挂小人”游戏
练习题
习作:用自己的语言解释指针
安装SDL
创建窗口和画布
显示图像
事件处理
实战:“超级玛丽推箱子”游戏
掌握时间的使用
用SDL_ttf编辑文字
用FMOD控制声音
实战:可视化的声音谱线
练习题
链表
堆,栈和队列
哈希表
练习题
第三部分第一课:SDL开发游戏之安装SDL
木啊哈哈,终于结束了前两部分,我们正式进入第三部分:
【用基于C语言的SDL库开发2D游戏】
从现在开始,C语言理论知识的学习大体上告一段落了。我们终于可以正式进入实战部分了,毕竟之前的两个小游戏虽然也算实战,但是运行在控制台的,不过瘾啊!
在这个部分,我向你保证我们会“玩”得很开心,毕竟编程是一件充满挑战和乐趣的事情,可不要觉得编程就是很难很枯燥噢。
前面我们一路披荆斩棘,经过了不少磨练,现在该是好好享受C语言的时候了!
在这个部分,我们会学习一个开源的库,名叫SDL。
在前两部分课程中,我们已经学习了C语言的大部分功能。
当然,有些知识点还是没有太深入细节,篇幅不够啊,要都深入,可能需要写一本书。
不过大家最好配合课外读物和一些视频教程继续深入学习C语言,毕竟C语言没个5年10年的经验都不好意思跟人家打招呼。
当然,我们的教程也可以就此打住,自豪地说一声: “我们已经学会C语言编程了”,但是我们总会留有遗憾,毕竟还没跳出“控制台”(Console)的黑框框的辖制。
这第一课我们就来了解一下SDL这个库,并且学习如何在各个平台(Windows,Mac OS和Linux)安装它。
我们说SDL是一个“第三方的库”,什么意思呢?
其实,库(Library)有两种类型:
-
标准库(Standard Library): 随同IDE或编译器的安装而自动安装好的,可以跨平台(运行于几乎所有操作系统)的库(也是“标准”一词的来由)。
不同的语言对应不同的库,这些库里定义的东西可以使我们做一些基本的操作(例如printf函数)。在第一和第二部分中,我们一直使用的就是C语言的标准库,例如stdio.h, stdlib.h, string.h, time.h, 等。虽然我们没有把所有的标准库都学完,但是也使用了不少了,如果你想要了解所有的标准库,可以百度搜索: C Standard Library
-
第三方库(Third party Library): 默认没有安装的库,你须要从网上下载,然后安装到电脑里。
与标准库不同(标准库只能实现比较基本的功能),第三方库有其他程序员所编写,世界上有数不胜数的第三方库。有一些很不错,有一些则没那么优秀;有一些是付费的,有一些是免费的。我们一般尽量使用功能强大又免费的第三方库。
如果要把所有第三方库介绍清楚,恐怕我不吃不睡一辈子也讲不完。
所以我们选择一个用C语言编写的第三方库,对大家这样刚学了C语言基本知识的正好合适。下面就来看看为什么选择SDL这个库,而不是其他的库。
选择SDL的理由
什么是SDL? SDL是 “Simple DirectMedia Layer” (翻成中文是“简单的直接媒介层”,只可意会不可言传呀...)的缩写,它是一个开源的项目。SDL是专为打造2D游戏设计的,但配合OpenGL或Direct3D(Direct3D是DirectX的一部分,是微软开发的3D图形API)也可以实现3D游戏,不过比较麻烦。SDL不是一个专为编写游戏而创建的库,它也可以用来做别的事情,例如编写一个文本编辑器。
各位看官想要知道我们选择SDL的理由吗?
我们就给你理由:
著名的游戏【愤怒的小鸟】Angry Bird 使用SDL开发(当然还使用了Box2D物理引擎)。
怎么样,这理由够了吗?(小编你怎么这么嚣张,好像不是你的风格...这样不好,不好... 也许是Angry Bird唤起了我的热(feng)情(nu)。我的手机里还保留着Angry Bird Rio的通关全纪录呢。Calm down, sister...)
如果您没听说过【愤怒的小鸟】这个游戏,那么我们再给出以下理由:
-
SDL是用C语言写的
这是很重要的一个原因,因为我们刚学了C语言。
-
为多媒体编程而设计
SDL是一个跨平台的多媒体库,它通过OpenGL和Direct3D,提供了针对音频、视频、键盘、鼠标、控制杆及3D硬件的低级别的访问接口。它在MPEG播放软件、模拟器以及许多游戏中得到广泛的应用,其中包含了获得大奖的“文明:权力的呼唤”的Linux 版本。
-
支持多种程序语言
SDL是用C编写的,但可以原生地配合C++使用,并且它拥有一些其他程序语言的绑定,这包括:Ada, C#, D, Eiffel, Erlang, Euphoria, Go, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby, Smalltalk, 以及 Tcl。
-
优越的跨平台特性
SDL支持以下操作系统: iOS,Android,Linux, Windows, Mac OS X, Windows CE, BeOS, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX,以及 QNX。同时代码中包含了针对Raspberry Pi, AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, RISC OS, SymbianOS, 和OS/2的支持,但这些并不是正式的支持。支持的操作系统(还有对应安装方法)详见:http://wiki.libsdl.org/Installation
-
*,免费
再没有比这更吸引人的了,不是吗?新版的SDL采用ZLIB授权(1.2版以前是LGPL许可)(zlib许可是一个*软件授权协议,但并非copyleft。 是用在zilb的协议,最新版本为1.2.8,2013年4月28日发布。版权持有人为Jean-loup Gailly和Mark Adler(1995-2013)。 类似BSD许可,除了必须注明来源,并在发布的软件中保留此授权协议副本)许可发行。该许可允许你*地链接其动态链接库,甚至可以在商业软件中*地使用。*软件是很好的,即使作者不再继续维护了,还可由其他人继续更新,所以一般不必担心会停止更新或消失。
顺便说一下几种常用的软件许可证
-
GPL 协议
通用性公开许可证(General Public License,简称GPL)。GPL同其它的*软件许可证一样,许可社会公众享有:运行、复制软件的*,发行传播软件的*,获得软件源码的*,改进软件并将自己作出的改进版本向社会发行传播的*。
GPL还规定:只要这种修改文本在整体上或者其某个部分来源于遵循GPL的程序,该修改文本的 整体就必须按照GPL流通,不仅该修改文本的源码必须向社会公开,而且对于这种修改文本的流通不准许附加修改者自己作出的限制。因此,一项遵循GPL流通 的程序不能同非*的软件合并。GPL所表达的这种流通规则称为copyleft,表示与copyright(版权)的概念“相左”。确保软件自始至终都以开放源代码形式发布,保护开发成果不被窃取用作商业发售。任何一套软 件,只要其中使用了受 GPL 协议保护的第三方软件的源程序,并向非开发人员发布时,软件本身也就自动成为受 GPL 保护并且约束的实体。也就是说,此时它必须开放源代码
GPL 大致就是一个左侧版权(Copyleft,或译为“反版权”、“版权属左”、“版权所无”、“版责”等)的体现。你可以去掉所有原作的版权 信息,只要你保持开源,并且随源代码、二进制版附上 GPL 的许可证就行,让后人可以很明确地得知此软件的授权信息。GPL 精髓就是,只要使软件在完整开源 的情况下,尽可能使使用者得到*发挥的空间,使软件得到更快更好的发展
无论软件以何种形式发布,都必须同时附上源代码。例如在 Web 上提供下载,就必须在二进制版本(如果有的话)下载的同一个页面,清楚地提供源代码下载的链接。如果以光盘形式发布,就必须同时附上源文件的光盘
开发或维护遵循 GPL 协议开发的软件的公司或个人,可以对使用者收取一定的服务费用。但还是一句老话——必须无偿提供软件的完整源代码,不得将源代码与服务做捆绑或任何变相捆绑销售。
-
AGPL 协议
原有的GPL协议,由于现在网络服务公司兴起(如:google)产生了一定的漏洞,比如使用GPL的*软件,但是并不发布于网络之中,则可以*地使用GPL协议却不开源自己私有的解决方案。AGPL则增加了对此做法的约束。GPL的约束生效的前提是“发布”软件,即使用了GPL成分的软件通过互联网或光盘release软件,就必须明示地附上源代码,并且源代码和产品也受GPL保护。 这样如果不“发布”就可以不受约束了。比如使用GPL组件编写一个Web系统,不发布这个系统,但是用这个系统在线提供服务,同时不开源系统代码。
-
LGPL 协议
宽松公共许可证(Lesser General Public License)或库通用公共许可证(Library General Public License)
基于 LGPL 的软件也允许商业化销售,但不允许封闭源代码。 如果您对遵循 LGPL 的软件进行任何改动和/或再次开发并予以发布,则您的产品必须继承 LGPL 协议,不允许封闭源代码。但是如果您的程序对遵循 LGPL 的软件进行任何连接、调用而不是包含,则允许封闭源代码。
-
BSD 协议
BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销 售,因此是对商业集成很友好的协议。很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。
BSD开源协议是一个给使用者很大*的协议。可以*地使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。当你发布使用了BSD协议的代码,或者以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:
如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议
如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议
不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
-
Zlib 协议
该协议要求遵守以下几点: 基于该软件的原样使用,作者不负责使用该软件照成的任何损失。
该软件修改后的版本将受到以下限制:
不能歪曲原软件的著作权
修改后的软件不能歪曲为原版软件
不能删除源码中的协议许可内容
如果发布二进制代码可以不用附上源代码。
-
Apache协议
Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:
需要给代码的用户一份Apache Licence
如果你修改了代码,需要在被修改的文件中说明
在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明
如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence
你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改
Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。
-
MIT 协议
MIT许可证之名源自麻省理工学院(Massachusetts Institute of Technology, MIT),又称「X条款」(X License)或「X11条款」(X11 License),MIT内容与三条款BSD许可证(3-clause BSD license)内容颇为近似,但是赋予软体被授权人更大的权利与更少的限制。 被授权人有权利使用、复制、修改、合并、出版发行、散布、再授权及贩售软体及软体的副本
被授权人可根据程式的需要修改授权条款为适当的内容
在软件和软件的所有副本中都必须包含版权声明和许可声明
此授权条款并非属copyleft的*软体授权条款,允许在*/开放源码软体或非*软体(proprietary software)所使用。此亦为MIT与BSD(The BSD license, 3-clause BSD license)本质上不同处。MIT条款可与其他授权条款并存。另外,MIT条款也是*软体基金会(FSF)所认可的*软体授权条款,与GPL相容。
下图展示了使用SDL开发的著名游戏“Civilization - Call to Power”(文明: 权力的召唤)的游戏截图:
SDL可以用于开发复杂精美的游戏,也可以开发简单小巧的游戏, 例如我们可以很方便地使用SDL来开发诸如下列游戏:
打砖块
炸弹人
俄罗斯方块
贪吃蛇
平台游戏,例如 超级玛丽,索尼克(音速小子),雷曼
角色扮演游戏,例如 初代的最终幻想,塞尔达传说
飞机大战
泡泡堂
所以说SDL没有限制,唯一的限制就是开发者的想象力了,不过SDL开发3D游戏需要借助其他的库。
SDL官方网站: (学习SDL的最好去处,里面的WiKi几乎有你想要的一切资源)
SDL官方WiKi:
http://wiki.libsdl.org/FrontPage
不错的英文SDL教程(不过没有很好的游戏例子):
http://www.willusher.io/pages/sdl2/
对应的中文翻译:
http://adolfans.github.io/sdltutorialcn/sdl-2-dot-0-tutorial-index/
下载SDL
SDL的官方网站是下载SDL的最好去处:
在那里你可以找到你想要的一切,你可以下载各个版本的SDL库,和对应的文档。
首先,我们在官网上点击左侧栏里的Download。选择最新的SDL版本下载(目前最新版本是2.0.3)
点击 SDL 2.0 之后我们会进入下载页面;
看到这几张截图,是不是有一种呐喊的冲动: “论学英语的重要性”。
是的,如果完全不会英语,你是不可能成为顶尖程序员的。所以,花点时间学学英语,对编程是很有帮助的。
可以看到我们的下载区分为三个部分:
-
Source Code
源代码。 你可以下载SDL的源码来学习,但是目前来说没有这样做的必要。我知道你可能很好奇,想要了解SDL内部的运作机制和设计理念,但是这就偏离了我们这一部分的主题了,我们暂时只学习怎么使用SDL而不是搞清楚其错综复杂的源代码。
-
Runtime Libraries
运行时库。顾名思义,就是你的程序运行时需要加载的库,没有这些库,你的SDL程序不能运行。例如在WIndow下,你用SDL开发结束,生成了最终的.exe可执行文件,你把它给别的用户,他们要能运行你的可执行文件(程序),那他们的电脑里也要有SDL的运行时库(当然是Windows版的),是SDL2.dll(对于2.0版本来说)。而这个SDL2.dll文件需要存放在特定位置,你的程序才能运行:
- 或者和可执行目录在同一文件下(推荐的方式),虽然你可以放在C盘的Windows目录下,但是不能完全保证程序可以运行,因为有时候SDL的版本不同,会有冲突
- 或者在 C:\Windows\system32 目录下
-
Development Libraries
开发库。顾名思义,就是你开发SDL的程序时需要调用的库,没有这些库你不能开发SDL的程序。也就是.a文件或.lib文件(在Visual C++下)(静态链接库)和.h文件,这些库文件使你可以在代码中调用SDL的代码。开发库只对开发者有用,一旦你程序的最终版本完成了,你给用户.exe文件时不需要附带这些库文件,而前面的运行时库是需要的。
暂时我们还不需要用到运行时库,因为我们只是学习如何开发SDL程序,所以暂时我们只需要用到开发库。是不是很开心啊?下载区的三个部分里只有一个部分是我们需要关心的。
特别的是:
如果你下载了开发库(Development Libraries),解压之后,你会发现里面除了开发时需要用到的库(.lib文件,.a文件或.h文件),还有SDL2.dll这个运行时文件也有。所以说,我们只需要下载开发库,你所要用到的一切都在里面了。
如果你是在Windows下,那么开发库有两种:
下载很简单,点击SDL官方页面上对应的蓝色超链接,就可以开始下载了。
下载下来对应的开发库之后,需要解压。
解压只需要安装一个Winrar或者7-Zip软件,就可以轻松解压.zip(VC版本的SDL库)和.tar.gz(MinGW版本的SDL库)。
-
VC的库
为Visual C++ (或Visual Studio)准备的开发库。里面的库是.lib文件。
-
MinGW的库
为MinGW准备的开发库,也是我们使用CodeBlocks时需要用到的开发库。里面的库是.a文件。
VC(Visual C++)大家应该都听说过吧,以前很多人学编程都用过VC6,Visual Studio应该也不陌生,作为微软的当家IDE,Visual Studio还是很厉害的,就是有点太庞大了,安装完要好多个G呢。
什么是MinGW呢?还记得我们的第一部分的第二课【工欲善其事,必先利其器】(里面也有提到Visual Studio和GNU)吗?
里面提到如果需要安装CodeBlocks,那么请选择带有mingw字样的安装包,就是为了含有MinGW编译程序。
MinGW
是Minimalist GNU for Windows的缩写,又称mingw32,是将GCC编译器和GNU Binutils移植到Win32平台下的产物,包括一系列头文件(Win32API)、库和可执行文件。 另有可用于产生32位及64位Windows可执行文件的MinGW-w64项目,是从原本MinGW产生的分支。如今已经独立发展。
MinGW是从Cygwin(1.3.3版)基础上发展而来。
GCC支援的語言大多在MinGW也受支援,其中涵蓋C、C++、Objective-C、Fortran及Ada。 对于C语言之外的语言,MinGW使用标准的GNU執行庫,如C++使用GNU libstdc++。 但是MinGW使用Windows中的C运行库。因此用MinGW开发的程序不需要额外的第三方DLL支持就可以直接在Windows下运行,而且也不一定必须遵从GPL许可证。这同时造成了MinGW开发的程序只能使用Win32API和跨平台的第三方库,而缺少POSIX支持[3],大多数GNU软件无法在不修改源代码的情况下用MinGW编译。
Windows下安装和使用SDL
在微软的Windows操作系统下
安装一个库可不比平时安装一个软件,例如QQ,迅雷,那么简单,只需要“下一步,下一步... 完成”。
通常来说,安装一个库对于初学编程的朋友来说是有点难度的; 即使对于有不少编程经验的人来说,有的库也很难安装。
不过请安心,我们选择了SDL,那也是因为SDL这个库的安装已经在同类库中算是简单的了。
有的库就只有源码给你,你自己去根据不同平台编译,也是醉醉的。
不过这里的“安装”这个词不能很好地表示真实的含义,因为我们没有什么要装的,我们只是要用我们的IDE(VC或者CodeBlocks)来创建一个SDL的项目。不同的IDE,这个过程不尽相同。
小编发现:
在CodeBlocks(我的版本是最新的13.12 版)下配置SDL2环境比配置SDL(1.2版)环境要麻烦很多,网上教程也说法不一。
不知道SDL2怎么在Windows下配置这么麻烦,比在Mac和Linux下都要麻烦...
所以我们两个都讲一下吧。
在CodeBlocks里创建SDL项目(SDL 1.2版)
-
解压SDL库
我们需要先下载 SDL-devel-1.2.15-mingw32.tar.gz 这个文件,然后解压到你电脑的某个地方,就放桌面吧暂时。
解压之后得到的文件夹里还有一个子文件夹,SDL-1.2.15,将其拷贝到CodeBlocks的安装目录(我是E:\Program Files\CodeBlocks),然后将其中SDL-1.2.15\include\SDL 这个目录下面的.h头文件全部拷贝到SDL-1.2.15\include\ 中(也就是它的上层目录)。至此,SDL1.2版就安装好了。
-
创建SDL项目
打开CodeBlocks,点击 “Create a new project”
创建一个SDL Project,填上项目名称和项目存放路径,
然后选择SDL的目录,如下图,点击 ... 那个按钮:
选择SDL库所在的目录,比如我是在 E:\Program Files\CodeBlocks\SDL-1.2.15
然后点击Close按钮,会弹出一个窗口让你选择目录,没用的,关闭它。 最后把 SDL-1.2.15\bin\SDL.dll 这个文件拷贝到你项目所在的目录里(你要拷贝到 C:\Windows\system32 目录下也行),就可以了。
-
运行main.cpp (很奇怪它不能创建c文件,一定是c++的)程序,就会看到如下窗口:
在CodeBlocks里创建SDL2项目(SDL 2.0.3版)
-
解压SDL库
我们需要先下载 SDL2-devel-2.0.3-mingw.tar.gz 这个文件,然后解压到你电脑的某个地方,就放桌面吧暂时。
我们发现,解压后的文件夹里面还包含了 SDL2-2.0.3 这个文件夹,而这个文件夹里面才是我们的所有文件,所以我们可以把这个文件夹全部拷贝到你的CodeBlocks的安装目录下,比如我的CodeBlocks安装在E:\Program Files\CodeBlocks (提醒大家:在WIndows里面C盘尽量只装系统软件,其他软件安装到D盘或者E盘比较好),所以我就把SDL2-2.0.3 这个文件夹复制到E:\Program Files\CodeBlocks 下,如下图所示:
在上面的第二张图中我们可以看到有好几个文件夹(对于初学者来说安装一个库确实不容易):- i686-w64-mingw32 : 针对32位的Windows的MinGW的开发库(.a)和运行库(.dll)
- include : SDL所有的.h头文件
- lib : 里面是针对Visual Studio或VC的开发库(.lib)和运行库(.dll),不清楚为什么明明这个包里应该全是MinGW的东西,却也有VS和VC的东西
- test : 测试程序
- x86_64-w64-mingw32 : 针对64位的Windows的MinGW的开发库(.a)和运行库(.dll)
不得不说,这文件夹安排得有点小 乱的呀... 我记得SDL的1.2版本安排得挺有条有理的,新版怎么... 开发人员给我出来,我保证不打你屁屁。算了,人家是大牛,可以任性。
小编的Windows是64位的Win8,所以我们开发SDL程序暂时只需要着眼于 x86_64-w64-mingw32 文件夹里的东西:
又来四个文件夹,也是醉醉的。 -
创建SDL项目
小编测试发现,Win XP,Win 7 和 Win8的安装方法不尽相同,所以就不详述了。给出以下图文教程,是Win XP 32位的CodeBlocks 13.13安装SDL 2.0.3 :
照这个教程一步步配置,改写main.c的代码,
编译运行,出现如下红色窗口,成功:
在VC(Visual C++)里创建SDL项目
-
解压SDL库
我们需要先下载 SDL2-devel-2.0.3-VC.zip 这个文件,然后解压到你电脑的某个地方。
-
创建SDL项目
先创建一个空白项目。
-
配置SDL项目
请参照这个图文教程,和在CodeBlocks下配置是类似的,不管是VC还是VS,都是先配置include所在目录,再配置 SDL2main.lib和SDL2.lib这两个目录:
http://lazyfoo.net/tutorials/SDL/01_hello_SDL/windows/msvsnet2010u/index.php
然后就可以运行了。因为小编Windows里没装VS或VC,所以就不演示了
Mac OS下安装和使用SDL
在苹果的Mac OS操作系统下
我们可以用CodeBlocks或者XCode这两个IDE来创建SDL项目,但是:
小编忍不住要吐槽啊:“Mac系统下的CodeBlocks做得是有多烂... 经常无故奔溃。这么好的一个IDE,开发团队干什么去啦...”
所以基于上述原因,我们重点讲解XCode这个苹果的当家IDE下如何创建SDL项目。毕竟XCode的速度和功能是相当了得的。
XCode创建SDL项目
首先我们要下载Mac OS版本的SDL开发库,如下图所示:
我们要下载的就是那个: SDL2-2.0.3.dmg
下载之后双击 SDL2-2.0.3.dmg 这个文件,就会看到这样的内容:
复制 SDL2.framework 这个文件,把它黏贴到/Library/Frameworks 这个文件夹里。
怎么打开/Library/Frameworks这个文件夹呢?
打开 Finder(Mac用户不要跟我说不知道Finder是什么):
打开Finder后,按下组合键:Cmd + Maj(相当于shift键) + g (字母g),会跳出一个对话框,让你前往文件夹:
在搜索框里填上 /Library/Framworks,点击“前往”,就进入 /Library/Framworks 这个文件夹了。
然后“黏贴”,把 SDL2.framework 这个文件黏贴到/Library/Frameworks 这个文件夹里 (会要你输入你的管理员密码确认),黏贴完后如下:
然后,打开XCode (还没安装的请去App Store用你的苹果账户安装):
点击 Create a new XCode project(创建一个新的XCode工程),会跳出下图所示窗口:
点击: OS X -> Application -> Command Line Tool,然后点击 Next 按钮,会进入项目设置,可以填入项目名称,编程语言选择C语言:
点击 Next 按钮,会让你选择项目存放位置,随你自己,我选择默认的桌面,点击 Create 按钮 :
我们的项目 TestSDL就创建好了,现在还没有关联 SDL2的库呢。接下来我们就来导入SDL的库,使我们的程序可以使用SDL的函数。
怎么做呢?很简单(至少比Windows下要简单)。
首先,点击 Build Phases (先要点击一下项目的图标,然后会显示配置界面,在配置页面,点击Build Phases,如上图左边蓝色字样所示),再点击Link Binary With Libraries,下来展开后,点击那个加号(+):
会出现让你选择 Frameworks 的界面:
点击 Add Other... 那个按钮,
会让你打开文件,继续用之前的快捷方法,三个键一起按:Cmd + Maj + g,输入:/Library/Frameworks,点击“前往”,进入文件夹,双击 SDL2.frameworks 这个文件夹,进入这个文件夹,然后点击右下角的 Open 按钮:
点击完Open按钮以后,回到了我们项目的主界面,可以看到 SDL.frameworks 已经被添加到项目中了,我们就可以在我们的main.c文件里用 #include <SDL2/SDL.h> 来引入我们SDL的头文件(这个头文件引入其他所有SDL的库文件)了,就可以在我们的程序中使用SDL啦。
我们将main函数扩展一下,写个SDL的测试程序,修改之后的main.c内容如下:
/*
main.c - Testing SDL2
http://www.squarebitstudios.tk
*/
#include <SDL2/SDL.h>
#include <stdbool.h>
/* Window resolution */
#define WINDOW_WIDTH 320
#define WINDOW_HEIGHT 240
/* Window title */
#define WINDOW_TITLE "SDL2 Test"
/* The window */
SDL_Window* window = NULL;
/* The window surface */
SDL_Surface* screen = NULL;
/* The event structure */
SDL_Event event;
/* The game loop flag */
_Bool running = true;
/* to put the loaded image */
SDL_Surface* image = NULL;
int main( int argc, char* args[] )
{
if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
printf( "SDL2 could not initialize! SDL2_Error: %s\n", SDL_GetError() );
} else {
window = SDL_CreateWindow(
WINDOW_TITLE,
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
WINDOW_WIDTH,
WINDOW_HEIGHT,
SDL_WINDOW_SHOWN);
screen = SDL_GetWindowSurface( window );
image = SDL_LoadBMP( "/Users/enmingxie/Desktop/TestSDL2/sdl.bmp" );
while( running ) {
while( SDL_PollEvent( &event ) != 0 ) {
if( event.type == SDL_QUIT ) {
running = false;
}
}
SDL_BlitSurface( image, NULL, screen, NULL );
SDL_UpdateWindowSurface( window );
}
}
SDL_FreeSurface( image );
SDL_DestroyWindow( window );
SDL_Quit();
return 0;
}
注:sdl.bmp文件是从 http://squarebitstudios.tk/files/0002/sdl.bmp 下载的,放置于项目目录里,然后把路径配置正确,比如我这里是:/Users/enmingxie/Desktop/TestSDL2/sdl.bmp
.bmp文件是一种位图文件。
程序写好了,可以来运行一下看看。
点击运行(XCode的绿色小三角),奔溃了... 不知道大家有没有遇到这个情况。
小编在XCode 6和最新版的Mac OS下,运行出错。
上网找了一下,原来是 SDL2.frameworks的问题。见这篇文章:
http://blog.csdn.net/xiaokaneier/article/details/38385553
怎么办呢?慢慢来:
在项目中删除已导入的 SDL2.frameworks (或者你干脆重新建一个项目)
在 /Library/Frameworks 中删除 SDL2.frameworks
-
下载SDL2.0.3的源码:
两个都可以下载,任选一个(zip和tar压缩方式不同而已),下载,解压(我喜欢用 Stufflt Archive Manager这个软件,解压非常方便,双击就解压了)之后,打开控制台(Mac下的Unix的终端,那个黑框框),在“实用工具”里:
然后依次执行以下命令(执行一条命令,就是在终端输入一条命令,再按回车键):
cd “你存放SDL2-2.0.3的路径”/SDL2-2.0.3 (我存放在桌面,那就是 cd ~/Desktop/SDL2-2.0.3)
./configure (一点+一个斜杠)
make
sudo make install (须要输入你的管理员密码确认)
然后继续执行以下命令,在当前环境下编译生成SDL2.framework:
xcodebuild -project Xcode/SDL/SDL.xcodeproj/ -target Framework
在如下目录中可以找到SDL2.framework文件,复制到/Library/Frameworks目录下:
“你存放SDL2-2.0.3的路径”/SDL2-2.0.3/Xcode/SDL/build/Debug/SDL2.framework(比如我的SDL2-2.0.3文件夹在桌面,那么就是 ~/Desktop/SDL2-2.0.3/Xcode/SDL/build/Debug/SDL2.framework )
以上我们做了什么事呢?其实就是放弃了官网直接下载的SDL2.framework,而自己从SDL的源码中编译出适合XCode的SDL2.framework。
然后,和之前一样重新导入SDL2.frameworks到XCode项目,运行程序,就看到我们的Mac下的第一个SDL窗口(带图片)啦!
(记得 sdl.bmp文件是从 http://squarebitstudios.tk/files/0002/sdl.bmp 下载的,放置于项目目录里,然后把路径配置正确,比如我这里是:/Users/enmingxie/Desktop/TestSDL2/sdl.bmp)
Linux下安装和使用SDL
在开源操作系统Linux下
安装SDL2库(要使用SDL1.2的用户也可以在SDL官网的WiKi里找到安装方法):
Debian系列(包括Ubuntu),一个命令搞定:
sudo apt-get install libsdl2-2.0
我在我的Ubuntu 10.04上(我的旧电脑)测试,发现找不到这个包,试了 sudo apt-get install libsdl2 也不行,sudo apt-get install libsdl2也不行。难道是我的Ubuntu版本太老了么?不知比较新的版本是不是有这个问题。
无奈,我只能下载源代码来编译安装SDL2。
可以通过hg命令(需要先安装hg (Mercurial的命令): sudo yum install mercurial (Fedora下)或者 sudo apt-get install mercurial (Ubuntu下))来获取,编译,安装。
hg clone https://hg.libsdl.org/SDL SDL
cd SDL
mkdir build
cd build
../configure
make
sudo make install
或者从SDL的官网下载SDL2-2.0.3.tar.gz 来编译运行:
tar -zxvf SDL2-2.0.3.tar.gz
cd SDL2-2.0.3
mkdir build
cd build
../configure
make
sudo make install
RedHat系列(包括Fedora), 一个命令搞定:
sudo yum install SDL2
实际测试可以(在Fedora 21下)。
Gentoo系列, 一个命令搞定:
sudo emerge libsdl2
其他的Linux发行版SDL的安装方法,基本都可以用源代码编译安装。
安装完成之后,我们用一个程序来测试一下:
按照下列步骤来做:
cd ~
mkdir -p SDL2projects/SDL2test
cd SDL2projects/SDL2test
wget http://squarebitstudios.tk/files/0002/sdl.bmp
wget http://squarebitstudios.tk/files/0002/main.c
gcc main.c -o test -Wall -lSDL2
./test
注:我发现假如是用编译源代码来安装的SDL2,那么,运行程序会出现:
error while loading shared libraries: libsdl2-2.0.so.0: cannot open shared object file
后来搞明白原来需要root程序才能执行,也是醉了。可能是SDL安装的路径的问题,因为默认是安装到/usr/local/lib下。
sudo su (提示你输入管理员密码)
./test
自动化编译
之后工程复杂起来了,我们可不能每次都用一条命令来编译,会很累的(设想如果你之后有很多.c文件要编译,难道每次都要把所有文件的名字输一遍,那太麻烦了)。
这个时候,我们就需要更加适合大型项目的方式来编译程序:
如果你使用一个IDE,例如CodeBlocks(CodeBlocks是跨平台的,还记得吗?),那么创建SDL项目的过程和第一节(Windows下使用SDL)几乎一样。
不过,我们在Linux下还可以不借助IDE,而纯手工编译我们的SDL项目。
什么是纯手工编译呢?
读者中可能有一些人已经有过在Linux下使用Makefile文件来实现纯手工编译的经验了。
不过对于大多数初学C语言的朋友,到底Makefile是个啥子玩意嘞?
要把这个主题讲清楚,可以写一大篇或者出一本小书... 小编之后应该会写一篇博文,顺便自己再好好学习一下,写Makefile的水平还远远不足啊。
对于目前习惯于使用Windows系统的朋友来说,基本是不会有用Makefile的时候的,因为Windows下的IDE都已经帮你把Makefile的事情做了,从编译,到链接到生成可执行文件,再到运行,一气呵成。
是的,Makefile这个“规范”就是能让你在基于Unix或Linux的系统下“一气呵成,一make到底”地构建和管理自己的项目。如果一个Linux或者Unix程序员不会写Makefile,那不能称之为专业的。
至于“Makefile是什么”和“make命令是什么”,可以自行百度,我这里就不复制黏贴了。
反正想要成为一个有逼格的程序员,最好学一下Makefile。
推荐大牛陈皓写的 《跟我一起写makefile》,2010重制版的PDF,比2005年的版本精美很多:
http://seisman.qiniudn.com/downloads/Makefile.pdf
看书的话,非常推荐《GNU Make项目管理(第三版)》,百度可以搜到PDF的,有中文版,但如果看英文版 《Managing Projects with GNU Make》 会更赞。
我们的Makefile
为了在Linux系统下手动编译我们的SDL程序,我们需要一个Makefile文件,而运行这个Makefile文件,只需要简单的一个命令:
make
你可以给你的Makefile文件就起名叫Makefile(m小写也可以),里面的内容如下(你可以根据自己情况修改):
GCC=gcc # GCC编译器命令
CFLAGS=-O3 # 程序优化选项
LDFLAGS=-lSDL2 # 链接库
EXEC=programName # 程序的名字,由你决定
all: ${EXEC}
${EXEC}: ${EXEC}.o
${GCC} $(CFLAGS) -o ${EXEC} ${EXEC}.o ${LDFLAGS}
${EXEC}.o: ${EXEC}.c
${GCC} $(CFLAGS) -o ${EXEC}.o -c ${EXEC}.c
clean:
rm -fr *.o
proper: clean
rm -fr ${EXEC}
然后你可以选用以下命令来编译和管理你的SDL项目:
make # 编译项目
make clean # 删除.o目标文件
make proper # 除了程序的源文件,其他都删除
make clean all # 删除.o目标文件,再重新编译
总结
SDL是一个相对偏底层的库,可以使你很方便地创建2D的游戏,和其他软件; 3D也是可以实现的,不过不是原生的,比较麻烦。
SDL库是第三方库,所以不会随着你的C语言开发环境而默认安装,你须要从网上下载安装,并且需要经过配置才能使用。
SDL库是*和免费的,可以使你快速上手,并且不需要担心有一天它会消失。
在众多库中我们选择了SDL,我们也分析了SDL的优势,其确有过人之处,别忘了【愤怒的小鸟】就是使用SDL开发的。
感觉SDL虽好,配置还是有点麻烦的,我开始怀念用Unity 3D开发游戏的时光了。不过我们为了学C语言,没办法。
第三部分第二课预告:
今天的课就到这里,一起加油吧。
下一次我们学习: SDL开发游戏之创建窗口和画布
程序员联盟社区
目前有一个微信群和一个QQ群(微信群130人以上,QQ群440人以上),凡是对编程感兴趣的朋友都可以加,大家可以交流,学习,互动,讨论编写的程序的源代码,编程问答等。
微信群(程序员联盟),加群请私信我(微信群人数超过100之后,不能通过扫描二维码加入了,只能私信我,谢谢)
QQ群(程序员联盟),群号是 413981577
百度贴吧 【程序员联盟】 欢迎您加入,交流编程,讨论代码,共享资源,已经有很多话题。吧主就是小编。
http://tieba.baidu.com/f?kw=%E7%A8%8B%E5%BA%8F%E5%91%98%E8%81%94%E7%9B%9F&ie=utf-8
手机微信里的二维码图片如何“扫描”呢?
小窍门:
在微信里长按图片,选择“识别图中二维码”,就可以了。
QQ群文件里有很多编程书籍PDF和其他资料。扫描下面二维码加QQ群:
我们还建立了一个公共的百度云盘,2TB容量,已有很多优秀编程资源,大家也可以上传。链接加群之后会发送。
《程序员联盟》的微社区,方便大家提问和互动。可以关注一下。
微社区地址和二维码如下:
谢谢!