第1章:XNA介绍
欢迎来到XNA的世界。作为一个游戏程序员,你或许知道 DirectX ,甚至也许具有XNA 框架的基础知识。 这一个章节解释了如何安装 XNA Game Studio Express 和如何以有效率的方式使用它。它也包含相当多的技巧,这些技巧甚至可能对任何一个已经知道基础知识的人都有用。
在下面一些章节中,你将直接地开始开发一些很酷的小游戏。 这部分包含基本的功能和在这一本书中稍后将会使用的辅助类,来为更先进的游戏程序开发一款图形引擎。 为了让一切保持简单,将从第一部分的2D编程开始,然后前进到第二部分的3D。
让我们开始吧!
介绍XNA框架
XNA被微软公司开发,并且开始于多年前,但是保持地非常秘密。在2004年GDC(年度最大的游戏开发讨论会)上微软第一次宣布XNA。XNA不仅仅像DirectX一样是个框架;它还包含很多工具,甚至是一个自定义的IDE。因为直到2006年,还没有一点工具被发布,DirectX的开发者们仅仅在2004到2006年的DirectX SDK文档的右上角标示了“XNA”的图标。
图 1-1
这意味着微软已经着手 XNA 的框架有相当时间了,但是开发者并不真的知道所期待的是什么。它可能是 DirectX 框架的一位继承者, 但是当2005 年底,Direct3D 10 Beta在Windows Vista 上被发布, DirectX 似乎仍然是这个新操作系统的首选图形框架。然后在 2006 年初期微软 XNA 建立,在 GDC 2006 年三月时CTP 被发布。然后在2006年初 的GDC上,Microsoft XNA Build March 2006 CTP被发布。XNA Build 也是一个工具,它允许你管理复杂的编译过程,类似于 Msbuild 和Ants这样的工具,但是更复杂和强大。因为微软的 Mech Commander 2也被作为一个开源软件发布。 许多人下载它并且重编译MechCommander 2这个游戏。但是一段时间以后,没什么更多的事发生,特别是小型和中型开发团队不真的需要一个复杂的编译管理工具。
然后它安静了好一阵子,并且只有微软职员和 DirectX MVPs(我是幸运者之一)开始知道即将来临的 XNA 框架和 XNA Game Studio要发布。世界上的其它人在八月的 Gamefest 会议才发现有关内容,在这里微软宣布在 2006 年8月30 日发布XNA Game Studio Express beta 1 。 第一个beta只包含了一个初学者工具包,“Space Wars”,而且 XNA 没有包括很多的3D功能。许多开发者和爱好者尝试 XNA ,并且在它的Sprite类的帮助下写了许多小型的 2D 游戏。 虽然你可以很快地创建你简单的射击型游戏,写你自己的3D模型导入器和渲染代码却很困难。
XNA Game Studio Express 最初的目标是初学者、爱好者和学生,已允许他们快速开发自己的Windows和XBox360平台的游戏。 但是这不意味着专业的游戏工作室不能使用 XNA。XNA Game Studio Professional 这样的一个特别版本,目标就是专业的游戏工作室,它在 2007 年夏天将被发布。但是如果你想要用Visual Studio 2005 专业版开始开发, 下面我会在这一章节的后面描绘如何有效率的让VS和XNA工作的窍门。
值得高兴地是,微软在几个月之后的2006年11月发布了下一个beta版,这发生在2006年12月XNA Game Studio Express最终发布之前。最终版包括了容量管道和许多你将在第二章和第三章学习的新特色。
XNA 完全免费而且允许开发者一次性同时地创建游戏的Windows平台版和 Xbox 360 平台版。 但是如果你希望你的 XNA 游戏运行在 Xbox 360 控制台,你必须参加 “Creators Club”交纳 $99 的年费。
XNA Game Studio Express
图1-2向你展示了 XNA Game Studio Express,学习该如何立刻安装它。
屏幕不仅仅看上去和Visual C# 2005 Express相似,实际上它就是VC# 2005。如果你创建一个XNA工程项目, 仅仅只要某些小改变。 在“Tools”也有一个额外的选项–〉“Options”,它允许你选择 Xbox 360 设备而且输入密钥。另外,有一些新的特征在 IDE 内; 例如, 内容管道(content pipeline)允许你快速地把纹理,模型、和着色器(shader)导入到你的工程。更多关于所有的信息是很少的。 XNA Game Studio Express当前只是用 XNA 框架开发游戏的唯一可获得的IDE,但是微软在 2007年某一时间(夏季或更晚)将会提供XNA Game Studio Pro 。
XNA Game Studio Professional 将会基于Visual Studio 2005 Professional Edition 并且让你使用所有的Visual Studio插件和特性。
应用程序模型
XNA 框架被分为三个核心部份:(见图 1-3)::
在Microsoft.Xna.Framework.dll中的XNA图形引擎
在the Microsoft.Xna.Framework.Game.dll中的XNA应用程序模型
在Microsoft.Xna.Framework.Content.Pipeline.dlls中的XNA内容管道
所有这些dll文件被C#编写,而且完全是托管的dll。这意味着你能用一个类似Reflection的工具打开这些dll (该工具可以从http://www.aisto.com/roeder/dotnet得到)而且直接看到它们如何工作(见图1-4) 。大多数的内在功能就像DirectX的dll,而且一样单一化。 内容管道(content pipeline)一言难尽。
看一看应用程序模型。
每个 XNA 工程项目使用一个Game类,它包含所有重要的游戏组件,图形设备,windows设置,和内容管理器。在这里,你也可以添加输入和声音处理。基本上,你的游戏中的一切是以Game类为基类的高层次类,或者至少某些组件来自于Game类。 下面是Game类中三个最重要的方法(见图1-5) 。
对于最后的发布版本,微软把LoadGraphicsContent 和 UnloadGraphicsContent助手方法默认地添加到Game1.cs类,这个类是在你创建一个新的XNA工程项目时自动创建的。但是这些方法在本书将不被采用,因为一切要初始化和加载的代码放在Initialize方法中,要简单得多。
图 1-5
Initialize ()
Update (GameTime time)
Draw (GameTime time)
你很可能已经猜测到所有的这些方法要做什么。
Initialize 加载你所有的游戏内容,设定你所有的启始设定,而且初始化你需要的每件事物。 如果你想要跟随微软提供给 XNA 的设计样式,你就用LoadGraphicsContent方法加载一切。在每一帧被绘制之前,Update方法将被调用,它将更新你的游戏时间、输入、声音和其他一切在荧屏上不可见的事物。 即使你的游戏被GPU限制,比Draw更频繁被调用的Update方法,也能很好的发生。但是你的更新代码应该与绘图代码相分离运行,并且这本书中没有需要特别注意Update 和 Draw 被调用的次数的范例。最后,Draw被每一帧调用,来绘制屏幕上的一切。Update 和 Draw的分离可能不总是重要的,几乎总是可能被单元测试所忽略,如果最终游戏在确定游戏逻辑独立运行于绘图代码上不是非常重要。举例来说, 在Windows平台上,用户可能按”Alt +Tab”键或者将游戏最小化, 在这种情况下,Draw不再需要再次被调用,但是也许你希望游戏在后台继续运行。 这对于网络游戏确定玩家仍然同步尤其重要。 另外,你能把 GameComponent 这些类添加到你的游戏类,游戏类再次拥有一个 Update和 一个Draw 方法。 这两个方法都会从你的游戏的Update and Draw 方法自动地被调用。 初始化能直接地在构造器那里发生。最初,微软想要开发者使用Visual Studio设计器,来创建和添加游戏组件,这个设计器能被看作是XNA Game Studio Express (30 August, 2006)的第一个beta版。 这个设计器特色后来因为它没有很好地工作,不支持 Xbox 360 平台而被删除,无论如何没有很多设计者使用它。
游戏组件化思想是说重复使用你的部份代码,并且使它们非常容易嵌入你的游戏。例如一个帧计数器或者是一个天空盒,它作为3D背景的映射渲染器。 依我之见,有二个主要的不利点: XNA没有标准的游戏组件被运送;而且自己写这样一个应用程序模型,甚至扩展它的代码也不是真的困难。 在这一本书中,我将不使用许多GameComponent 类, 但是把它们插入到你的代码是你的自由。阅读第 4 章 GameComponent 类的更多细节,并且学习它的优点和缺点。 因为游戏类有一个Components属性, 增加更多的组件非常容易。
不要说我错误,游戏组件的基本思想真的很棒;当第一个XNA beta版被发布的时候,关于游戏组件和该如何联合它们,有一个来自于Mitch Walker的网络小广播,他是微软XNA框架的程序经理。首先,我不是非常确信内容管道和游戏组件思想,考虑了什么。这个网络广播看上去很酷,但是当我开始给我的第一个XNA游戏项目编码的时候,我没有在当前的第一个beta里找到非常有用的设计器。在第二个beta和最终发布版,大多数初始化游戏组件的代码被删除,XNA Game Studio也有了图形化的设计器组件。这种情况的产生是因为Microsoft 不能找到一条途径来实现设计器,以及对于XBox360控制台,游戏组件化思想是不是有效(之前它仅仅工作在Windows平台)。只是证实了我的第一感觉,游戏组件化思想不是非常有用,并且甚至可能限制你的某些考虑,例如不得不考虑到自己绘制图形(更多细节看第四章)。
这情形类似于,每个游戏执行自己的UI和菜单逻辑,这是相当有争议的。但是如果你考虑到它,就像Windows给每个应用程序使用一些标准菜单是多么令人生厌,而且看到每一款游戏有一个新的菜单是多么好的体验。你还会容易的选取代码 并且创建你自己的游戏组件如果你想创建一个新游戏,并且你只是重用代码(例如SkyCubeMapping类)。某些游戏组件像摄相机camera、屏幕快照screenshot capturer 这些类是组件能在许多其他游戏重用的好例子,但是本书几乎所有其他的一切都没有使用游戏组件化来实现。 它总是一种美好的经验在哪些菜单在每场游戏中被产生见到一个新的方法。如果你想要产生一场新的游戏,你能仍然非常容易地吸取代码而且产生你自己的游戏成份, 然后你能仅仅重复使用代码。(举例来说, SkyCubeMapping 类)像来自第 4 章的照相机和 screenshot capturer 类的一些游戏成份是能在许多其他的游戏中被重复使用的成份的好例子,但是几乎在来自这一本书的游戏的其他每件事物被实现不使用游戏成份。
关于应用程序模型,微软的愿望之一就是游戏开发者社区能容易地创建并且分享他们的游戏组件,而且改善 XNA 方面的社区。 你能在 www.codeplex.com 上检索出eXperience工程项目,得到更多的信息。
内容管道
内容管道被用来导入、编译、而且加载像纹理、3D模型、着色器(shader)、游戏的声音文件这些游戏资源到你的工程项目(见图 1-6) 。 它大大减少了自定义代码的数量,这些代码你必须得到图形,3D数据,着色器(shader)在你的游戏。 例如,如果你拖拽了一个模型文件到你的工程项目,而且它使用二种纹理和一个特定的着色器(shader)你不是必须自己做这些; 内容管道的输入器“编译”数据为二进位的格式,而且在这个过程得到你需要的每件事物。
说到着色器shader,你把模型添加到工程项目会包含一个错误。 在过去,你将会启动你的游戏工程项目, 然后得到一个异常,告诉你着色器shader 无法被编译,而且游戏失败。 现在着色器shader 被编译在生成解决方案的过程,而且你不是必须启动游戏来看它是否工作。 通过行号和来自于XNA Game Studio Express编译输出窗口的错误信息,你能很快地修订错误和重新生成。 内容管道(content pipeline )并不是由一个dll构成的; 它有五个不同的dll:
Microsoft.Xna.Framework.Content.Pipeline.dll包含了内容管道(content pipeline )的基本功能。
Microsoft.Xna.Framework.Content.Pipeline.EffectImporter.dll被用来编译和导入着色器(shaders )。
Microsoft.Xna.Framework.Content.Pipeline.FBXImporter.dll是所有 dll中最大的,而且包含大量导入.fbx格式的3D模型文件的代码,并且支持许多特性, 例如蒙皮和骨骼。
Microsoft.Xna.Framework.Content.Pipeline.TextureImporter.dll 用来导入对游戏的纹理文件。这些文件可能已经是DirectX格局的dds文件(这是纹理和支持硬件压缩的最好格式),但是.png,.jpg,.bmp, 和.tga 文件也被支持。2D 精灵只也是纹理,而且通常使用不压缩的32-bit格式。
Microsoft.Xna.Framework.Content.Pipeline.XImporter.dll 允许你导入.X 3D模型文件,这是一种被许多DirectX应用程序和范例所使用的格式。
你的游戏本身将不再需要这些dll之中的任何一个; 它们仅仅被用来建立和编译内容为.xnb文件(XNA 二进制)到你的建立过程。 这会让部署很容易,因为你再也不必担心游戏内容文件;它很容易确保所有的内容文件在你启动游戏的时候。 不要修改.xnb文件,它们只是.exe 那样的输出格式,而且不应该被直接修改。 数据也不会被转换回纹理、模型或着色器shaders (也有可能逆转,但是没有那种工具)。 在Windows平台和 Xbox 360 平台上的.xnb 文件也大不相同,然而游戏原始码和内容文件可能完全相同。 另外,你能创建你自定义的内容处理器,这允许你编译任何其他的游戏资源 (举例来说,另一个模型格式) 为.xnb文件。当你必须确定你所有的 3D模型已经有(法线映射shader的)切线数据的时候,你在第二部分探究这些。
好的,那是你现在所需要的所有基础。 现在是该行动并且编译你的第一个游戏的时候了。