《Linux游戏编程》——理解Linux文件系统标准

Linux游戏编程

Programming Linux Games

 

[]John R. Hall

 

作者:[]John R. Hall

单位:Loki Software, Inc.

时间:2001

出版社:No Starch Press, Inc.

 

翻译:[email protected]

时间:2008-2-272008-

 

声明:

这仅仅是几年前学习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快速搜索文本

    diffpatch升级源码

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

    GuileMzScheme

    PythonPerl

网络API

    BSD Sockets

    OpenPlay

    IPXSPX

文件处理

    libpnglibjpeg

    libaudiofilelibsndfile

    Ogg Vorbis

    SDL MPEG库——SMPEG

    zlib

 

4 掌握SDL

计算机图形硬件

Framebuffer

SDL视频API

    直接平面绘图Direct Surface Drawing

    Blits绘图Drawing with Blits

    ColorkeysTransparency

    加载其他图像格式

    Alpha合成 Alpha Blending

    SDL实现平滑动画 Animation

输入及事件处理

    处理鼠标事件

    处理键盘事件

    处理游戏杆事件

使用SDL实现多线程

SDL音频编程

    PCM表现声音

    Feeding声卡

    一个SDL音频回放的例子

SDL中集成OpenGL

“企鹅战士”游戏

    创建图形

    SDL中实现视差画笔

    一个简单的小系统

    游戏时间安排

5 游戏音频编程

   

6 Linux下游戏脚本

Tcl快速教程

内建Tcl命令

TclC的接口

   

一个简单的脚本引擎

设计一个游戏脚本

将脚本用于现实世界

 

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

 

前几个月很不容易。LinuxDOSWindows大不一样,费了好些功夫我才适应。然而,功夫不负有心人,不久后我便有足够的自信,可以永久转向Linux了。它的开发工具简直令人震撼,另外给我留下深刻印象的是,代码错误几乎从不导致系统崩溃。当我意识到我已经迷失的时候,我就再也不想回到Windows下了。

 

除了玩游戏。学校里的一群朋友时常举行网络化游戏派对(叫“netfetes”,用这群人的话说),而他们玩的所有游戏都依赖于WindowsDOS。我很不情愿地在我的硬盘上留下一个小分区给Windows,这样我才不会掉队了。

 

对于开发者而言,Linux是一个很棒的操作系统,甚者对于普通用户也是如此,只要不怕初学的过程。可是直到现在,Linux在游戏方面仍差强人意。这并不是由于它在技术上有什么先天不足;Linux有足够的性能和稳定性来支持高性能的多媒体应用。但是,它确实缺少游戏开发者的支持。幸亏有了可移植的游戏编程工具包,如SDLOpenAL等,这一情形将开始改变。Linux仍未见有多少原创游戏,但Linux用户现在已经可以玩许多移植(转换)版本的商业游戏了,这些游戏主要由Loki软件公司出品。

 

从我有第一台Commodore 64电脑开始,游戏编程就已经成为我的兴趣之一,当我从Windows转向Linux的时候我也没有放弃这一爱好。我用了一段时间SVGALib库,但SDL很快成了我写Linux游戏的最喜欢的方式。在一次Linux产品交易会上和Loki公司的员工见面后,我认为Linux游戏潜在商机,并产生了为之写一本书的想法。一年后,终于完成,希望读者喜欢。

 

本书读者

……

 

 

3 Linux游戏API

我至今仍记得我读过的第一本有关游戏编程的书,Dave Roberts写的,书名是《PC游戏编程探索》。书中有一个用于演示游戏编程的例子叫做“Alien Alley(译者注:外星人埃里)”。这个游戏整洁而巧妙,尤其适合作为书的例子,它不仅图形平滑,而且美工一流,在我那动力不足的烂机子上运行也表现不错。像这样的游戏,我现在觉得很容易写,甚至花几小时就能搞定,但游戏编程的新手可能会觉得高不可攀。

 

回到DOS游戏时代,程序员写游戏时通常要向计算机硬件直接发送命令。那时市场上流行的声卡屈指可数,且多数与Creative Labs’ Sound Blaster部分兼容。…………

 

图形API

Linux为图形编程提供了几种选择。目前大多数Linux游戏都用到X Window系统,因为它除了容易获得,并得到广泛支持外,至少速度也相当地快[1]。近来,Linux framebuffer设备接口也已经踏入游戏领域,且潜力巨大。最后,SVGALib则为SVGA兼容的视频设备提供了快速访问的能力。 

SDL

SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库,它的开发是出于商业游戏移植的考虑(事实上,它已经被用在从Windows平台向Linux平台大量移植游戏了,包括大多数Loki公司出品的游戏)。SDL支持几乎所有的主流操作系统,包括LinuxWindowsBeOSMacOS。除了快速的图形支持,SDL还提供了一些接口用于声音播放,访问CD-ROM驱动器,以及实现可移植的多线程。

 

SDL对于自由软件项目而言也是一个优秀的库。…………

 

 

10 Linux发行版

……

理解Linux文件系统标准

LinuxLinus Torvald的一个宠儿进化为一个成熟的多用户操作系统,其文件系统也经历了长期的发展。前阵子人们认为,Linux的各个发行版使用不同文件系统的情况是不好的,于是就致力于为其建立一个标准。最初被冠名为Linux文件系统标准(Linux Filesystem Standard)的文档现已发展为文件系统层次结构标准(FHSFilesystem 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/SDLusr/local/include/

 

usr/lib/        存放非关键性函数库。系统在没有/usr/lib/下的库时应该还能运行。SDLGTK等包通常就是把它们的共享库放在这个目录下(或放在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/      存放体系结构无关的数据。此目录通常包含各种各样的程序的数据文件。例如,EmacsLisp脚本存在/usr/share/emacs/。那么把你自己的数据文件放在此目录下(一个独立的子目录中)也就理所当然了。

 

 

你的游戏程序应该把它自己安装在哪里呢?如果你用具有文件删除与检测能力的包管理器来安装,那么直接安装到usr/下(包括usr/bin/usr/games/usr/lib/、及usr/share/)是可以接受的。举个例子,假设你的游戏名是FooBall,它的可执行程序可以装到usr/games/fooball/,而它的数据文件则可以装到usr/share/fooball。然而,如果你的游戏使用自己的安装系统,而不是包管理器的话,最好安装到usr/local/games/fooballusr/local/share/fooball/。或者安装到opt/fooball/也行。需要遵循的基本的规则是:别碰usr/,除非使用包管理器;反之,应该使用usr/local/opt/

…………

 

 

你可能感兴趣的:(《Linux游戏编程》——理解Linux文件系统标准)