Advanced 2D Game Development

我在这里翻译一下Jonathan S. Harbour 的作品 Advaced 2D Game Development 由于百度没有找到译文,里面难免有错误希望大家指正。

后面我将会对关键技术进行翻译。。。。有兴趣了解一下原书。

 
 

 

第一章
建造一个2D游戏引擎
游戏开发是类似于建筑和工程。仅仅像一个建筑设计出一个建筑项目,就像建一座桥梁或者一栋摩天大厦,所以一位游戏开发者或者一个游戏建筑师在设计游戏建筑项目时,大部分的设计师使用很多方便工作工具。仅仅像一位建筑工程师建造大桥和摩天大楼,设计却通过建筑师来完成。所以一位软件工程师在写游戏的时候,设计却通过设计师来创造。游戏开发包括艺术和工程学。

我想你会同意的,一个建筑工程学团队自己不可以做任何事情,在建筑师没有一个蓝图的创立时。他们不能甚至不能开始工作在没有蓝图的基础上。例如时装,一个软件工程学团队不能自己做任何的事在没有软件蓝图(或者是设计文档)。

游戏开发一共包含这些领域,而且游戏开发方法论已经在模拟这两方面建筑学和工程学投入了很多研究在过去的十年里。很多工具都是相同的。一位游戏设计师为游戏创造一本设计文档(或者是蓝图),里面写满了艺术概念和高质量的详细规格说明。为了让一个工程学团队完成游戏设计,一本真正优秀的文档可以理论上完全传递到位。但事实上,这是一个罕见的例子因为--像摩天大厦--一个游戏是一项纪念价值的项目,对于设计师要完成仅仅是相当巨大的项目包括设计的前前后后。所以,建筑师或设计师在建造的时候都是跟工程学团队一样的亲近。

程序的例子来源于久时的大型电玩游戏,目的是学习的过程,当你已经很熟悉玩这些机械游戏(那是源于趣味性--一个术语借助著名游戏学领域),这样是很容易在源代码上工作去完成一个游戏开发,因为游戏的设置已经很熟悉,而且规则都常常很简单。例子包括雅达利经典像太空入侵者和越狱,这些在现今的领域都是没有腐朽,但仅仅是因为这些是简单的游戏都是很好的学习例子,(例如,大部分这些游戏在精灵检测碰撞是非常有用的。)

编译支持

为了开发一个游戏引擎是会很难--虽然我们的目标是建立2D游戏多于3D游戏--我们将会获得很多从编写代码的过程而不仅是束缚在一些单一的开发工具(我是喜欢叫游戏厂商)。换句话说,一些不同的编译器在编译书中的工程是不要修改。你可能会惊讶可以这样“偷懒”在你编写c++代码时,可以实习这些当你熟悉使用厂商的工具(想Visual C++)和工具的特点。我已经用Visual C++运行许多次代码生成警告--如果没有错误--其它的编译器(像GCC)。编写代码时使用不同的编译器可以帮助你写出健壮的代码和规避漏洞。一个很好的例子是微软的sprintf_s函数,在C标准库里面是不存在的-这是一个定制的版本关于sprintf在微软的类库中,值得注意这些问题就像这样,你可以学会如何完全回避。(既然这样,我更喜欢使用std::ostringstream 取代字符串的使用。)

我喜欢的编译器不是Visual C++.我不是反对微软--他们开发DirectX,毕竟,我们的大部分引擎以这为基础。问题是Visual C++在编译器家族中产生各种各样的不和竞争。现在有一系列几代的编译器不兼容彼此--版本从1998,2003,2005,和2008.都有各自的特点。然而老的Visual C++6.0追溯到1998版可能在现在视为过期了,我确切的希望Visual C++7.1从2003版仍然有用。但是事实这种情况没有一种版本可以相互兼容。如果你建立的工程项目用第一个版本,这将会很可能不可以工作。因为这将会很困难令到那些拥护Visual c++有志向的C++程序员(也就是菜鸟),经常假设这样的产品名称是一项重要测试兼容性--如果是被叫Visual C++,这样将会编译Visual C++ 代码,对吗?嗯嗯。一个可以假设很多,但是摆在事实面前每一个新版本都打破前一个版本的兼容性的情况,在没有将这些奇怪的问题混合投加到一起时,软件是足够复杂的。当专业的开发者在和兼容性问题做斗争时,这个不知道是一个怎样的噩梦!

所以,我们怎样可以解决这些问题?最重要的事情是我们在编写代码编译时在使用这些编译器。为了全部的意图和目的,每个版本的Visual C++必须看作不同的编译器。这样会帮助我们将它们视为不同的厂商,自从微软顺这潮流改变发展方向--和这会令到C++程序员感到失望,因为发现在用最新的编译器编译一年、两年、三年前的老的工程和类库时发现不能成功。(今天已经是事实。)

下面列出的编译器在现在还在使用,哪个可以编译全部书上的工程和列子。明确的,我关注Dev-C++5.0和Visual C++2005 SP1 这两个编译器可以提供给工程,这些都在书上的CD。由于工程配置的方法,你将会发现很容易添加存在的配置到编译器里面支持--只要兼容DirectX 9类库,你的编译器就可以使用。注意在微软一系列的编译器里,有专业版,企业版,和快速版提供大部分相同的功能。
* Dev-C++ 5.0(MinGW/CygWin)
* Borland C++ 6.0
* Visual C++ 7.1(2003)
* Visual C++ 8.0(2005)
* Visual C++ 8.0(2005 SP1)
* Visual C++ 9.0(2008)

建议
粗体画出来的编译器在列表中出现在CD上。

如果你完全是游戏开发新手,你将会发现这本书很有挑战性,因为我们不需要基础在那方面--这是一个进阶的题目。然而,如果你不确定在那里开始。我建议你使用Dev-C++5.0(技术上讲这个版本是4.9.9.2 beta 版)。为什么?首先, Dev-C++是基于世界级编译器GCC,这个编译器使用在大部分专业控制台开发工具(像系统 Wii 和 PS3).第二,Dev-C++ 很少有依赖性,和它的二进制执行代码(建造用GCC)不会像Visual C++在文件中植入。

建议
翻译者查阅资料:(Windows XP通过XML文件来实现这一功能,这些XML文件保存了有关应用程序配置的元数据,这里所说的XML文件,就是Manifest清单文件。
Manifest事实上就是一个以.manifest为后缀的XML文件,用于组织和描述隔离应用程序及并行组件,其内部的信息如<assemblyIdentity>元素则标识着一个唯一的程序集,和其他信息一起,他们用于COM类、接口及库的绑定和激活,而这些信息,以往都是存储在注册表中的。另外,Manifests也制定了组成程序集的文件及Windows类。)

一个清单文件描述为运行时库要求运行一个可执行文件建立在Visual Studio(任何语言)。这个清单文件是支持剔除DLL依赖问题,这样开发者们要处理微软过去的版本开发工具。然而,“DLL 噩梦”一直取代为“清单 噩梦”,从某种程度上说很多的Visual C++ 程序将不能甚至不能编译运行在相同的PC机上。

我们想尽可能写进阶2D游戏用最少的困难方式,这就是我为什么制作这么多的好的建议从开始。如果你使用一个复杂编译器,计划去使用这样的软件,去挑战这与生俱来的复杂性。。但如果你不需要超负荷的特点,使用一个简单的编译器(像 Dev-C++)将会令到游戏开发同样的简单和没有痛苦。

建议
在2007年末,Firaxis游戏厂家将仍旧使用Visual C++2003.你可以告知下载最近 文明IV SDK (超越刀剑的发展)。这是一个相当普通的情况在游戏引擎开发工具“mod”。


DirecX SDK 支持微软官方 DirectX SDK 可以从i http://msdn.microsoft.com/directx/sdk 下载。现在的版本是9.21.1148子啊2007年11月发布。然而,我们不使用Direct3D 10--这本书不会涉及超过Direct3D 9的范围。如果你在使用Dev-C++,你不需要微软的DirectX SDK,只要运行程序。

建议

Direct3D 只是DirectX组件,已经升级到 版本10(现在已经是11)。不是其它组件(DirectSound, Directinput, 等等)改变太多自从2004年起。这样意味着DirectInput需要变得更好和需要升级,仅仅像 DirectSound 支持的非常漂亮的音响系统和3D位置声音在没有需要未来升级。然而, Direct3D会升级来保持和最近的图形硬件的发展。

我推荐你使用老一点的DX版本,虽然你正在使用Visual C++.虽然在2007年11月或更后的未来可能会工作,这个没人可以担保,像微软也不能尽力保持向后兼容性。例如, 2006年10月release版是一个很好的版本,是我经常使用的一个版本(这个版本在CD上提供)。只是刚好记住这个建议当用来游戏开发--最近和最棒的工具不是总是完美适合每一个游戏工程项目。

建议
我们不用学习DX这样的基础在这本进阶的书上。如果你重来没有写过一行DX代码在你的人生中。 这样你首先将会需要一个快速教程。我推荐 Beginning Game Programming.2nd Edition(Course Technology,2006),这个将会教你全部的基础一步一步来。前四分之一章是涵盖Windows 程序设计之后是进入到DX,和只有环境照明包括一个简单的例子给初学者演示。

 

为什么我们需要一个引擎?


一个游戏引擎的目的或者优势,对照来说,仅仅是一个游戏编写全部代码的需要?为什么投入全部时间来创造一个游戏引擎,当你可以花这些时间仅仅是为了写游戏?

这些有价值的问题说明我要深思好些年在开发小型和大型游戏项目才能回答(特别这些是大学课程)。这个简单的回答是:你不需要一个引擎来写一个游戏出来。但是那是一个过于累赘的回答,因为这意味这两者中有一个是理由1)这游戏很简单,或者2)你已经有很多代码在过去的项目。第一个含义是你可以仅仅用DX或者OpenGL写一个简单的游戏。第二个假设你已经有一些代码而且可用,可能在一个游戏的类库里--里面填满你已经写好和重用。一个游戏的类库可以节省很多时间。例如,在使用2D艺术插图或3D纹理可以给出函数,你将可以载入位图文件,和你已经写了这样的函数,你不想再一次在接触它,因为这是个好的服务目的,任何时候你要打开一个函数和修改它,这是一个好的迹象在你开始师不是很熟练编写代码。(再一次,这可能你会获得新的认识和想改善你的函数,这样做是值得。)

在我看来,有三个关键原因为什么一个游戏引擎将会帮助一个游戏开发项目进行:团队合作,支持交叉编译程序,和后勤。让我们检测各自的原因。

1.团队合作是很容易,当程序员在使用一个游戏引擎在团队里比编写他们自己的游戏代码要容易,因为引擎代码促进整个项目的标准。然而每一个程序员有他或她自己处理定时的首选时,或者渲染应该怎么完成,一个游戏引擎有一个高速游戏循环来迫使每个在团队工作要按照引擎的特点。什么是产品特点的缺少?经常一个或两个团队成员将会成为“引擎的车头”,这些是一个团队需要主要的机座。

2.在没有使用游戏引擎,交叉式编译器是不可能支持大部分的编译。虽然很多程序员擅长编写标准的C++代码,这会在不同平台和编译器上建立,游戏代码通常没有分成那块领域由于它的独特要求(换句话说,渲染)。交叉编译器支持是指能够编译你的游戏用两个或更多的编译器,好过你最喜欢使用的编译器(像Visual C++)。

建议
用不同厂商提供的编译器来写代码和建立项目,在一个没有任何提示的特殊平台上,可以教会你更好地编写标准的代码。很困难的一件事是编写平台独立的代码!准备好接受严峻的练习吧!

3.在没有一些协调的方法去组织游戏里的物体,进程,和行为的时候,后勤在一个大型游戏项目中会变成噩梦。后勤是关于组织和支持一个大型系统的问题,和经常用于军事行动(例如,军事战争-装备,供给品,救援部队)。军事游戏包括人物,交通工具,场地物品,敌人,炸弹和战争场景-换句话说,一个游戏里面的“材料”。没有一个系统在一方面支持组织这些东西,这个游戏的源代码会变得很难操作和混乱。

让我们用一句简单的话来总结全部的观点:一个游戏引擎可以让这变得容易--有时候是出奇的容易--去制作一个游戏。对比起像那些从头开始用自己喜欢的API来制作游戏的问题,想像使用 Direct3D 或者 OpenGL 来画图,DirectInput来控制鼠标和键盘支持,网络就交给Winsock,FMOD是用来音响等等。对于一位游戏开发者来说,要让军事游戏一直跟上最新升级的全部类库是一个噩梦。但是通过封装全部类库和全部你自己熟悉的游戏代码到游戏引擎里,在每个游戏中你可以消除组织维护全部类库(包含他们的初始化和退出)带来的头疼。我提出来类似这最好的是:“按照自己的轨道走吧”游戏代码给每个游戏项目就像是用自己的砖堆砌,钉子锻造和木材来建造一个简单的房子。为什么你要这样做?这确实是需要做的!

但是可能最重要的好处是封装一个API(像 DirectX)到你自己的游戏引擎类,这是为了大约提供一个缓冲处理,因为API的不可预言的修订。无论何时一个改变发生在一个类库中,你可以有规律使用在你的游戏里,在这个过程中你可以适应这额改变在你的引擎类里就没有必要去修改任何的游戏代码。在当今软件兼容性问题已经是基于我的评论,这是一个你要认真听进出的特别重要观点。

创造游戏引擎项目


我们在这一章将会创建代码游戏引擎项目和在接下来的半章去扩展全部我们需要建立进阶2D游戏的特性。这章开始是代码引擎的开发,将会包括WinMain,Direct3D的初始化,D3DXSpirte的初始化,最基础开始游戏事件的函数是(game_init(),等等),定时器和
自动帧频率维护,当然,一个游戏的循环。最棒的事是关于正确的完成这些,在开始,我们不要重复任何这些代码在后面的章节--这些都会被嵌入到游戏引擎里面。

让我们开始创建引擎项目,这样我们在未来就会有一个基础去讨论设计我们的引擎。引擎类嵌入一个命名空间叫Advanced2D。这个命名空间将会包括全部的游戏类,这样在你游戏里使用就不会跟任何类库发生冲突。我将会详细重温两个编译器如何创建项目和告诉你那些类库需要包括进出项目中,这样你可能再次参考这一章在未来的项目里。我们将会建立引擎项目(哪个你要创建)在没来的章节。

Dev-C++ 项目


(注意:如果你正在使用Visuall C++,你可能要跳过这个部分。)Dev-C++5.0是一个window现代的C++编译器基于GCC MinGW工具,和这个可以从书上的CD上安装。真正的版本时间是4.9.9.2。你可能会点击www.bloodshed.net 升级。Dev-C++默认包含兼容Win32,意味这你可以编译window代码用GCC版本的windows API.这个API是已经刚涵盖类库文件(像gdi32和winmm)。类库文件的扩展名是GCC类.a,然而Dev-C++包含Win32API,已经是简化的配置。

然而,DX是不包含的,所以我们必须安装它。这个DX SDK是微软发布,但不能用于Dev-C++(因为类库文件的格式),但是有第三方版本可以用于Dev-C++(和GCC大致编译器),在书上的CD有可用的。

 

首先,安装Dev-C++如果你已经做好了。安装包在CD-ROM,或者你从www.bloodshed.net/dev/devcpp.html。接着,你要安装Dev-C++,这样你可以安装DX DevPak,不管是从CD上还是URLhttp://www.dgrigoriadis.net/post/2004/06/26/DirectXDevPak-for-Dev-Cpp.aspx(翻译者发现原书不可以下载,这个连接是可以下载的)下载。(确定是下载DX9.0C版本)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值