




已阅读5页,还剩137页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3D游戏编程入门(C#) 目录 第I部分 Microsoft .NET简介第1章 游戏开发和托管代码. 31.1 什么是.NET?. 31.2 什么是托管代码. 51.3 使用Microsoft Visual Studio .NET 2003 IDE编写代码. 51.3.1 C#代码. 61.3.2 VB .NET代码. 81.4 在命令行中编译.NET代码. 91.5 游戏开发简述. 101.6 开发人员. 101.7 游戏开发过程. 111.8 工具. 121.9 小结. 16第II部分 图形和游戏1的介绍第2章 策划第一个游戏. 192.1 提出游戏构想. 192.2 理解一个3D游戏的需求. 212.3 游戏规范. 242.4 小结. 26第3章 理解示例框架. 273.1 创建项目. 273.2 枚举所有设备选项. 323.3 小结. 39第4章 在屏幕上显示. 404.1 创建设备. 404.2 开始绘图. 474.3 加载并绘制网格. 484.4 在场景中添加照相机. 514.5 小结. 54第5章 完成代码. 555.1 理解高分辨率计时器. 555.2 处理丢失的设备. 605.3 添加帧速率输出. 635.4 设计UI界面. 655.5 设计按钮. 725.6 小结. 75第6章 实现用户界面. 766.1 设计主菜单. 766.2 插入到游戏引擎中. 816.3 选择人物(Loopy). 846.4 利用新界面更新游戏引擎. 916.5 小结. 95第7章 实现玩家和块. 967.1 编写Player对象. 967.2 设计块. 1047.3 小结. 110第8章 实现级别对象. 1118.1 实现级别. 1118.2 控制玩家的移动. 1168.3 处理级别的更新. 1198.4 小结. 123第9章 综合应用. 1249.1 包含玩家. 1249.2 挂钩级别. 1289.3 实现退出界面. 1329.4 结束工作. 1359.5 小结. 140第III部分 基本的数学规则第10章 3D数学快速入门. 14510.1 2D与3D. 14510.2 使用3D点. 14710.3 操作3D对象. 14810.3.1 平移(移动)对象. 14910.3.2 缩放. 14910.3.3 旋转. 15010.3.4 坐标系. 15010.4 数学结构. 15110.5 向量. 15110.6 矩阵. 15410.7 小结. 157第IV部分 间接图形、对等网、游戏2第11章 开始创建游戏. 16111.1 Tankers 下一个游戏构想. 16111.2 创建Tankers项目. 16311.3 项目的图形绘制. 16911.4 为纹理构建对象池. 17111.5 小结. 173第12章 开发更先进的用户界面. 17412.1 使用Blockers的基类(Base类). 17412.2 添加新的基类. 17912.3 实现主界面. 18212.4 利用用户界面绘制3D模型. 18912.5 小结. 193第13章 绘制真实的坦克. 19413.1 理解网格层次结构. 19413.2 加载坦克层次结构. 19713.3 绘制网格层次. 19913.4 操作坦克. 20113.5 坦克的属性. 20413.6 创建照相机类. 20713.7 小结. 210第14章 天空?级别?玩家!. 21114.1 没有天空的世界将是黑色的世界. 21114.2 有了一个天空,但坦克不能驱动到那里. 21414.3 控制坦克. 21614.4 IMoveableObject接口. 22514.5 基本碰撞检测. 23114.6 小结. 234第15章 准备,瞄准,开火!. 23515.1 实现Ammunition类. 23515.2 Bullets集合. 24215.3 完成玩家. 24315.4 添加声音. 24515.5 小结. 248第16章 避免单人游戏的枯燥. 24916.1 使用DirectPlay. 24916.2 创建会话. 25516.3 加入会话. 25716.4 事件处理程序. 25816.5 发送及接收数据. 26016.6 小结. 265第17章 完成Tankers游戏. 26617.1 插入到游戏引擎中. 26617.2 绘制游戏. 27217.3 小结. 275第V部分 高级绘图、客户/服务器网络和游戏3第18章 添加特殊效果. 27918.1 实现基本粒子系统. 27918.2 绘制粒子系统. 28718.3 将各部分连接到一起. 29018.4 小结. 292第19章 构建自己的游戏. 29319.1 阐明思想. 29319.2 创建自己的项目. 29419.3 设计用户界面. 30019.4 小结. 305第20章 可编程流水线. 30620.1 定义可编程流水线. 30620.2 使用HLSL. 30720.3 编写Vertex Shader. 30920.4 使用着色增加逼真度. 31420.5 添加Pixel shader. 31520.6 小结. 317第21章 控制细节的级别. 31821.1 简化网格. 31821.2 使用简化的网格. 32221.3 使用渐进网格控制细节的级别. 32321.4 小结. 324第22章 使用绘图目标创建特效. 32522.1 绘制跑道和多辆卡丁车. 32522.2 创建绘图目标和表面. 33122.3 将场景绘制到绘图目标. 33322.4 演示后视镜. 33422.5 小结. 335第23章 理解高级渲染语言. 33623.1 理解老的shader模型的限制. 33623.2 添加卡丁车镜面高亮. 33723.3 逐pixel镜面高亮. 34023.4 小结. 343第24章 关于性能的注意事项. 34424.1 事件模型和Managed DirectX. 34424.2 生成本机程序集. 34524.3 Boxing恶梦. 34624.4 Managed DirectX的速度. 34824.5 理解方法的开销. 34924.6 小结. 350第VI部分 附 录附录A 开发级别创建器. 353成为游戏开发人员的条件我所遇到的每一个开发人员都至少在某一段时间想成为一个游戏开发人员。对于很多人来说,视频游戏不只是空闲时的一种爱好,他们完全被游戏所吸引。人们沉浸在这些虚拟世界中,常常梦想由自己创建如此神奇的天地。不要被美丽的图形、奇妙的故事情节和感人悦耳的音乐所愚弄,编写游戏是非常困难的工作,只有某些特定的开发人员才能够获得成功。除了所需要的技术天赋之外,一个优秀的游戏开发人员应当拥有其他一些技能,例如,您首先是一个游戏爱好者。如果不是游戏爱好者,则不可能编写出伟大的游戏,这一条件使得游戏开发工作更具有挑战性。成为游戏开发人员确实不是一件容易的事情。如果没有经验,则不会被游戏开发公司聘用,并且当没有公司聘用时,将更难以获得经验。当前只有少量的课程以及某些学校专注于讲授游戏的开发。但是,入门的最好方式是制作一个样片(demo reel)。它能向您未来的老板展示您的能力和处理事情的方式。通过本书,您将制作出一个引人注目的样片。读者对象我常常被问到:“为什么每个人都想使用.NET Framework编写游戏程序?”。其他的问题包括:“.NET Framework不是只用于Web服务器应用程序的吗?”,“它不是很慢吗?”,等等。对于游戏开发人员(或者未来的游戏开发人员)来说,这些都是很重要的问题,但他们误解了.NET Framework。.NET Framework不是最新的Web服务器版本,也不是任何服务器组件的扩展。当然能够使用.NET Framework创建强大的Web服务器应用程序,但是,这并不是它们的全部功能。.NET Framework包括一种功能强大的客户端应用程序编程接口(API)以及Managed DirectX,实际上.NET开发人员需要掌握整个DirectX API。利用它能够编写很多新的应用程序,包括游戏。如果认为.NET Framework只能够编写服务器应用程序,则显得有一点单纯。您也可以利用它创建复杂的客户端应用程序。关于.NET的性能问题仍然存在,这些问题也很难简单描述。当引入一门“新的”语言或者运行库时,开发人员在采用之前,通常比较犹豫。不久以前,很多游戏仍然是采用汇编语言编写的,因为游戏开发人员不相信C或者C+语言足够快。.NET Framework也遵循这个规则。在证明.NET Framework的性能之前,游戏开发人员都会以一种怀疑的眼光看待它。在本书中,大量的游戏是使用.NET运行库开发的。事实胜于雄辩,与其喋喋不休地讨论.NET运行库的性能有多好,还不如让本书中一些真实的游戏来证明这一点。为什么使用.NET Framework任何曾经编写过Windows程序的人都(无论是否使用.NET Framework)能够认识到,即使使用Win32 API编写简单的Windows应用程序都比较困难。设计.NET Framework的目的是提供一种较简单的方式来执行在Windows程序中一些常见的事情,并且为普通的开发人员自动处理很多问题,例如内存的管理。利用.NET Framework,开发人员可以省去很多麻烦的任务,例如花费三天的时间寻找一个内存泄漏bug,他们可以将一些功能直接添加到正在编写的游戏里面。很多情况下,从游戏中删除某些好的特性是因为需要花费大量的时间解决问题,而这些问题.NET Framework已经为您解决。.NET Framework的另外一个令人感兴趣的特性是语言的中立性。只要所使用的功能兼容公共语言规范(Common Language Specification,CLS),则可以采用任何能够使用CLS兼容功能的语言。过去,Visual Basic开发人员转向使用严格的C+进行编码时,可能比较困难。现在,Visual Basic .NET开发人员能够较容易的转向C#,因为这两种语言之间仅存在较小的语法差别。本书中的代码是使用C#编写的。本书的目的编写本书的目的是为了满足游戏开发群体的需求,他们缺少关于本书主题方面的信息。由于不能找到所需要的信息,太多可能成为优秀游戏开发人员的程序员选择了退出。目前市场上的多数游戏开发书籍是关于2D图形的,它们是比较好的起点,但现在编写的多数游戏几乎全是3D图形的,并且现在的游戏爱好者也希望如此。并不是不需要继续编写2D游戏,但是如果那是游戏开发人员所能够做的所有,则他所做的可能毫无用处。本书并不教导您如何去编写一个价值数百万美元的游戏。而是给出所有的工具和信息,让读者自己学会如何开发3D游戏。在阅读本书的过程中,将实现两个完整的3D游戏,阅读完本书后,读者将能够设计并实现自己的3D游戏,以使自己成为一名优秀的游戏开发人员。本书中最后的游戏将留给读者作为一个练习。作者简介Tom Miller是Managed DirectX API的设计师和首席开发人员。自1997年开始,他工作于Microsoft公司。他最初在Visual Basic组工作,后来他喜爱上了游戏和游戏编程,因此进入了DirectX组。自1999年末,他在DirectX组工作,并且已经使得DirectX API(和通常的游戏编程)为更多人所接受。他也编写了到目前为止最具权威的关于Managed DirectX库的书籍。欢迎您的宝贵意见!作为本书的读者,您同时还是本书最重要的批评家和评论员。我尊重您的意见,想知道我们在什么地方做得不错,在哪些地方还能够做得更好,您最想看到我们提供哪些方面的内容,以及您希望传递给我们的任何明智的言语。我们非常欢迎您的评论。您可以给我们写电子邮件或者直接给我写信,阐明您喜欢或不喜欢本书的哪些方面 以及我们能够在哪些方面改进本书。请您注意的是,我们不能在与本书主题相关的技术问题方面帮助您。但是,我们拥有一个用户服务小组,与本书相关的特定技术问题将转寄给他们。信中务必包含本书的书名和作者,以及您的姓名、电子邮件地址和电话号码。我们将仔细阅读您的评论,并将它们与本书的作者和编辑共享。我的电子邮件地址是:信件地址是:Michael StephensAssociate PublisherSams Publishing800 East 96th StreetIndianapolis, IN 46240 USA读者服务关于本书和Sams出版社的其他更多信息,请访问我们的网站。在搜索框中输入ISBN号(不包括连字号)或者书名,就可以查到您想看的书。也可访问/downpage/,下载相关代码。1.1 什么是.NET? 如果熟悉了如何利用CLR(公共语言运行库)编写代码后,在面临选择开发语言时,您可能已经知道了您的选择。在Visual Studio .NET产品的最新版本中,当编写托管代码时,可以使用4种语言:C#、Visual Basic .NET、Managed C+和J#。此外还可以使用从VisualStudio .NET产品之外的第三方销售商处获得的其他语言,例如COBOL或者FORTRAN。尽管本书中将讨论的概念可以很容易地移植到任何完全兼容CLS(通用语言规范)的语言,但实际的代码将仅包含所提到的前两种语言:即C#和Visual Basic. NET。本书中将仅使用C#代码。您可以从/downpage中下载本书配套的安装文件,获取相关代码。在本章中,您将学习到: 定义.NET 托管代码 使用Visual Studio .NET IDE 在命令行中编译托管代码 开发人员 游戏开发过程 工具1.1 什么是.NET?自从Microsoft公司宣布并发行.NET之后,人们一直在尝试指出这种新“事物”到底是什么。根据Microsoft公司的市场活动,人们知道它将对计算产生革命性作用。这是一个很宏远的目标,现在断言它是否能够完成目标还太早。但是,它正在一步步地向此目标努力。当人们讨论.NET时,无法确定他们正在讨论.NET的哪个部分。Microsoft公司发行的其他“产品”或“思想”都不具有如此多的不同形式。紧随.NET名字的是众多的产品、服务,甚至是概念,因此指出.NET实际上是什么,是非常困难的。当本书中讨论.NET时,它指从.NET FrameworkSDK中可获得的新的开发语言和运行库。该SDK包含.NET运行库。而.NET运行库包含运行为.NET环境编写的应用程序所需要的所有东西。可以认为.NET运行库由几部分组成。CLR的部件驻留在GAC(Global Assembly Cache)中。也包括Microsoft .NET语言的编译器(C#、VB .NET、VJ#等等)。可以在图1-1中看到GAC。图1-1 GAC人们对运行.NET代码的最常见误解之一是,代码是“解释执行的”,像Java代码或者老的Visual Basic运行库一样。事实上,为.NET编写的代码在执行前首先被编译。当编译.NET应用程序时,它被编译为一种中间语言(IL,intermediary language)。这种IL实际上存储在可执行文件中或者已经创建的库中。IL可能在两个位置中的某一处被编译为本机代码(native code)。在安装代码时,可以执行一个称为ngen(native generation,即本机生成器)的进程。它将IL直接编译为本机代码,并将所编译的本机代码存储在GAC中的特定位置 本机程序集缓存(native assembly cache)中。假设在安装时没有编译代码,则代码在第一次执行前必须被编译。在应用程序启动期间,.NET运行库中一种称为JIT(Just In Time)编译器的特殊功能在后台执行编译工作。在后一种情形中,因为发生在后台的编译工作,应用程序的启动时间将受到影响。当启动时间对应用程序非常重要时(例如正在编写游戏时),确保在安装阶段包含ngen步骤是比较明智的。但是,在这期间无法进行某些优化,而如果利用JIT编译代码,则可以进行这些优化,因此如果启动时间不是很重要,则可以让.NET运行库处理它所能够做的工作。1.2 什么是托管代码 1.2 什么是托管代码在本书中将经常提到托管代码。在全书中使用的API被称为Managed的DirectX,.NET语言常被称为托管语言。术语“托管”来源于.NET运行库具有一个内置的内存管理器这一事实。在“过去”(只是几年前),使用C和C+编写代码的开发人员不得不自己进行内存管理。当不再需要已分配的内存空间时,必须将其释放,除非希望该内存被“泄漏”,内存泄漏将带来严重的性能问题。更糟糕的是因为直接处理指针,而它很容易破坏项目正在使用的内存。在很多情况下,这将导致很长时间的故障调试,因为通常实际看到出错的地方并不是内存初始被破坏的地方。人们认为C和C+语言难于掌握,主要是因为具有很多这种类型的问题。许多开发人员不愿意尝试C和C+,也是因为这个原因,他们尝试使用其他没有这些令人头痛问题的高级语言,例如Visual Basic。尽管这些新语言具有易用易学的优点,但也具有一些缺点。它们的性能无法与C和C+语言相比,在大多数情况下显得特别慢。另外,因为底层操作系统是使用C+开发的,所以这些语言难以实现C+的所有功能。尽管可以使用它们处理很多非常好的工作,但是如果想要获得操作系统的所有性能和优势,只能依靠自己。与.NET运行库的第一个版本相比,.NET的大多数内容都已经改变了。Microsoft公司几乎完全重新设计了一种新的API,竭力确保开发人员关心的问题都会被解决。这种新的运行库必须易学易用,快速高效,并且不存在令人头痛的内存管理问题。在本书中,将看到.NET在这些方面的好处1.3 使用Microsoft Visual Studio .NET 2003 IDE编写代码 1.3 使用Microsoft Visual Studio .NET 2003 IDE 编写代码提示:本书设定在Visual Studio .NET IDE中编写代码。这不是使用.NET编写游戏的需求,也不是使用.NET本身的需求,它是本书所选择的IDE。图1-2显示了Visual Studio .NET 2003 IDE。该IDE提供了编写.NET应用程序所需要的所有工具。它不仅包括编写代码所需要的编辑器,而且还有其他大量功能,使得.NET应用程序的开发变得容易。它的设计使得您能够方便地创建丰富的内容,如Windows应用程序。它也具有一个内置的编译器和调试器,并且无缝集成了所有功能。本书设定使用这种IDE进行开发。图1-2 Visual Studio .NET IDE熟悉这种IDE的最好方式是使用它编写一个简单应用程序。典型的计算机编程是编写一个简单的Hello World应用程序,该应用程序只是在屏幕上输出Hello Word文本。老实说,这非常令人厌烦,因此您应当尝试编写更复杂的程序。但也不需要奇特的程序,因为这只是对IDE的一个介绍,当然在程序中包括一些用户特性交互将更好。在这里将编写一个应用程序,询问用户的姓名和出生年份,然后输出用户的当前年龄。1.3.1 C#代码现在启动Visual Studio .NET 2003 IDE。首次启动时,应当看到图1-2所示的默认启动页面。单击该页中的New Project按钮,启动一个新的项目。如果没有显示这个页面,也可以单击File | New Project菜单项,或者按下Ctrl+Shift+N快捷键。这将产生一个New Project对话框,如图1-3所示。应当首先尝试C#代码,因此在New Project对话框中,从左边的列表框中选择Visual C# Projects项,从右边的列表框中选择Console Application项。为项目命名,然后单击OK按钮创建该项目。这将创建一个新的控制台应用程序,当前它什么都不执行。使用程序清单1.1中的代码替换自动生成的代码。图1-3 New Project对话框程序清单1.1 简单的C#控制台应用程序using System;class ConsoleAppstatic void Main()Console.Write(Hello World C#!rnPlease enter your name:);string name = Console.ReadLine();Console.Write(Hello 0, please enter the year you were born:, name);int year = int.MaxValue;while(year = int.MaxValue)tryyear = int.Parse(Console.ReadLine();catch (FormatException)Console.Write(You did not enter a valid number. );Console.WriteLine(Please enter an integer, such as 1975. );Console.WriteLine(You must be approximately 0 years old! ,DateTime.Now.Year-year);Console.WriteLine(Press the key to exit the application);Console.Read();如果您已经熟悉了C、C+或者Java,则C#语言的语法与这些语言非常相似。尽管C#的底层运行库仍然是CLR,但是它的语法源于这些语言,熟悉它们的开发人员很容易进行移植。该代码根本不复杂,它在询问用户的姓名和出生年份之前,首先使用Console类输出一个简单的消息(该消息包含Hello World)。注意,该应用程序接着询问出生的年份,直到用户输入一个有效的数值。它最后利用一个简单的公式输出用户的当前年龄。图1-4显示了该应用程序的运行过程。图1-4 第一个应用程序1.3.2 VB .NET代码如果读者更熟悉Visual Basic语法,很可能能够理解前文中的大多数代码。这两种语言的语法差别不是很大,但还是应当尝试编写一个Visual Basic .NET版本的应用程序。再次启动一个新的项目,并采用在C#代码中所使用的相同指令,其中不同之处是项目的类型。应当选择Visual Basic Projects项目,创建该项目后,使用程序清单1.2中的代码替换自动生成的代码。程序清单1.2 简单的VB .NET控制台应用程序Module Module1Sub Main()Console.Write(Hello World C#! + vbCr + vbLf + Please enter your name:)Dim name As String = Console.ReadLine()Console.Write(Hello 0, please enter the year you were born:, name)Dim year As Integer = Integer.MaxValueWhile year = Integer.MaxValueTryyear = Integer.Parse(Console.ReadLine()Catch fe As FormatExceptionConsole.Write(You did not enter a valid number. )Console.WriteLine(Please enter an integer, such as 1975. ) End TryEnd WhileConsole.WriteLine(You must be approximately 0 years old! , DateTime.Now.Year - year)Console.WriteLine(Press the key to exit the application)Console.Read()End Sub MainEnd Module Module1如您所见,从C#到VB .NET的代码移植并不复杂。因为这两种语言运行于相同的运行库之上,所以这两段代码仅存在微小的语法差别。也应当注意到,这两段代码产生了相同的结果。这是.NET的一种强大功能,它允许开发人员使用他最熟悉的语言编写代码。如果使用了编程语言X,您不必担心不能利用编程语言Z中的功能Y。因为每一种托管语言使用了相同的底层运行库,它们都具有相似的功能集。1.4 在命令行中编译.NET代码 1.4 在命令行中编译.NET代码到目前为止,使用Visual Studio .NET IDE是开发.NET应用程序最容易的方法,但它并不是仅有的方法。.NET运行库将C#、VB .NET和VJ#的编译器随其运行库一起发布,因此只要有一个文本编译器和.NET运行库,就能够创建任何.NET应用程序。提示:为了实际开发并使用.NET应用程序,需要.NET运行库。如果没有安装,您可以从Microsoft的网站/net处下载。打开一个文本编辑器(例如Notepad),输入前面某一个程序清单中的代码。保存该代码,并打开一个命令提示符。在使用.NET运行库中的编译器之前,需要设置路径,将其指向底层.NET Framework的位置。在命令窗口中,输入下面的命令更新路径:set path=%path%;C:WINDOWSMicrosoft.NETFrameworkv1.1.4322警告:如果Windows文件夹不是在C:windows处,当更新路径变量时,确保输入了正确的Windows文件夹位置。命令行编译器位于上文所列出的文件夹中,与一些组成.NET运行库本身的程序集相同。C#的编译器是csc.exe,VB .NET的编译器是vbc.exe。这些可执行文件具有相似的命令行参数集,可以使用单个参数/?来显示这些编译器的所有参数。假设使用了该代码的C#版本,并将文件保存为class1.cs,可以利用如下命令将应用程序编译为名为app.exe的可执行程序。首先定位到代码文件所在的文件夹,然后运行下面的命令:csc /out:app.exe /target:exe Class1.cs输出应当类似于下面的内容:Microsoft (R) Visual C# .NET Compiler version 7.10.3052.4for Microsoft (R) .NET Framework version 1.1.4322Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.现在运行该应用程序,它将产生与使用IDE作为开发环境时相同的结果。1.5 游戏开发简述 1.5 游戏开发简述在2001年,视频游戏的收入首次超过了电影工业的票房收入。该产业欣欣向荣,并需大量优秀的开发人员。如果一个公司能够在某个顶级游戏中花费上百万美元,那他们很自然地会对游戏开发团队非常挑剔。本章将讨论游戏开发的过程和制作这些伟大游戏的团队。1.6 开发人员 1.6 开发人员在最近几年中,作为DirectX组的一员,我非常高兴能够与大量的游戏开发人员一起讨论问题。尽管每一个开发人员都是独特的,但是他们具有相似的特征。其中最显然的特征之一是他们都绝对喜爱游戏。当然,这是可以预料的。游戏开发是一项艰苦的工作,它时间长、任务紧,压力大。那些不具有献身游戏精神的人应当去编写没有这些压力的软件。尽管目前对于一个游戏工作室来说,宣布在开发游戏中的花费是不常见的,但是许多游戏在开发期间花费了上百万美元,这是公司发行游戏的真实投资。许多游戏需要多年的开发,这需要对游戏本身和开发人员、艺术家、设计人员以及任何参与制作的人员具有绝对的信心。很多时候,发行商屈服于压力,并在游戏准备好之前就发行。另外一种情形就像Duke Nukem Forever(3D Realms所发行的一款游戏)该游戏的开发时间超过了5年,发行商直到它最终完成才发行。回到视频游戏开发的早期(古老的拱廊和Atari家庭系统),游戏通常由一个或两个人编写,编写时间是几周而不是几年。由此可以看到当今的视频游戏世界的巨大进步。回到那时您可以制作一个非常简单的游戏,例如Galaga,它只有一个级别,玩家只能反复地在该级别中进行游戏。它的图形简单,但非常有趣并且令人着迷。它的编写困难吗?任何曾经看到该游戏的开发人员应当认识到它非常容易编写。相反,当今的游戏功能非常巨大,必须设计、开发庞大的世界,并且创建一些艺术资产。大多数游戏包含多个级别和非常复杂的玩法,而不是早期游戏中所看到的向前向后移动并开火。所有这些先进的特性需要越来越多的开发时间,并且由于当今游戏玩家期望这些先进的特征,所以任何大预算的项目似乎都不可能在短短的几周内完成。当今的大游戏也对游戏开发人员的繁荣添加了一层复杂性,因为捕获大众注意的游戏不再可能由个人完成。实际上个人(甚至是一个小组)也不可能将所编写的游戏放到货架上出售,因为计算机软件商店销售游戏的开销是非常高的。大多数游戏开发初学者将他们编写的游戏作为共享软件发行,甚至是免费软件。有大量的网站为共享游戏开发作贡献,该团体由其他许多游戏开发人员组成,他们提供有价值的反馈、测试和论坛,在论坛中可以展示新思想以及炫耀您的最新创作。初学的游戏开发人员不可能通过创建这些小的共享游戏变得富有,但却使得他们能够开发重要的“样片(demo reel)”,在大预算项目中申请一个游戏开发位置时,可以使用这些样片。正如引言中提到的一样,本书将引导您学习开发一个高性能、完全3D的游戏所需要的技能,使得您在某一天能够开发自己的样片。在这之前,您需要询问自己:准备好成为一个游戏开发人员了吗?并询问自己以下几个问题: 您喜欢玩视频游戏吗? 您是否曾经沉迷于游戏而忘记了时间? 您常常在思考这些世界是如何创建的吗? 您是否相信自己具有能够转换为下一个伟大视频游戏的构想? 您对当今存在的所有相同的老游戏感到厌烦了吗?您有关于重新定义流行视频游戏的构想吗? 您希望我闭嘴,并马上告诉您如何编写自己的视频游戏吗?如果您对这些问题中的一个或多个回答了“是”,则表示您非常渴望成为一名游戏开发人员。或许您已经具有某些构想,但不具备将头脑中的构想通过代码转化为实际游戏能力。本书将通过实际的游戏编程快速教会您这些技能。1.7 游戏开发过程 1.7 游戏开发过程所有的游戏开始时都只是一个构想。如果没有构想,能编写什么呢?如果只是随机的编码,能够希望它在未来成为一个伟大的作品吗?尽管这对抽象画家的工作可能有效,但软件开发人员不能在没有计划的情况下做任何事情。但是,只有构想,并不意味着可以开始编写代码。我曾经看到(并且将不断看到)的最大的错误是,开发人员提前进行代码的编写。除非代码非常简单,不用动任何脑筋,那么您可以立即开始编写代码,否则在只有一个构想的情况下就开始编写代码,决不是好的做法。在没有计划的情况下开始编写代码,所带来的只是更大的工作量、更多的反复编码以及更长的开发时间。在编写代码之前,应当开发一个设计规范。该文档应当包含关于如何设计代码、对象如何交互和对象可能具有的各种属性的特定信息。如果没有这一步就直接编码,在大多数情况下将导致解决错误的问题。即使您能够快速的解决这些问题,但是如果没有解决正确的问题,工作就是毫无意义的。结果将会花费更多的时间为真正的问题寻找解决方案。您也应当花一些时间将构想记录到纸上(或者计算机文件中)。如果不想让您关于下一个伟大的计算机游戏的构想非常含糊,以至于设计规范无法描述需要求解哪些问题,那么您最好确保您的构想是生动的。将构想展示给朋友,让他们提问题,并确保这些问题能够在您的文档中得到回答。如果您的构想类似于“编写一个令人恐怖的第一人射手游戏”,那么说明您还没有很好地思考您的构想。玩家具有什么类型的武器?可以获得什么类型的游戏模式?支持多人游戏吗?在采取进一步的行动之前,您需要很好地思考您的构想。如果您正在尝试为发行商开发游戏,那么也需要开发一个游戏建议。尽管将这一建议写入文档是非常重要的,但在大多数情形下,更需要一个足够好的演示片段。如果只是基于一个构想,发行商通常不会将项目交给您(除非您在游戏开发方面已经具有很大名气,如果是这样,您将不需要学习本书)。1.8 工具 1.8 工具编写伟大的游戏并不只是编写好的代码。当然这并不表示代码的编写不重要,在创建这些游戏时,还需要考虑其他大量因素。所有游戏开发都需要一个好的工具集。当今的大多数游戏(即使是严格的2D游戏)都有大量的艺术成份,这些艺术成份是采用3D模型软件包开发的。这些工具对于参与游戏开发的艺术家来说是无价的,它们使得浮现在脑海里的构想成为现实。尽管在本书中并不讨论如何创建所需要的艺术,但会提到使用的工具。当今所使用的两种非常流行的数字内容生成工具是Maya和3D Studio MAX,分别如图1-5和图1-6所示。但是,创建艺术并不只是3D建模。即使一个模型由上百万个多边形组成,如果没有纹理的话,看上去也是很乏味的。很多工具可以用于创建纹理,例如Photoshop(如图1-7所示)和Paint(在安装Windows时附带安装了Paint,如图1-8所示)。图1-5 使用Maya建模一个宇宙飞船图1-6 使用3D Studio MAX建模一个妖怪图1-7 使用Photoshop创建纹理图1-8 使用Paint创建纹理开发和艺术加工工具都是非常好的工具,您将在游戏开发中使用到它们。还有一些其他类型的工具也非常重要,但很多人甚至没有考虑到它们,例如一个优秀的源码控制管理工具。假设您的游戏具有声音,那么您很可能需要用于处理声音文件的工具。可以使用Windows附带的Sound Recorder(如图1-9所示),也可以使用比较复杂的WaveStudio,它是Creative Lab的音频软件的一部分(如图1-10所示)。图1-9 使用Sound Recorder图1-10 使用Creative Lab的WaveStudio利用所有这些工具为游戏创建内容,您可能需要一个能够为整个团队存储内容的工具。很可能有大量的信息需要存储,以及定期备份。最好是只备份新更改和添加的记录。大多数源码控制管理工具至少提供其中某个功能。Visual Studio 中的Visual Source Safe是一个简单的源码控制管理工具,它适用于小的团队。该工具不包含大型团队所需要的许多强大功能,例如允许多人操作一个文件和自动合并相互冲突的改变等功能,但是对于一个小团队中的小项目来说,它通常能够满足需要。还有大量其他的源码控制工具(例如Perforce),因此您需要做一个小的调查,找出哪种工具适合您和您的小组。当然,使用任何一种工具都比没有工具强。1.9 小结 1.9 小结本章主要介绍了.NET的基础知识。相信您已经对.NET和托管代码有大致的了解,并且采用两种语言编写了一个简单的应用程序。您也学习了如何在集成开发环境之外编译这些应用程序。至此,已经介绍了如何开始进行游戏开发的相关基础,并且介绍了游戏的开发人员、开发过程以及游戏开发所需要的某些商业工具。第2章中将介绍游戏开发相关的内容。2.1 提出游戏构想 通过第1章的简短介绍后,现在开始本书的正题:3D游戏编程。显然,这个主题非常复杂,虽然您的第一个游戏无法发行,但是它将帮助您了解游戏开发基本原则。将游戏构想转换为实际的程序,是您所能够获得的最好体验。将大脑中的构想转换为其他人能够欣赏的实际内容,是所有开发人员的目标,但当这些构想与游戏相关时,回报似乎更大,而您肯定期望更大的回报。在本章中,将学习: 提出游戏构想 2D和3D编程差别 细化规范2.1 提出游戏构想所有的事物都起始于构想,游戏也不例外。游戏构想可以源于您思考的任何方面。或许您看到您所喜爱的其他游戏,但是您认为如果在某些方面作一些变化,它将会更好。或许您做了一个梦,它能够转换为一个极好的游戏。或许您意识到两个不相关的游戏能够组合在一起,从而创建一个极佳的游戏。无论您的灵感源于哪里,在您开始制造游戏之前,都需要这样的灵感。不幸的是,由于还没有人发明一本能够阅读思想的书,在本书的示例游戏中您只能相信我的思想。本书之所以选择这些游戏,原因有很多,主要考虑到开发的难度。但是,每一个例子都分属不同的类型,它们覆盖了游戏开发过程中遇到的大量不同主题。第一种类型的游戏是拼图游戏(puzzle game)。您很可能看到过或玩过拼图游戏。Tetris是一个典型的拼图游戏,几乎每个人都曾经听过,甚至因为玩这款游戏而废寝忘食。似乎每个人也都编写过Tetris游戏,因此您很可能不愿意选择它作为您即将编写的拼图游戏。另外Tetris是一个2D游戏(尽管已经存在3D类型的Tetris游戏),因此,您也很可能希望跳过它。取而代之的是,您应当编写稍微具有特色的游戏。该游戏基于一个面板。该面板由一系列的立方体组成,每个立方体处于一种未确定模式,并且每个立方体至少与一个其他立方体直接相邻。棋盘是满足这些标准的一个面板例子。其中每个立方体具有一种特定的颜色,当玩家走到某个立方体上时,它将变为另外一种预定颜色。在某一级别中,当每个立方体处于正确的颜色时,该级别结束。细化提议正如第1章所介绍的一样,一旦游戏的基本构想已经建立,您应当花费一些时间讨论游戏的各种提议,以确保您的思考足够全面。对于这个游戏,下面是有助于细化提议的一个列表: 称为Blockers的拼图游戏 只支持单个玩家 完全3D环境 得分基于完成一个级别所使用的时间 每个级别由一系列相邻的立方体组成,例如一个棋盘 每个立方体一种颜色 在某个级别中,当每个立方体颜色相同,并且是该级别预定的“终止”颜色时,该级别结束 每个级别有一个最大时间限制 每个立方体有一个颜色列表 最少包括两种颜色,最多包括六种颜色 玩家通过在立方体上“跳动”来进行游戏,跳动时将立方体的颜色改变为列表中下一种颜色 起始级别中,每个立方体的颜色列表有两种颜色 在更高级别中,每个立方体的颜色列表将具有更多的颜色,因此游戏的难度增加 如果玩家能够完成这些级别,则允许颜色列表返回初始状态,来增加游戏的难度 如果玩家不能在最大时间限制内完成游戏,则游戏结束这个列表描述了游戏的每个特征吗?很可能没有,但是它回答了在策划游戏之前需要回答的主要问题。策划阶段并不是对游戏的每个功能进行细化,在您开始开发之前理解这一点是非常重要的,但是更需要您思考游戏需要的特征。在不考虑实际需要的功能的情况下就提前投入并编码,将导致后面的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国极品明前茶数据监测报告
- 新冠肺炎疫情预防班会教案
- 智能制造时代凸板刀数字化孪生模型构建与工艺优化
- 智能传感器的隐私保护与人体工学数据采集的伦理边界
- 新型环保冷媒替代传统硅油对分体热管传热性能影响评估
- 文化遗产数字化复原中凹柱面镜非接触式三维表面重建的拓扑缺陷
- 2025年装配电工考试题及答案
- 支承箱防腐涂层在极地极端温湿度梯度下的失效机理与寿命预测模型
- 2025年5G网络的普及对中小企业数字化转型的影响
- 微纳加工领域超精密刀支架的制造工艺革新
- 肠系膜上动脉夹层护理查房
- 六项精进培训感悟
- 减盐减油知识课件
- 慈善基金会财务管理制度
- 八马加盟合同样本
- 少数民族旅游业
- 架空线路拆除施工方案
- 院校讲解空乘专业
- 《柑橘病虫害防治》课件
- 《PCB材料介绍》课件
- 电子商务教师招聘合同模板
评论
0/150
提交评论