3d游戏编程入门(c#)_第1页
3d游戏编程入门(c#)_第2页
3d游戏编程入门(c#)_第3页
3d游戏编程入门(c#)_第4页
已阅读5页,还剩138页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3D游戏编程入门(〇#)目录第I部分Microsoft.NET简介第1章游戏开发和托管代码3什么是.NET?•,…3什么是托管代码・…”5使用MicrosoftVisualStudio.NET2003IDE编写代码,…5C#代码…6VB.NET代码…8在命令行中编译.NET代码・…9游戏开发简述……10开发人员♦…10游戏开发过程••…11工具…12小结,•…16第n部分图形和游戏1的介绍第2章策划第一个游戏“•・19提出游戏构想……19理解ー个3D游戏的需求・…21游戏规范……24小结…26第3章理解示例框架…27创建项目・…27枚举所有设备选项・…32小结…39第4章在屏幕上显示…404.!创建设备,…40开始绘图……47加载并绘制网格……48在场景中添加照相机・…51小结…54第5章完成代码“”55理解高分辨率计时器……55处理丢失的设备,…60添加帧速率输出…63设计UI界面”,…65设计按钮,…72小结…75第6章实现用户界面…76设计主菜单,…76插入到游戏引擎中,…81选择人物(Loopy)”84利用新界面更新游戏引擎……91小结・…95第7章实现玩家和块…96编写Player对象…96设计块•…104小结…110第8章实现级别对象…•111实现级别•…111控制玩家的移动•…116第9章综合应用124包含玩家…124挂钩级别,…128实现退出界面…132结束工作…135小结…140第HI部分基本的数学规则第10章3D数学快速入门…,14510,12D与3D145使用3D点,,…147操作3D对象…148平移(移动)对象・…149缩放・…149旋转…150坐标系…150数学结构…151向量…151矩阵…154小结•…157第IV部分间接图形、对等网、游戏2第11章开始创建游戏161Tankers—下ー个游戏构想,…161仓リ建Tankers项目……163项目的图形绘制,…169

第12章开发更先进的用户界面…174使用Blockers的基类(Base类),174添加新的基类…179实现主界面…182利用用户界面绘制3D模型•…189小结,…193第13章绘制真实的坦克,…194理解网格层次结构,“…194加载坦克层次结构…197绘制网格层次……199操作坦克…201坦克的属性……204创建照相机类……207小结…210第14章天空?级别?玩家!--211没有天空的世界将是黑色的世界•…211有了一个天空,但坦克不能驱动到那里,…214控制坦克……216IMoveableObject接口…225基本碰撞检测,…231小结,•…234第15章准备,瞄准,开火!--235实现Ammunition类……235Bullets集合……242

小结•…248第16章避免单人游戏的枯燥•…249使用DirectPlay■249创建会话…255加入会话…257事件处理程序,…258发送及接收数据,i260小结…265第17章完成Tankers游戏,…266插入到游戏引擎中,i266绘制游戏,…272小结…275第V部分高级绘图、客户/服务器网络和游戏3第18章添加特殊效果…279实现基本粒子系统…279绘制粒子系统……287将各部分连接到ー起,i290小结…292第19章构建自己的游戏293阐明思想,…293创建自己的项目,…294设计用户界面,…300小结…305第20章可编程流水线…,306编写VertexShader"309使用着色增加逼真度……314添加Pixelshader315小结♦…317第21章控制细节的级别•…318简化网格,…318使用简化的网格,…322使用渐进网格控制细节的级别•…323小结,…324第22章使用绘图目标创建特效-32522.!绘制跑道和多辆―丁车•…325创建绘图目标和表面……331将场景绘制到绘图目标•…333演示后视镜,…334小结・…335第23章理解高级渲染语言2336理解老的shader模型的限制•…336添加卡丁车镜面高亮…337逐pixel镜面高亮,…340小结…343第24章关于性能的注意事项•…344事件模型和ManagedDirectX344生成本机程序集,…345Boxing恶梦……346ManagedDirectX的速度……348

24.6小结,,…350第V!部分附录附录A开发级别创建器,…353成为游戏开发人员的条件我所遇到的每ー个开发人员都至少在某一段时间想成为ー个游戏开发人员。对于很多人来说,视频游戏不只是空闲时的ー种爱好,他们完全被游戏所吸弓I。人们沉浸在这些虚拟世界中,常常梦想由自己创建如此神奇的天地。不要被美丽的图形、奇妙的故事情节和感人悦耳的音乐所愚弄,编写游戏是非常困难的工作,只有某些特定的开发人员才能够获得成功。除了所需要的技术天赋之外,ー个优秀的游戏开发人员应当拥有其他ー些技能,例如,您首先是ー个游戏爱好者。如果不是游戏爱好者,则不可能编写出伟大的游戏,这ー条件使得游戏开发工作更具有挑战性。成为游戏开发人员确实不是一件容易的事情。如果没有经验,则不会被游戏开发公司聘用,并且当没有公司聘用时,将更难以获得经验。当前只有少量的课程以及某些学校专注于讲授游戏的开发。但是,入门的最好方式是制作一个样片(demoreel)。它能向您未来的老板展示您的能力和处理事情的方式。通过本书,您将制作出ー个引人注目的样片。读者对象我常常被问到:“为什么每个人都想使用.NETFramework编写游戏程序?”。其他的问题包括:".NETFramework不是只用于Web服务器应用程序的吗?”,“它不是很慢吗?”,等等。对于游戏开发人员(或者未来的游戏开发人员)来说,这些都是很重要的问题,但他们误解了.NETFramework〇.NETFramework不是最新的Web服务器版本,也不是任何服务器组件的扩展。当然能够使用.NETFramework创建强大的Web服务器应用程序,但是,这并不是它们的全部功能。.NETFramework包括ー・种功能强大的客户端应用程序编程接口(API)以及ManagedDirectX»实际上.NET开发人员需要掌握整个DirectXAPI〇利用它能够编写很多新的应用程序,包括游戏。如果认为.NETFramework只能够编写服务器应用程序,则显得有一点单纯。您也可以利用它创建复杂的客户端应用程序。关于.NET的性能问题仍然存在,这些问题也很难简单描述。当引入ー门“新的”语言或者运行库时,开发人员在采用之前,通常比较犹豫。不久以前,很多游戏仍然是采用汇编语言编写的,因为游戏开发人员不相信C或者C++语言足够快。.NETFramework也遵循这个规则。在证明.NETFramework的性能之前,游戏开发人员都会以…种怀疑的眼光看待它。在本书中,大量的游戏是使用.NET运行库开发的。事实胜于雄辩,与其喋喋不休地讨论.NET运行库的性能有多好,还不如让本书中一些真实的游戏来证明这一点。为什么使用.NETFramework任何曾经编写过Windows程序的人都(无论是否使用.NETFramework)能够认识到,即使使用Win32API编写简单的Windows应用程序都比较困难。设计.NETFramework的目的是提供ー•种较简单的方式来执行在Windows程序中一些常见的事情,并且为普通的开发人员自动处理很多问题,例如内存的管理。利用.NETFramework,开发人员可以省去很多麻烦的任务,例如花费三天的时间寻找ー.个内存泄漏bug,他们可以将一些功能直接添加到正在编写的游戏里面。很多情况下,从游戏中删除某些好的特性是因为需要花费大量的时间解决问题,而这些问题.NETFramework已经为您解决。,NETFramework的另外一个令人感兴趣的特性是语言的中立性。只要所使用的功能兼容公共语言规范(CommonLanguageSpecification,CLS),则可以采用任何能够使用CLS兼容功能的语言。过去,VisualBasic开发人员转向使用严格的C++进行编码时,可能比较困难。现在,VisualBasic.NET开发人员能够较容易的转向C#,因为这两种语言之间仅存在较小的语法差别。本书中的代码是使用C#编写的。本书的目的

编写本书的目的是为了满足游戏开发群体的需求,他们缺少关于本书主题方面的信息。由于不能找到所需要的信息,太多可能成为优秀游戏开发人员的程序员选择了退出。目前市场上的多数游戏开发书籍是关于2D图形的,它们是比较好的起点,但现在编写的多数游戏儿乎全是3D图形的,并且现在的游戏爱好者也希望如此。并不是不需要继续编写2D游戏,但是如果那是游戏开发人员所能够做的所有,则他所做的可能毫无用处。本书并不教导您如何去编写■・个价值数百万美元的游戏。而是给出所有的工具和信息,让读者自己学会如何开发3D游戏。在阅读本书的过程中,将实现两个完整的3D游戏,阅读完本书后,读者将能够设计并实现自己的3D游戏,以使自己成为ー•名优秀的游戏开发人员。本书中最后的游戏将留给读者作为一个练习。作者简介TomMiller是ManagedDirectXAPI的设计师和首席开发人员。自1997年开始,他工作于Microsoft公司。他最初在VisualBasic组工作,后来他喜爱上了游戏和游戏编程,因此进入了DirectX组。自1999年末,他在DirectX组工作,并且已经使得DirectXAPI(和通常的游戏编程)为更多人所接受。他也编写了到目前为止最具权威的关于ManagedDirectX库的书籍。欢迎您的宝贵意见!作为本书的读者,您同时还是本书最重要的批评家和评论员。我尊重您的意见,想知道我们在什么地方做得不错,在哪些地方还能够做得更好,您最想看到我们提供哪些方面的内容,以及您希望传递给我们的任何明智的言语。我们非常欢迎您的评论。您可以给我们写电子邮件或者直接给我写信,阐明您喜欢或不喜欢本书的哪些方面——以及我们能够在哪些方面改进本书。请您注意的是,我们不能在与本书主题相关的技术问题方面帮助您。但是,我们拥有一个用户服务小组,与本书相关的特定技术问题将转寄给他们。信中务必包含本书的书名和作者,以及您的姓名、电子邮件地址和电话号码。我们将仔细阅读您的评论,并将它们与本书的作者和编辑共享。我的电子邮件地址是:feedback@

信件地址是:MichaelStephensAssociatePublisherSamsPublishing800East96thStreetIndianapolis,IN46240USA读者服务关于本书和Sams出版社的其他更多信息,请访问我们的网站http:〃0在搜索框中输入ISBN号(不包括连字号)或者书名,就可以查到您想看的书。也可访问http:〃/downpage/,下载相关代码。1.1什么是.NET?如果熟悉了如何利用CLR(公共语言运行库)编写代码后,在面临选择开发语言时,您可能已经知道了您的选择。在VisualStudio.NET产品的最新版本中,当编写托管代码时,可以使用4种语言:C#、VisualBasic.NET、ManagedC++和J#。此外还可以使用从VisualStudio.NET产品之外的第三方销售商处获得的其他语言,例如COBOL或者FORTRAN。尽管本书中将讨论的概念可以很容易地移植到任何完全兼容CLS(通用语言规范)的语言,但实际的代码将仅包含所提到的前两种语言:即C#和VisualBasic.NET〇本书中将仅使用C#代码。您可以从http:〃/downpage中下载本书配套的安装文件,获取相关代码。在本章中,您将学习到:定义.NET托管代码使用VisualStudio .NETIDE在命令行中编译托管代码开发人员游戏开发过程工具

什么是.NET?自从Microsoft公司宣布并发行.NET之后,人们一直在尝试指出这种新“事物”到底是什么。根据Microsoft公司的市场活动,人们知道它将对计算产生革命性作用。这是一个很宏远的目标,现在断言它是否能够完成目标还太早。但是,它正在ー步步地向此目标努力。当人们讨论.NET时,无法确定他们正在讨论.NET的哪个部分。Microsoft公司发行的其他“产品”或“思想”都不具有如此多的不同形式。紧随.NET名字的是众多的产品、服务,甚至是概念,因此指出.NET实际上是什么,是非常困难的。当本书中讨论.NET时,它指从.NETFrameworkSDK中可获得的新的开发语言和运行库。该SDK包含.NET运行库。而.NET运行库包含运行为.NET环境编写的应用程序所需要的所有东西。可以认为.NET运行库由几部分组成。CLR的部件驻留在GAC(GlobalAssemblyCache)中。也包括Microsoft.NET语言的编译器(C#、VB.NET、VJ#等等)。可以在图1-1中看到GAC。图1-1GAC人们对运行.NET代码的最常见误解之一是,代码是“解释执行的”,像Java代码或者老的VisualBasic运行库一样。事实上,为.NET编写的代码在执行前首先被编译。当编译.NET应用程序时,它被编译为ー种中间语言(IL,intermediarylanguage)〇这种1L实际上存储在可执行文件中或者已经创建的库中。IL可能在两个位置中的某ー处被编译为本机代码(nativecode)〇在安装代码时,可以执行・个称为ngen(nativegeneration,即本机生成器)的进程。它将!L直接编译为本机代码,并将所编译的本机代码存储在GAC中的特定位置一

一本机程序集缓存(nativeassemblycache)中。假设在安装时没有编译代码,则代码在第一次执行前必须被编译。在应用程序启动期间,.NET运行库中一种称为JIT(JustInTime)编译器的特殊功能在后台执行编译工作。在后一种情形中,因为发生在后台的编译工作,应用程序的启动时间将受到影响。当启动时间对应用程序非常重要时(例如正在编写游戏时),确保在安装阶段包含ngen步骤是比较明智的。但是,在这期间无法进行某些优化,而如果利用JIT编译代码,则可以进行这些优化,因此如果启动时间不是很重要,则可以让・NET运行库处理它所能够做的工作。什么是托管代码什么是托管代码在本书中将经常提到托管代码。在全书中使用的AP!被称为Managed的DirectX,.NET语言常被称为托管语言。术语“托管”来源于.NET运行库具有一个内置的内存管理器这一事实。在“过去”(只是几年前),使用C和C++编写代码的开发人员不得不自己进行内存管理。当不再需要已分配的内存空间时,必须将其释放,除非希望该内存被“泄漏”,内存泄漏将带来严重的性能问题。更糟糕的是因为直接处理指针,而它很容易破坏项目正在使用的内存。在很多情况下,这将导致很长时间的故障调试,因为通常实际看到出错的地方并不是内存初始被破坏的地方。人们认为C和C++语言难于掌握,主要是因为具有很多这种类型的问题。许多开发人员不愿意尝试C和C++,也是因为这个原因,他们尝试使用其他没有这些令人头痛问题的高级语言,例如VisualBasico尽管这些新语言具有易用易学的优点,但也具有一些缺点。它们的性能无法与C和C++语言相比,在大多数情况下显得特别慢。另外,因为底层操作系统是使用C++开发的,所以这些语言难以实现C++的所有功能。尽管可以使用它们处理很多非常好的工作,但是如果想要获得操作系统的所有性能和优势,只能依靠自己。与.NET运行库的第一个版本相比,.NET的大多数内容都已经改变了。Microsoft公司儿乎完全重新设计了•种新的API,竭力确保开发人员关心的问题都会

被解决。这种新的运行库必须易学易用,快速高效,并且不存在令人头痛的内存管理问题。在本书中,将看到•NET在这些方面的好处使用MicrosoftVisualStudio.NET2003IDE编写代码1.3使用MicrosoftVisualStudio.NET2003IDE编写代码提示:本书设定在VisualStudio.NETIDE中编写代码。这不是使用.NET编写游戏的需求,也不是使用.NET本身的需求,它是本书所选择的IDE。图1-2显示了VisualStudio.NET2003IDE。该IDE提供了编写.NET应用程序所需要的所有工具。它不仅包括编写代码所需要的编辑器,而且还有其他大量功能,使得.NET应用程序的开发变得容易。它的设计使得您能够方便地创建丰富的内容,如Windows应用程序。它也具有ー个内置的编译器和调试器,并且无缝集成了所有功能。本书设定使用这种IDE进行开发。

图1-2VisualStudio.NETIDE熟悉这种IDE的最好方式是使用它编写ー个简单应用程序。典型的计算机编程是编写ー个简单的HelloWorld应用程序,该应用程序只是在屏幕上输出HeiloWord文本。老实说,这非常令人厌烦,因此您应当尝试编写更复杂的程序。但也不需要奇特的程序,因为这只是对IDE的ー个介绍,当然在程序中包括一些用户特性交互将更好。在这里将编写ー个应用程序,询问用户的姓名和出生年份,然后输出用户的当前年龄。〇#代码现在启动VisualStudio.NET2003IDE。首次启动时,应当看到图1-2所示的默认启动页面。单击该页中的NewProject按钮,启动ー个新的项目。如果没有显示这个页面,也可以单击File|NewProject菜单项,或者按下Ctrl+Shift+N快捷键。这将产生一个NewProject对话框,如图1-3所示。应当首先尝试C#代码,因此在NewProject对话框中,从左边的列表框中选择VisualC#Projects项,从右边的列表框中选择ConsoleApplication项。为项目命名,然后单击0K按钮创建该项目。这将创建一个新的控制台应用程序,当前它什么都不执行。使用程序清单1.1中的代码替换自动生成的代码。图1-3NewProject对话框程序清单1.1简单的C#控制台应用程序

usingSystem;classConsoleApp{staticvoidMain()(Console.Write("HelloWorldC#!\r\nPleaseenteryourname:");stringname=Console.ReadLine();Console.Write("Hello{〇},pleaseentertheyearyouwereborn:",name);intyear=int.MaxValue;while(year==int.MaxValue)(try(year=int.Parse(Console.ReadLine());)catch(FormatException)(Console.Write("Youdidnotenteravalidnumber.");Console.WriteLine("Pleaseenteraninteger,suchas1975.");))Console.WriteLine("Youmustbeapproximately{0}yearsold!",DateTime.Now.Year-year);Console.WriteLine("Pressthe<Enter>keytoexittheapplication");Console.Read();)

如果您已经熟悉了C、C++或者Java,则C#语言的语法与这些语言非常相似。尽管C#的底层运行库仍然是CLR,但是它的语法源于这些语言,熟悉它们的开发人员很容易进行移植。该代码根本不复杂,它在询问用户的姓名和出生年份之前,首先使用Console类输出ー个简单的消息(该消息包含HelloWorld)〇注意,该应用程序接着询问出生的年份,直到用户输入ー个有效的数值。它最后利用ー个简单的公式输出用户的当前年龄。图1-4显示了该应用程序的运行过程。Pk皿Mrttr«wrmm:TmllllerhlhI«bNilur,flmuemt«rttewarwr*hn:TUt*aiHmUMF»«4UMtMtev«mIMMabtr.Mt«r•• tetbmIE.わ.Hutte2S«Mn.U冷eti«《"e>it«EttheWM—图1-4第一个应用程序VB.NET代码如果读者更熟悉VisualBasic语法,很可能能够理解前文中的大多数代码。这两种语言的语法差别不是很大,但还是应当尝试编写ー个VisualBasic.NET版本的应用程序。再次启动ー个新的项目,并采用在C#代码中所使用的相同指令,其中不同之处是项目的类型。应当选择VisualBasicProjects项目,创建该项目后,使用程序清单1.2中的代码替换自动生成的代码。程序清单1.2简单的VB.NET控制台应用程序ModuleModulelSubMain()Console.Write("HelloWorldC#!"+vbCr+vbLf+"Pleaseenteryourname:")DimnameAsString=Console.ReadLine()

Console.Write("Hello{0},pleaseentertheyearyouwereborn:",name)DimyearAsInteger=Integer.MaxValueWhileyear=Integer.MaxValueTryyear=Integer.Parse(Console.ReadLine())CatchfeAsFormatExceptionConsole.Write("Youdidnotenteravalidnumber.")Console.WriteLine("Pleaseenteraninteger,suchas1975.")EndTryEndWhileConsole.WriteLine("Youmustbeapproximately{0}yearsold!",DateTime.Now.Year-year)Console.WriteLine("Pressthe<Enter>keytoexittheapplication")Console.Read()EndSub'MainEndModule'Modulel如您所见,从C#到VB.NET的代码移植并不复杂。因为这两种语言运行于相同的运行库之上,所以这两段代码仅存在微小的语法差别。也应当注意到,这两段代码产生了相同的结果。这是.NET的ー种强大功能,它允许开发人员使用他最熟悉的语言编写代码。如果使用了编程语言X,您不必担心不能利用编程语言Z中的功能丫。因为每一种托管语言使用了相同的底层运行库,它们都具有相似的功能集。在命令行中编译.NET代码1.4在命令行中编译.NET代码到目前为止,使用VisualStudio.NETIDE是开发.NET应用程序最容易的方法,但它并不是仅有的方法。.NET运行库将C#、VB.NET和VJ#的编译器随其

运行库・起发布,因此只要有一个文本编译器和.NET运行库,就能够创建任何.NET应用程序。提示:为了实际开发并使用.NET应用程序,需要.NET运行库。如果没有安装,您可以从Microsoft的网站http://www.m/r//net处下载。打开ー个文本编辑器(例如Notepad),输入前面某ー个程序清单中的代码。保存该代码,并打开一个命令提示符。在使用.NET运行库中的编译器之前,需要设置路径,将其指向底层.NETFramework的位置。在命令窗口中,输入下面的命令更新路径:setpath=%path%;C:\WINDOWS\Microsoft.NET\Framework\vl.1.4322警告:如果Windows文件夹不是在C:\windows处,当更新路径变量时,确保输入了正确的Windows文件夹位置。命令行编译器位于上文所列出的文件夹中,与一些组成.NET运行库本身的程序集相同。C#的编译器是esc.exe,VB.NET的编译器是vbc.exe。这些可执行文件具有相似的命令行参数集,可以使用单个参数/?来显示这些编译器的所有参数。假设使用了该代码的C#版本,并将文件保存为classl.cs,可以利用如下命令将应用程序编译为名为app.exe的可执行程序。首先定位到代码文件所在的文件夹,然后运行下面的命令:esc/out:app.exe/target:exeClassi.cs输出应当类似于下面的内容:Microsoft(R)VisualC#.NETCompilerversion7.10.3052.4forMicrosoft(R).NETFrameworkversion1.1.4322Copyright(C)MicrosoftCorporation2001-2002.Allrightsreserved.

现在运行该应用程序,它将产生与使用IDE作为开发环境时相同的结果。游戏开发简述游戏开发简述在2001年,视频游戏的收入首次超过了电影工业的票房收入。该产业欣欣向荣,并需大量优秀的开发人员。如果ー个公司能够在某个顶级游戏中花费上百万美元,那他们很自然地会对游戏开发团队非常挑剔。本章将讨论游戏开发的过程和制作这些伟大游戏的团队。开发人员1.6开发人员在最近几年中,作为DirectX组的ー员,我非常高兴能够与大量的游戏开发人员ー起讨论问题。尽管每一个开发人员都是独特的,但是他们具有相似的特征。其中最显然的特征之一是他们都绝对喜爱游戏。当然,这是可以预料的。游戏开发是ー项艰苦的工作,它时间长、任务紧,压力大。那些不具有献身游戏精神的人应当去编写没有这些压カ的软件。尽管目前对于ー个游戏工作室来说,宣布在开发游戏中的花费是不常见的,但是许多游戏在开发期间花费了上百万美元,这是公司发行游戏的真实投资。许多游戏需要多年的开发,这需要对游戏本身和开发人员、艺术家、设计人员以及任何参与制作的人员具有绝对的信心。很多时候,发行商屈服于压カ,并在游戏准备好之前就发行。另外一种情形就像DukeNukemForever(3DRealms所发行的一款游戏)该游戏的开发时间超过了5年,发行商直到它最终完成オ发行。回到视频游戏开发的早期(古老的拱廊和Atari家庭系统),游戏通常由一个或两个人编写,编写时间是几周而不是几年。由此可以看到当今的视频游戏世界的巨大进步。回到那时您可以制作一个非常简单的游戏,例如Galaga,它只有ー个级别,玩家只能反复地在该级别中进行游戏。它的图形简单,但非常有趣并

且令人着迷。它的编写困难吗?任何曾经看到该游戏的开发人员应当认识到它非常容易编写。相反,当今的游戏功能非常巨大,必须设计、开发庞大的世界,并且创建一些艺术资产。大多数游戏包含多个级别和非常复杂的玩法,而不是早期游戏中所看到的向前向后移动并开火。所有这些先进的特性需要越来越多的开发时间,并且由于当今游戏玩家期望这些先进的特征,所以任何大预算的项目似乎都不可能在短短的儿周内完成。当今的大游戏也对游戏开发人员的繁荣添加了一层复杂性,因为捕获大众注意的游戏不再可能由个人完成。实际上个人(甚至是ー个小组)也不可能将所编写的游戏放到货架上出售,因为计算机软件商店销售游戏的开销是非常高的。大多数游戏开发初学者将他们编写的游戏作为共享软件发行,甚至是免费软件。有大量的网站为共享游戏开发作贡献,该团体由其他许多游戏开发人员组成,他们提供有价值的反馈、测试和论坛,在论坛中可以展示新思想以及炫耀您的最新创作。初学的游戏开发人员不可能通过创建这些小的共享游戏变得富有,但却使得他们能够开发重要的“样片(dem。reel)”,在大预算项目中申请ー个游戏开发位置时,可以使用这些样片。正如引言中提到的ー样,本书将引导您学习开发ー个高性能、完全3D的游戏所需要的技能,使得您在某一天能够开发自己的样片。在这之前,您需要询问自己:准备好成为一个游戏开发人员了吗?并询问自己以下儿个问题:您喜欢玩视频游戏吗?您是否曾经沉迷于游戏而忘记了时间?您常常在思考这些世界是如何创建的吗?您是否相信自己具有能够转换为下ー个伟大视频游戏的构想?您对当今存在的所有相同的老游戏感到厌烦了吗?您有关于重新定义流行视频游戏的构想吗?您希望我闭嘴,并马上告诉您如何编写自己的视频游戏吗?

如果您对这些问题中的一个或多个回答了“是”,则表示您非常渴望成为一名游戏开发人员。或许您已经具有某些构想,但不具备将头脑中的构想通过代码转化为实际游戏能力。本书将通过实际的游戏编程快速教会您这些技能。游戏开发过程1.7游戏开发过程所有的游戏开始时都只是ー个构想。如果没有构想,能编写什么呢?如果只是随机的编码,能够希望它在未来成为ー个伟大的作品吗?尽管这对抽象画家的工作可能有效,但软件开发人员不能在没有计划的情况下做任何事情。但是,只有构想,并不意味着可以开始编写代码。我曾经看到(并且将不断看到)的最大的错误是,开发人员提前进行代码的编写。除非代码非常简单,不用动任何脑筋,那么您可以立即开始编写代码,否则在只有一个构想的情况下就开始编写代码,决不是好的做法。在没有计划的情况下开始编写代码,所带来的只是更大的工作量、更多的反复编码以及更长的开发时间。在编写代码之前,应当开发ー个设计规范。该文档应当包含关于如何设计代码、对象如何交互和对象可能具有的各种属性的特定信息。如果没有这ー步就直接编码,在大多数情况下将导致解决错误的问题。即使您能够快速的解决这些问题,但是如果没有解决正确的问题,工作就是毫无意义的。结果将会花费更多的时间为真正的问题寻找解决方案。您也应当花ー些时间将构想记录到纸上(或者计算机文件中)。如果不想让您关于下ー个伟大的计算机游戏的构想非常含糊,以至于设计规范无法描述需要求解哪些问题,那么您最好确保您的构想是生动的。将构想展示给朋友,让他们提问题,并确保这些问题能够在您的文档中得到回答。如果您的构想类似于“编写ー个令人恐怖的第一人射手游戏”,那么说明您还没有很好地思考您的构想。玩家具有什么类型的武器?可以获得什么类型的游戏模式?支持多人游戏吗?在采取进一步的行动之前,您需要很好地思考您的构想。

如果您正在尝试为发行商开发游戏,那么也需要开发•个游戏建议。尽管将这・・建议写入文档是非常重要的,但在大多数情形下,更需要•个足够好的演示片段。如果只是基于ー个构想,发行商通常不会将项目交给您(除非您在游戏开发方面已经具有很大名气,如果是这样,您将不需要学习本书)。工具工具编写伟大的游戏并不只是编写好的代码。当然这并不表示代码的编写不重要,在创建这些游戏时,还需要考虑其他大量因素。所有游戏开发都需要一个好的工具集。当今的大多数游戏(即使是严格的2D游戏)都有大量的艺术成份,这些艺术成份是采用3D模型软件包开发的。这些工具对于参与游戏开发的艺术家来说是无价的,它们使得浮现在脑海里的构想成为现实。尽管在本书中并不讨论如何创建所需要的艺术,但会提到使用的工具。当今所使用的两种非常流行的数字内容生成工具是Maya和3DStudioMAX,分别如图1-5和图1-6所示。但是,创建艺术并不只是3D建模。即使一个模型由上百万个多边形组成,如果没有纹理的话,看上去也是很乏味的。很多工具可以用于创建纹理,例如Photoshop(如图1-7所示)和Paint(在安装Windows时附带安装了Paint,如图1-8所示)。6K图1-5使用Maya建模・个宇宙も船图1-6使用3DStudioMAX建模ー个妖怪图1-7使用Photoshop创建纹理图!-8使用Paint创建纹理开发和艺术加工工具都是非常好的工具,您将在游戏开发中使用到它们。还有一些其他类型的工具也非常重要,但很多人甚至没有考虑到它们,例如一个优秀的源码控制管理工具。

假设您的游戏具有声音,那么您很可能需要用于处理声音文件的工具。可以使用Windows附带的SoundRecorder(如图1-9所示),也可以使用比较复杂的WaveStudio,它是CreativeLab的音频软件的一一部分(如图1T0所示)。图1-9使用SoundRecorder图!-10使用CreativeLab的WaveStudio利用所有这些工具为游戏创建内容,您可能需要一个能够为整个团队存储内容的工具。很可能有大量的信息需要存储,以及定期备份。最好是只备份新更改和添加的记录。大多数源码控制管理工具至少提供其中某个功能。VisualStudio中的VisualSourceSafe是ー个简单的源码控制管理工具,它适用于小的团队。该工具不包含大型团队所需要的许多强大功能,例如允许多人操作一个文件和自动合并相互冲突的改变等功能,但是对于ー个小团队中的小项目来说,它通常能够满足需要。还有大量其他的源码控制工具(例如Perforce),因此您需要

做ー个小的调査,找出哪种工具适合您和您的小组。当然,使用任何ー一种工具都比没有工具强。小结1.9小结本章主要介绍了.NET的基础知识。相信您已经对.NET和托管代码有大致的了解,并且采用两种语言编写了一个简单的应用程序。您也学习了如何在集成开发环境之外编译这些应用程序。至此,已经介绍了如何开始进行游戏开发的相关基础,并且介绍了游戏的开发人员、开发过程以及游戏开发所需要的某些商业エ〇第2章中将介绍游戏开发相关的内容。提出游戏构想通过第1章的简短介绍后,现在开始本书的正题:3D游戏编程。显然,这个主题非常复杂,虽然您的第一个游戏无法发行,但是它将帮助您了解游戏开发基本原则。将游戏构想转换为实际的程序,是您所能够获得的最好体验。将大脑中的构想转换为其他人能够欣赏的实际内容,是所有开发人员的目标,但当这些构想与游戏相关时,回报似乎更大,而您肯定期望更大的回报。在本章中,将学习:提出游戏构想2D和3D编程差别细化规范提出游戏构想所有的事物都起始于构想,游戏也不例外。游戏构想可以源于您思考的任何方面。或许您看到您所喜爱的其他游戏,但是您认为如果在某些方面作一些变化,它将会更好。或许您做了一个梦,它能够转换为ー个极好的游戏。或许您意识到

两个不相关的游戏能够组合在ー・起,从而创建一个极佳的游戏。无论您的灵感源于哪里,在您开始制造游戏之前,都需要这样的灵感。不幸的是,由于还没有人发明一本能够阅读思想的书,在本书的示例游戏中您只能相信我的思想。本书之所以选择这些游戏,原因有很多,主要考虑到开发的难度。但是,每ー个例子都分属不同的类型,它们覆盖了游戏开发过程中遇到的大量不同主题。第一种类型的游戏是拼图游戏(puzzlegame)〇您很可能看到过或玩过拼图游戏。Tetris是ー个典型的拼图游戏,儿乎每个人都曾经听过,甚至因为玩这款游戏而废寝忘食。似乎每个人也都编写过Tetris游戏,因此您很可能不愿意选择它作为您即将编写的拼图游戏。另外Tetris是ー个2D游戏(尽管已经存在3D类型的Tetris游戏),因此,您也很可能希望跳过它。取而代之的是,您应当编写稍微具有特色的游戏。该游戏基于ー个面板。该面板由・系列的立方体组成,每个立方体处于ー种未确定模式,并且每个立方体至少与一个其他立方体直接相邻。棋盘是满足这些标准的ー个面板例子。其中每个立方体具有一种特定的颜色,当玩家走到某个立方体上时,它将变为另外一种预定颜色。在某ー级别中,当每个立方体处于正确的颜色时,该级别结束。细化提议正如第1章所介绍的ー样,一旦游戏的基本构想已经建立,您应当花费ー些时间讨论游戏的各种提议,以确保您的思考足够全面。对于这个游戏,下面是有助于细化提议的ー个列表:称为Blockers的拼图游戏只支持单个玩家完全3D环境得分基于完成一个级别所使用的时间每个级别由一系列相邻的立方体组成,例如一个棋盘每个立方体ー种颜色

在某个级别中,当每个立方体颜色相同,并且是该级别预定的、、终止”颜色时,该级别结束每个级别有一个最大时间限制每个立方体有一个颜色列表——最少包括两种颜色,最多包括六种颜色玩家通过在立方体上''跳动"来进行游戏,跳动时将立方体的颜色改变为列表中下ー种颜色起始级别中,每个立方体的颜色列表有两种颜色在更高级别中,每个立方体的颜色列表将具有更多的颜色,因此游戏的难度增加如果玩家能够完成这些级别,则允许颜色列表返回初始状态,来增加游戏的难度如果玩家不能在最大时间限制内完成游戏,则游戏结朿这个列表描述了游戏的每个特征吗?很可能没有,但是它回答了在策划游戏之前需要回答的主要问题。策划阶段并不是对游戏的每个功能进行细化,在您开始开发之前理解这…点是非常重要的,但是更需要您思考游戏需要的特征。在不考虑实际需要的功能的情况下就提前投入并编码,将导致后面的工作更困难,以至于您可能需要补充某些遗失的内容,或者因为鲁莽的计划而导致工作完全错误。根据计划,现在您可以开始设计游戏中使用的对象模型。对象图并不复杂。您具有神秘的游戏引擎,它保存了关于玩家、当前级别和绘图设备(renderingdevice)的信息。绘图设备用于将游戏的图形显示在显示器上。玩家需要某种类型的可视化表示,绘图设备将处理这些。该游戏的大多数地方需要当前级别的信息。当前时间非常重要,因为它用于确定玩家的分数和游戏结束时间(如超时,游戏即结束),因此当前级别必须访问它。实际的级别存储在文件系统中,位于应用程序的媒体目录中。因为当前级别需要加载ー个已经存在的级别,所以它也需要访问这些信息。级别需要记录的信

息是组成级别的立方体列表。每一个级别需要至少两个立方体,但是可以添加更多的立方体以满足更高的级别。该游戏并不容易编写,但是它并不需要创建多个对象确保满足游戏的目标。该游戏也非常好玩,只要更难的级别不会难到让玩家无法完成。一个游戏决不能够让玩家感到苦恼。如果游戏不好玩,则没有人会玩,该游戏也不可能成功。理解ー个3D游戏的需求2.2理解ー个3D游戏的需求认识到这个游戏(实际上任何游戏都是这样)不需要创造为完全3D的世界,是非常重要的。考虑到您的显示器很可能是一个矩形的平板,最终3D图形将显示在ー个2D平面上。创建一个2D组图(sprite)的集合,该集合将覆盖每ー种可能的场景,但是这种情况下所需要的艺术资产是巨大的。查看下面的例子。假设已经安装了DirectXSDKSummer2004Update,请加载DirectXSampleBrowser(图2T),确保Managed选项是左边被选中的惟ー项。单击Direct3D标题,向下寻找EmptyProject项,并单击InstallProject链接,遵循向导的步骤创建项目(将该项目命名为“Teapot”)。项目创建后,将其加载到IDE中。图2-1DirectXSampleBrowser

这将创建一个新的“空”项目(它实际上生成了某些用户界面控件,但是现在,那些都被忽略)。但是,该项目中还不存在任何3D,由于这个练习的目的是演示为什么希望编写3D游戏,所以最好添加•些内容。在这个项目中添加少量的代码,生成一个慢速旋转的茶壶。您要添加儿行代码,使得该应用程序能够进行图形绘制,在本章中不对这些代码功能进行解释。在本书的后面将给出大量的篇幅解释这些代码,但对于目前的演示来说,它们不是必需的。假设您将项目命名为“Teapot”,打开代码文件teapot,cs并将下面两个变量添加到这个类文件中:privateMeshteapotMesh=null;//MeshforrenderingtheteapotprivateMaterialteapotMaterial;//Materialforrenderingtheteapot现在创建茶壶和用于绘制场景的材质,找到该类中的OnCreateDevice方法,将下面的代码添加到该方法的结尾处://CreatetheteapotmeshandmaterialteapotMesh=Mesh.Teapot(device);teapotMaterial=newMaterial。;teapotMaterial.DiffuseColor=newColorValue(1.0f,l.Of,l.Of,l.Of);为了使茶壶更真实,还需要光照效果(这些会在本书的后面详细解释)。找到类中的OnReseDevice

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论