您喜爱视频游戏吗?您是否想开发一款自己的动感游戏?这并不像想象的那样复杂,也不要求您是数学家或编程天才。本书介绍编写第一款游戏"Invasion of the Slugwroths"所需的一切。
本书作者带领读者从头做起,介绍当前最热门的商业游戏编程语言C++的开发工具和基本概念。本书配合丰富的示例,循序渐进地讲授游戏编程结构、集成声音和音乐、浮点数数学、C++数组等,还提供示例程序及其源代码供读者在学习的过程中参考。
无
我曾经玩过的第一款视频游戏是Pong(那时我13岁)。那是一款非常简单的弹球模拟游戏。在我的少年时代,市面上还很少有更高级的游戏。最著名的游戏就是像Atari公司的Missile Command这样的游戏,这是一款核战争模拟游戏。我在19岁那年去了日本,在日本生活的几年中我发现了一个完全崭新的世界,实际上,是几个全新的世界。
我刚到日本时,游戏Space Invaders(太空侵略者)红极一时。我从未见过这么酷的游戏。但当我返回美国时,视频游戏已经随处可见。
1981年秋,我进入大学。我的一位旧友也是室友Keith指着大学的课程表上的一门课对我说:“你一定要选这门课。我知道你会喜欢它的”。他说得没错。等到两周过后,我知道:从此我将和计算机结缘。
我的专修是什么呢?当然是图形和游戏。
在大学开始编写游戏是一个漫长而困难的任务。只有对编写优秀游戏抱着一种朝圣者心情的人才有可能成为一个真正的奇客(就像我这样的人)。
奇客指引领时尚、具有原创和新奇精神的人。——译者注 从那时开始,世界发生很多变化。通过现在这些可用的工具,几乎任何人都能够编写出新颖、有创意的游戏。
本书有何不同
游戏编程的入门图书有很多。最终,每个人都会问:“这本书有什么特别之处呢”?
我很高兴你问到这个问题。
简短的答案就是,本书有几个方面与99%的游戏编程入门图书都不同。
本书假设读者不知道如何编写计算机程序
大多数想要开始学习游戏编程的人根本不知道如何编写程序。他们很聪明、有创造性、有创新精神,并且喜欢游戏。但是,他们还不会编写计算机程序。
实际上,我所见过的每一本游戏编程入门图书都假设读者熟悉一门C或C++这样的编程语言。这意味着,大多数初学游戏编程的程序员在能够开始编写游戏之前,先要花数月或数年的时间来学习编程。
这是多大的浪费啊!
如果你想要成为一名游戏程序员,但你的编程经验却很少或者根本没有,那么,本书很适合你。正如我前面所提到的,与25年前我进入这个行业的时候相比,如今可用于编写游戏的工具已经很大地简化了整个过程。对于聪明而富有创造性的人,完全没有理由在学习编写游戏之前,还必须钻过一个又一个无聊的铁圈。你可以同时学习编写计算机程序和编写游戏。不幸的是,大多数游戏编程入门图书的读者并没有碰到这种机会。
本书教给你真正的游戏编程技能
只有少数甚至极少数游戏编程入门图书是写给非程序员的。为了尝试使事情简单,它们教你如何用Basic语言来编写程序。不幸的是,没有什么游戏是用Basic编写的。对于真正的游戏来说,这种语言太慢了。相反,游戏程序员使用一种叫做C++的语言。因此,如果你读了这样的一本(Basic语言编写游戏)图书,而又想编写真正的游戏,你将不得不重新从一门新的编程语言开始学习。
与市面上任何其他的书不同,本书教非程序员如何用C++编写程序。读完本书,对于真正程序员所使用的编程语言,你将会相当精通。
另外,本书说明并展示专业游戏程序员实现动画和声音所使用的技术。此外,还展示向游戏中添加基本的物理特性其实非常容易。
本书教你如何构建一个真正的游戏
很多游戏编程入门图书给出众多花哨的小例子程序来演示所教授的概念。然而,却少有图书展示如何把所有概念用到一个完整的游戏中。这本身就是一种技能。构建一个完整游戏的过程,常常会绊倒那些清楚地知道如何编写单个程序段的人们。
在本书的最后,你将看到如何编写一个完整的游戏。我们将要构建的游戏叫做Invasion of the Slugwroths。与20世纪80年代和90年代的很多游戏一样,它是一个简单的横向卷轴(sidescroller)游戏(稍后将解释这个术语)。
今天的大多数游戏不是使用3D编写的吗?
当然是的。但是,编写3D游戏相当难。如果你从一个Invasion of the Slugwroths这样的横向卷轴游戏开始学习,那么在必须掌握3D概念之前,你将先学会游戏编程的基础知识。这使得学习的过程更加容易并且更富有乐趣。
本书提供编写游戏所需的一切
本书不仅教会你开始游戏编程所需的一切,而且还提供所有的工具。要编写计算机程序,需要编译器、连接器和调试器。这很容易就花掉500美元。别担心,你将会在本书的随书配套光盘上找到所有这些东西,并且完全不需要任何花销。
为了不再编写几乎每个游戏都需要的代码,很多游戏程序员都使用游戏引擎。游戏引擎提供执行游戏中最常见的任务的程序代码。专业的游戏引擎一般至少要100美元。本书在随书光盘中免费提供一个引擎,你无需另行购买。
另外,本书还提供生成音乐、创建游戏图形和测试动画的程序。光盘上所提供的这些开发工具和游戏引擎本身就值这本书的价格了。
青少年和成人都可以使用本书
我曾经多次被家长问起该给他们的孩子买什么样的书来学习游戏编程。二十多岁和三十多岁的成人也经常问我该如何入门。对大多数的图书,我很难推荐,因为它们都过于侧重技术。对于那些没有大学数学、工程学或计算机知识的人来说,它们往往难以理解。
尽管本书并非专门为青少年所写,但是它对每个人都有用。只要你满了15岁,就可以读这本书。青少年和成人都能够在这里找到所需的所有东西。本书解释了所用到的术语和思想,提供编写游戏所需的充足的程序代码(程序是由程序代码组成的)。本书教你编程、计算机图形学和游戏。本书是一站式购物。
本书包括哪些内容
本书分为5部分:
■ 第一部分对编写游戏所需的工具和技能给出一个概览,另外介绍大多数基本的编程概念。
■ 第二部分深入介绍面向对象编程,这是所有专业游戏程序员所采用的一种编程方式。
■ 第三部分展示游戏程序是如何构建的。在这里,你将学会编写第一款游戏Ping,这是一个古老的Pong游戏的模拟版。你还将学习如何为游戏添加声音。
■ 第四部分将你的C++技能提升到能够编写真正游戏的水平。
■ 第五部分教你综合应用所学到的所有知识,并编写游戏Invasion of the Slugwroths,使你全副武装并能够继续编写自己的游戏。
另外,本书还提供一个术语表,说明本书中出现的所有技术术语。此外,还编制了一个内容广泛的书单,其中都是推荐你在读完本书后继续阅读的图书。这个书单将会帮助你继续学习像3D图形这样的内容。这个推荐书单位于本书的随书光盘中。
系统需求
要使用本书光盘中包含的工具,编译并运行各章的示例程序,需要一台至少具有如下配置的计算机:
■ 500MHz Pentium III计算机。
■ 至少128MB的系统RAM。
■ Windows 98第二版或更新的操作系统。
■ 兼容OpenGL的显卡。实际上,当今所有的显卡都兼容OpenGL。
■ 至少300MB的剩余硬盘空间,以安装所有的工具和源代码。如果选择不安装某些工具,只需更少的磁盘空间。
CD收录的免费内容
CD中收录供游戏程序员使用的各种基本工具。下面简要列出这些工具,你可以在电脑上浏览CD获取更多信息。CD放入光驱后将自动弹出一个HTML页面,这个页面给出CD所有内容的列表,其中有一项叫做“Tools,Tools,Tools”,它提供到另一个页面的链接,该页面说明这些是什么工具以及如何安装它们。
注意插入CD时,如果HTML页面没有显示,可点击任务栏中的Windows“开始”按钮并选择“运行”。会出现一个对话框,在其中输入d:\AutorunProexe,其中d是你的CD或DVDROM驱动器的盘符。
■ LlamaWorks2D——这是一个可以用来编写游戏的游戏引擎。我特别为本书编写了LlamaWorks2D的这个版本。使用LlamaWorks2D构建游戏将会节省很多编程时间。另外,它能够处理启动和运行游戏所必需的许多重复的、枯燥的任务。使用LlamaWorks2D,可以在Windows程序的机制上花很少的时间,而把更多的时间花在游戏上。
■ DevCPP——这个免费的C++编译器是编译器、连接器、调试器和程序编辑器的一个综合体。为了编写游戏,你需要所有这些工具。因此,必须首先安装这个程序。
■ Audacity——这是一款出色的免费声音编辑器,可用于录制声音效果并为游戏编辑声音。
■ GIMP——可用于绘制供游戏使用的图像和动画。Windows“画图”是Windows所带的一个免费程序,但其功能却不足以绘制专业的图形。因此,本书提供一个GNU图像处理程序(GNU Image Manipulation Program)。使用这个功能强大的程序,可以绘制出程序运行时屏幕上需要呈现的所有内容。
■ 更多工具——除了这里提到的工具,CD还提供重要图形和声音技术的文档,以及一个出色的声音生成程序、一个图形文件格式化转换工具、一个3D图形生成程序和一个动画测试器。请浏览CD了解详情。
安装说明
CD中的程序的安装非常直接。在插入CD时所显示的主页上,有一个叫做“Tools,Tools,Tools(工具)”的项。该项中有一个链接。点击该链接时将会看到一个名为“Installing the Free Tools(安装免费工具)”的页面。在这个页面上可找到想要安装的工具。对于大多数工具,都有一个安装链接。单击安装链接,就会自动安装程序。少数工具必须复制到硬盘上。工具的安装部分包含如何复制的说明。
编译示例程序
本书包含很多示例程序,它们展示了本书所讲授的概念。为了看到这些程序,必须要编译它们。这些程序的编译过程略有不同。为了便于读者编译,这里提供如何编译每个程序的说明。你可以在CD上找到这些编译说明。要查看这些说明,可以把CD插入到CD或DVD ROM驱动器中。在弹出的HTML页面上,可以看到一个叫做“Compilation Instruction(编译说明)”的列表项。点击这个链接,将弹出一个名为“Compiling the Sample Programs(编译示例程序)”的HTML页面。这个页面包含按各章组织的一个示例程序的列表。单击各个链接即可查看如何编译每个具体的程序。
另外,CD还提供每个程序的一个已编译版本。它们都在各章的Bin(binary的缩写)文件夹中,在“Compiling the Sample Programs”页面上可以看到指向每个Bin文件夹的链接。
作者自我介绍
1981年我进入大学不久,当时我拿到第一份专业编程合同,从此开始进入计算机行业。我的大部分职业生涯都集中在图形、游戏和网络编程方面。大学毕业后,我为用于军用飞机的图形显示控制器编写固件。此后几年,我在大学讲授编程课程。接下来,我的职业变化使我能够实现自己长期以来的目标——成为一名专业游戏程序员。我为American Laser Games公司、Her Interactive公司和Microsoft公司编写游戏。
我从1987年开始写书。我的第一本书是向西方儿童讲述远东和印度民间故事的故事集。从那时开始,我还编写了一系列的计算机图书。
我玩过太多的游戏。如果不是为了妻子和孩子,我可能会沉迷于其中而很难回到现实生活。
我还有很多计算机图形、游戏、写作和授课的经验。我希望能够帮助读者尽快入门游戏编程,并且轻松地完成学习过程。游戏编程使你作为一个程序员、设计师、艺术家、作曲家和一般意义上的“疯子”而收获颇丰。
请阅读本书并尽享快乐。快乐正是游戏的初衷。
谨以此书献给我的母亲Jan Conger,
为她曾经做过的和正在做的善行。
致谢
本书是我所从事过的最艰难的项目之一,并不是因为本书本身很难写,而是因为电脑曾摔坏三次(其中两次都更换了主板),我自己经历两次重病、两次手术,此外在第3章以后必须更换编译器,并且在第4章以后必须完全重新编写游戏引擎。我可以坦诚地说,如果没有所有那些为本书付出劳动的人的支持,本书将无法完成。特别要感谢Kristin Kalning,他是我所遇到过的最好的项目编辑。还要感谢Davina Baum、Liz Welch、Myrna Vladic、Owen Wolfson、Eric Geoffroy、Aren Howell和Denise Lincoln。
特别要感谢Ron Little。他为本书做了出色的技术编辑工作。如果没有他对最后5章的示例程序的帮助,我现在可能还在继续为本书忙碌。
您喜爱视频游戏吗?您是否想开发一款自己的动感游戏?这并不像想象的那样复杂,也不要求您是数学家或编程天才。本书介绍编写第一款游戏"Invasion of the Slugwroths"所需的一切。 本书作者带领读者从头做起,介绍当前最热门的商业游戏编程语言C++的开发工具和基本概念。本书配合丰富的示例,循序渐进地讲授游戏编程结构、集成声音和音乐、浮点数数学、C++数组等,还提供示例程序及其源代码供读者在学习的过程中参考。
David Conger拥有23年专业编程经验,期间编写过大量客户业务应用程序,以及多个PC机游戏和在线游戏。他还致力于军用飞机的图形固件,并在大学执教4年计算机课程。他撰写过大量C、C++和其他计算机的图书。
David Conger:David Conger: David Conger拥有23年专业编程经验,期间编写过大量客户业务应用程序,以及多个PC机游戏和在线游戏。他还致力于军用飞机的图形固件,并在大学执教4年计算机课程。他撰写过大量C、C++和其他计算机的图书。
谯谊 刘红伟:暂无简介
在过去的10年里,游戏的发展经历了巨大的变化。从最初的电视游戏机、掌上游戏机等简单的游戏设备,到现在的电脑单机游戏、网络游戏、街机游戏、手机游戏等等,游戏在人们的娱乐生活中占据了越来越重要的地位。
作为游戏的玩家,我们可能玩过数十种甚至上百种不同的游戏。可对于这些游戏是如何设计、开发和实现的,大多数人却知之甚少。沉浸在某一款游戏的欢乐之中的时候,也许我们会产生揭开它的面纱一探究竟的愿望。可是我们往往缺乏触及游戏开发的机会。就在短短的两年前,市面上还很难找到有关游戏开发的技术图书。而今天,走进任何一个稍具规模的书店,都不难找到这样的技术图书。一些中型、大型的书店甚至设立了游戏开发图书专柜。这一变化,也从另一个侧面反映了游戏产业在最近几年的飞速发展和变化。
那么,本书和市面上大多数的游戏开发类图书相比较,有什么显著的特点呢?
首先,本书假设读者不知道如何编写计算机程序,也就是说,它是针对游戏编程的初学者。在希望成为游戏程序员的朋友当中,不知道如何编写计算机程序的人占相当大的一部分。很多人是由于热衷于玩一款游戏,激发起了解和学习游戏开发的动机,从而进一步接触和认识游戏开发的。而本书非常适合于这样的读者。当然,如果读者有程序设计的基础,那么,阅读和学习本书将会更加容易。因此,阅读和学习本书的“门槛”很低。
其次,本书教授如何使用C++语言编写游戏。我们知道,C++语言在游戏开发中占据非常重要的地位。要想成为真正的专业游戏开发人员,掌握C++游戏开发技巧是不可或缺的。因此,本书的目标是教给读者真正专业水准的游戏开发技能和方法。
再次,本书通过构建真正的游戏实例向读者展示完整的开发过程,从而综合应用本书介绍的所有知识和技能;而不是通过小的游戏实例来一点一滴地进行“游击式”的教学。本书这种通过真正游戏实例来整合知识和技能的方法,对于读者成长为专业的游戏程序员非常有帮助。
最后,本书为读者提供编写游戏所需的一切。本书不仅教会读者游戏编程入门所需的一切,而且还提供所需的所有工具,包括编译器、连接器和调试器等等。这些都包含在随书配套光盘中。为了不再编写几乎每个游戏都需要的代码,很多游戏程序员都使用游戏引擎。游戏引擎提供了执行游戏中最常见任务的程序代码。本书的光盘为读者提供了免费的游戏引擎LlamaWorks2D。读者在今后的开发中可以直接拿来使用。此外,作者还提供了生成音乐、创建游戏图形和测试动画的程序。可以毫不夸张地说,本书为读者提供了开发游戏所需的“百宝箱”。
作为本书的译者,非常高兴能够有机会把这样一本游戏开发技术图书介绍给读者朋友们。本书主要由谯谊和刘红伟翻译,其他参与翻译的人员还有景文正、党耀云、安宁宁、王志刚、李振胜、楚亚军、李秋强、景文生、孙海军、景龙等。由于译者水平有限,本书中难免存在一些错误或疏漏,恳请读者朋友们批评指正。
译者
2006年6月
译者序
前言
致谢
第一部分基 础 知 识第1章成为游戏程序员需要什么
11编程技能
111计算机程序是什么
112C++编程语言
113游戏编程工具
12计算机图形学
121计算机图形学基础
122在计算机屏幕上显示图片
123实现游戏动画
13游戏设计技能
131构造游戏代码
132让游戏变好
14美术技能
15声音和音乐技能
16小结
第2章编写C++程序
21DevC++编译器简介
211创建一个项目
212编写程序
213编译和连接程序
22用C++编程
221main()的内容
222变量
223输出到屏幕
224从键盘输入
225流和include语句
226函数
227基本数学运算
228循环
23Windows 编程
231WinMain()
232消息和消息处理
24游戏编程
241什么是OpenGL
242什么是OpenAL
243OpenGL、OpenAL和Directx
25小结
第二部分游戏中的面向对象编程第3章面向对象编程简介
31软件对象
32类
321成员数据
322成员函数
323构造函数和析构函数
324内联成员函数
33逻辑运算符
34ifelse 语句
35名字空间和域解析
36结构简介
37小结
第4章LlamaWorks2D 游戏引擎简介
41分步概览
411第1阶段:创建一个DevC++项目
412第2阶段:配置DevC++项目
413第3阶段:编写一个游戏类
414第4阶段:编译和运行这个程序
42LlamaWorks2D 是如何工作的
43一个静止的球
44一个弹跳的球
45得到好的结果
46小结
第5章函数重载和运算符重载
51什么是重载
511重载函数
512重载运算符
52用重载实现一个向量类
521重载vector构造函数
522向量的加法和减法
523向量的乘法
524向量的除法
525“运算符等号”式运算符
526大小
527单元向量
53小结
第6章继承——事半功倍
61什么是继承
62派生类
63受保护的成员
64覆盖基类函数
65使用继承定制自己的游戏
66小结
第三部分游戏开发基础第7章程序结构
71程序结构概述
711设计游戏对象
712设计游戏任务
72文件结构
73Ping游戏
731Ping简介
732编写Ping
733创建游戏对象
734映射其他的Windows消息
735初始化程序
736初始化游戏
737初始化关卡
738处理消息
739更新帧
7310渲染帧
7311消除关卡
7312消除游戏
74小结
第8章声音效果和音乐
81声音效果和音乐是情感
82存储声音数据
821数字化声音
822MIDI文件
823声音存储技术比较
83LlamaWorks2D中的声音效果
831载入声音
832播放声音
833添加背景音乐
834控制音量
84噪音、悦耳的噪音
841寻找声音效果
842制作自己的声音效果
85播放有趣的音乐
851寻找音乐
852制作自己的音乐
86小结
第四部分C++进阶第9章C++中的浮点数数学
91深入剖析浮点数
911浮点数和精度错误
912浮点数和舍入错误
92案例学习:浮点数和游戏空间
921什么是游戏空间
922编写一个使用浮点数的向量类
923CannonShoot:一个使用中的游戏空间
924介绍cannonshoot类
925实现cannonshoot类
926创建cannonball
927创建cannon
93小结
第10章数组
101什么是数组
102声明数组和使用数组
1021二维数组
1022三维数组
103初始化数组
104数组边界的问题
105小结
第11章指针
111为什么指针对游戏很重要
112声明和使用指针
113指针和动态内存分配
1131分配内存
1132释放内存
114指针和继承
115数组是伪装的指针
116小结
第12章文件输入和输出
121游戏和文件I/O
122文件的类型
1221文本文件
1222二进制文件
123小结
第13章深入真正的游戏开发
131活起来的精灵
1311精灵和动画帧
1312LlamaWorks2D中的动画精灵
1313修改CannonShoot
132高速输入
1321立即模式输入简介
1322Ping和立即模式输入
133小结
第五部分大回报第14章严阵以待
141开发一款真正的游戏需要什么
142游戏设计基础
1421良好游戏设计的要素
1422游戏设计过程
143设计Invasion of theSlugwroths
1431头脑风暴
1432目标
1433体验
1434外观
1435钩子
1436设计文档
144小结
第15章Captain Chloride 行动起来
151引入Captain Chloride
1511设计chloride类
1512实现chloride类
152整合到游戏类中
153小结
第16章Captain Chloride的世界
161新的Captain Chloride
162LlamaWorks2D中的关卡
1621XML关卡文件
1622Invasion of the Slugwroths的一个关卡文件
1623解析关卡文件
1624载入一个关卡
1625更新一个关卡
1626渲染一个关卡
163小结
第17章Captain Chloride遇到实体对象
171撞倒一扇实体门上
1711冲突管理
1712一个基本的门
1713能够发生冲突的CaptainChloride
1714Captain Chloride实际冲突
172捡起钥匙
1721可以捡起的对象
1722让Captain Chloride捡起东西
173让门打开和关闭
173125维的奇遇
1732实际使用25维编程
174小结
第18章大结局
181巩固知识
182坏人登场
1821设计一个简单的Slugwroths
1822实现Slugwroths类
183游戏附加内容
184结语:并非终点
术语表