Programming Linux Games
[美]John R. Hall 著
作者:[美]John R. Hall
单位:Loki Software, Inc.
时间:2001
出版社:No Starch Press, Inc.
时间:2008-2-27至2008-
声明:
这仅仅是几年前学习Linux时出于学习兴趣对本书部分内容的翻译。
目录
序
前言
本书读者
在线资源
致谢
1 游戏剖析
游戏分类
仿真游戏
First-Person Shooters射击者
实时策略游戏
回合式策略游戏
角色扮演游戏
猜谜游戏
Multiuser Dungeons多用户地牢
游戏架构
输入子系统
显示子系统
音频子系统
网络子系统
升级子系统
游戏循环结构
2 Linux开发工具
程序编辑器
Vi
Emacs
NEdit
Linux下程序编译
使用Make设施 Utility
创建Makefiles
错误处理
使用库
静态库
共享库
Linux连接器
调试Linux应用程序
编译时调试 Compiling for Debugging
GDB
DDD
错误跟踪 Bug Tracking
用CVS管理项目
CVS简要指导
其他有用工具
用grep快速搜索文本
用diff和patch升级源码
3 Linux游戏API
图形API
SVGALib
GGI
SDL
ClanLib
OpenGL
Plib
Glide
Xlib
图形用户接口工具包
GTK+
Tk
Fltk
Qt
SDL GUI Support
音频API
OSS
ALSA
ESD
OpenAL
脚本库Scripting Libraries
Tcl
Guile和MzScheme
Python和Perl
网络API
BSD Sockets
OpenPlay
IPX和SPX
文件处理
libpng和libjpeg
libaudiofile和libsndfile
Ogg Vorbis
SDL MPEG库——SMPEG
zlib
4 掌握SDL
计算机图形硬件
Framebuffer
SDL视频API
直接平面绘图Direct Surface Drawing
用Blits绘图Drawing with Blits
Colorkeys和Transparency
加载其他图像格式
Alpha合成 Alpha Blending
用SDL实现平滑动画 Animation
输入及事件处理
处理鼠标事件
处理键盘事件
处理游戏杆事件
使用SDL实现多线程
SDL音频编程
用PCM表现声音
Feeding声卡
一个SDL音频回放的例子
SDL中集成OpenGL
“企鹅战士”游戏
创建图形
在SDL中实现视差画笔
一个简单的小系统
游戏时间安排
5 游戏音频编程
6 Linux下游戏脚本
Tcl快速教程
内建Tcl命令
Tcl和C的接口
一个简单的脚本引擎
设计一个游戏脚本
将脚本用于现实世界
7 Linux网络游戏
’T
网际协议
地址和接口
名字解析
Socket编程
Socket
连接TCP Socket
接收TCP连接
使用UDP Socket
多用户“企鹅战士”游戏
网络游戏模型
“企鹅战士”的网络系统
网络游戏的性能
安全话题
8 Linux控制台游戏
Linux Framebuffer的正面和反面
创建Framebuffer设备
第一次进军Framebuffer程序设计
设置Framebuffer视频模式
视频扫描如何工作
模式数据库
一个例子
控制台输入处理
终端键盘输入
用GPM鼠标输入
9 完成“企鹅战士”游戏
添加武器
绘制相位器
检测相位器Hits
创建状态显示
回顾
10 Linux发行版
源码还是二进制?
本地配置
Linux并不孤单:支持FreeBSD
包管理系统
图形方式安装的优点
理解Linux文件系统标准
词汇表
参考文献
当John邀请我为此书写序时,我感到很荣幸。过去几年,我所做的东西很少人有机会做,我有机会亲身接触到世界上大多数流行(及一些不太流行)的游戏的源代码,有机会把这些游戏移植到Linux操作系统上。这活儿可是个苦差事,有时甚至让人恼火,不过总的来说,还是让我觉得自豪和愉快的。
在本书中,你将看到John花了一年多时间拾起的一颗颗智慧宝石,其中很多信息以前从未集结成册,只是散见于设计人员的头脑、实验、以及经验中,所以,无论你是刚开始做开源游戏,还是经验丰富的专家,我想你都能从中找到感兴趣的东西。John已经很好地介绍了在Linux上开发游戏的工具。
享受吧!
Sam Lantinga
Author of SDL
几年前,我在本地一家书店的计算机专柜浏览的时候撞上了另一个计算机发烧友。他自我介绍是一个游戏程序员,提到他所做的一些项目,并告诉我他最近迷上的东西:Linux。当时我并不太了解他所说的,但我把当时的谈话归档留作日后参考,最后,我想起那个名称并在家里的电脑上安装了Linux。
前几个月很不容易。Linux与DOS或Windows大不一样,费了好些功夫我才适应。然而,功夫不负有心人,不久后我便有足够的自信,可以永久转向Linux了。它的开发工具简直令人震撼,另外给我留下深刻印象的是,代码错误几乎从不导致系统崩溃。当我意识到我已经迷失的时候,我就再也不想回到Windows下了。
除了玩游戏。学校里的一群朋友时常举行网络化游戏派对(叫“netfetes”,用这群人的话说),而他们玩的所有游戏都依赖于Windows和DOS。我很不情愿地在我的硬盘上留下一个小分区给Windows,这样我才不会掉队了。
对于开发者而言,Linux是一个很棒的操作系统,甚者对于普通用户也是如此,只要不怕初学的过程。可是直到现在,Linux在游戏方面仍差强人意。这并不是由于它在技术上有什么先天不足;Linux有足够的性能和稳定性来支持高性能的多媒体应用。但是,它确实缺少游戏开发者的支持。幸亏有了可移植的游戏编程工具包,如SDL和OpenAL等,这一情形将开始改变。Linux仍未见有多少原创游戏,但Linux用户现在已经可以玩许多移植(转换)版本的商业游戏了,这些游戏主要由Loki软件公司出品。
从我有第一台Commodore 64电脑开始,游戏编程就已经成为我的兴趣之一,当我从Windows转向Linux的时候我也没有放弃这一爱好。我用了一段时间SVGALib库,但SDL很快成了我写Linux游戏的最喜欢的方式。在一次Linux产品交易会上和Loki公司的员工见面后,我认为Linux游戏潜在商机,并产生了为之写一本书的想法。一年后,终于完成,希望读者喜欢。
……
我至今仍记得我读过的第一本有关游戏编程的书,Dave Roberts写的,书名是《PC游戏编程探索》。书中有一个用于演示游戏编程的例子叫做“Alien Alley(译者注:外星人埃里)”。这个游戏整洁而巧妙,尤其适合作为书的例子,它不仅图形平滑,而且美工一流,在我那动力不足的烂机子上运行也表现不错。像这样的游戏,我现在觉得很容易写,甚至花几小时就能搞定,但游戏编程的新手可能会觉得高不可攀。
回到DOS游戏时代,程序员写游戏时通常要向计算机硬件直接发送命令。那时市场上流行的声卡屈指可数,且多数与Creative Labs’ Sound Blaster部分兼容。…………
Linux为图形编程提供了几种选择。目前大多数Linux游戏都用到X Window系统,因为它除了容易获得,并得到广泛支持外,至少速度也相当地快[1]。近来,Linux framebuffer设备接口也已经踏入游戏领域,且潜力巨大。最后,SVGALib则为SVGA兼容的视频设备提供了快速访问的能力。
SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库,它的开发是出于商业游戏移植的考虑(事实上,它已经被用在从Windows平台向Linux平台大量移植游戏了,包括大多数Loki公司出品的游戏)。SDL支持几乎所有的主流操作系统,包括Linux、Windows、BeOS和MacOS。除了快速的图形支持,SDL还提供了一些接口用于声音播放,访问CD-ROM驱动器,以及实现可移植的多线程。
SDL对于自由软件项目而言也是一个优秀的库。…………
……
Linux从Linus Torvald的一个宠儿进化为一个成熟的多用户操作系统,其文件系统也经历了长期的发展。前阵子人们认为,Linux的各个发行版使用不同文件系统的情况是不好的,于是就致力于为其建立一个标准。最初被冠名为Linux文件系统标准(Linux Filesystem Standard)的文档现已发展为文件系统层次结构标准(FHS,Filesystem Hierarchy Standard),有望适用于类Unix的操作系统。大多数Linux发行版在向FHS标准靠拢方面都做得很棒,这使得希望支持尽可能多的系统的应用程序员(包括游戏程序员)的生活变得更简单了。
在此我们还是不要长篇累牍地介绍FHS标准,你可以在下面这个链接处浏览它的全部内容:http://www..pathname.org/fhs。接下来,我们将给出文件系统的概貌,然后就你的游戏文件应该放在哪里给出一些提示。按这些提示去做,不仅能方便用户操作,而且可以减少你的游戏破坏某人的文件系统的可能性。那么,让我们从一个典型的Linux机器的顶层目录开始吧[注:10]。
/ 根目录。请勿在此存放你的任何东西[注:11]。
bin/ 存放系统启动所需的重要二进制程序文件。别碰这个目录,除非你有一个好的理由(如果你的产品是一个游戏,这是不大可能发生的)。
boot/ 存放Linux内核及各种启动加载程序的信息。
dev/ 存放设备文件,例如dsp。你可能需要访问一些设备,但不大可能需要修改它们。
etc/ 存放系统范围的配置文件。游戏的配置文件几乎肯定不会放在这里。
home/ 存放各个用户。例如,我的home目录是home/overcode/。通过环境变量HOME,程序和脚本可以检索到当前用户的home目录。home/有时是存在usr/home/,并链接到home/。
lib/ 存放系统库和内核模块。请别在此存放你的任何东西,除非你的应用程序需要特殊的内核模块(这是不大可能的,而且有潜在危险)。
mnt/ 临时文件系统挂载点。例如,软盘和CD-ROM就经常被挂载于此。
opt/ 这是一个有些争议(但标准化的)的目录,可以让应用程序在这添加自己的目录树。和/usr/local非常相似,也酷似Windows下的Program Files文件夹。
proc/ 存放动态产生的系统信息。此中之物可远观而不可亵玩焉。
root/ root用户。除非当前用户正好是root,否则别乱动(不过它很可能是有读/写保护的)。
sbin/ 存放系统管理的二进制命令集。除非需要收集系统的信息,否则一个游戏是无需动这个目录的。
tmp/ 存放临时文件。你可以在此存放任何东西,但出于礼貌最好在使用后把它收拾干
净。别指望tmp/中的东西可以存放很久,有些系统会每周定时清理tmp/。
usr/ FHS称之为“二级层次结构”,usr/包含类似root目录的目录结构,但目的不同。后面我们会看到usr/的一些子目录的简要介绍。
var/ 存放各种数据,如日志、邮件、状态信息、以及一些重要的不能放在tmp/中的临时文件(因为var/tmp/中的文件可以保证在系统重启后仍保持不变)。
usr/可谓系统中典型的、最大的顶级目录。它装着几乎所有的系统数据文件、二进制应用程序(至少包括不在opt/中的)、以及一些本地配置文件。下面是一个典型的usr/目录结构:
usr/X11R6/ 存放X Window系统。也许把它存放到系统的其他地方会更贴切,然而既来之,则安之,所以FHS标准就破例让它继续存放于此。
usr/bin/ 存放用户二进制程序。有时候,你的安装程序把二进制可执行程序或符号链接存放到这里是可以接受的。后面会讲到。
usr/games/ 存放游戏。如果你的游戏很小(只有一两个文件),你可能会把它安装到这个目录下。尽管如此,如果你没有使用包管理器,那么安装到usr/local/games/目录下可能更好。
usr/include/ 存放给C编译器的.h文件。如果你的游戏需要安装某个开发库(可能作为源码构成的一部分),应该把头文件放在这里以便C编译器能够找到,但最好把它们放在一个子目录下。例如SDL就是把它的头文件放在usr/include/SDL或usr/local/include/。
usr/lib/ 存放非关键性函数库。系统在没有/usr/lib/下的库时应该还能运行。SDL和GTK等包通常就是把它们的共享库放在这个目录下(或放在usr/local/lib/)。区分关键性库(lib/)和非关键性库(usr/lib/)对于Linux系统维护是非常重要的。
usr/local/ 功能类似opt/。这个目录不在包管理器的控制范围内(RPM包通常安装到
usr/,而不是usr/local/)。如果你打算用Loki公司的Setup程序来安装游戏
软件,你可能会装到usr/local/这个目录下。在usr/local/下创建应用程序的子
目录并不少见(反之,在usr/下创建子目录则是不好的风格)。usr/local/包含
了include/和lib/子目录,它们或多或少分别与usr/include/和usr/lib/等同。
FHS标准规定,对于usr/local/,在发行版安装时应让它空着,并且在升级
系统时也不能动它。
usr/sbin/ 存放另外的系统管理二进制程序集。虽然此目录下存放着与sbin/类型相同的程序(即主要由root使用的程序),但却不能包含对操作系统起绝对关键作用的任何程序。例如,网络流量监视器以及基本网络工具的改进版本可以放在usr/sbin/下,而对所有Linux系统都通用的基本系统管理程序则应放在sbin/下。
usr/share/ 存放体系结构无关的数据。此目录通常包含各种各样的程序的数据文件。例如,Emacs的Lisp脚本存在/usr/share/emacs/。那么把你自己的数据文件放在此目录下(一个独立的子目录中)也就理所当然了。
你的游戏程序应该把它自己安装在哪里呢?如果你用具有文件删除与检测能力的包管理器来安装,那么直接安装到usr/下(包括usr/bin/、usr/games/、usr/lib/、及usr/share/)是可以接受的。举个例子,假设你的游戏名是FooBall,它的可执行程序可以装到usr/games/fooball/,而它的数据文件则可以装到usr/share/fooball。然而,如果你的游戏使用自己的安装系统,而不是包管理器的话,最好安装到usr/local/games/fooball和usr/local/share/fooball/。或者安装到opt/fooball/也行。需要遵循的基本的规则是:别碰usr/,除非使用包管理器;反之,应该使用usr/local/或opt/。
…………