《XNA高级编程:Xbox 360和Windows》11

第一部分 XNA Framework基础


第一章 XNA简介

     欢迎进入XNA的世界。作为一个游戏程序员,你大概了解一些DirectX的知识以及XNA Framework的基础。这一章主要介绍怎样安装XNA Game Studio Express以及如何有效地使用它,同时也包含很多对即使已经了解这些基础的人也非常有用的技巧。 

     在接下来的几章中你将直接开始开发一些很酷的小游戏,这一部分主要包含一些基础知识的介绍,并设计一些在本书中将会用到的辅助类,为更高级的游戏项目开发一个图形引擎。为了简单起见,我们从第一部分的2D编程开始,然后再进阶到第二部分的3D编程。

     现在让我们开始XNA的精彩旅程吧!

 

1.1 XNA Framework入门
 


     XNA是由微软开发的,并在几年前就已经开始了,但对外一直都很保密,直到2004年的GDC(Game Developers Conference)大会上微软才第一次宣布XNA。XNA不仅仅是一个类似DirectX的开发框架,同时还包含很多有用的工具以及一个从Visual Studio衍生出来的集成开发环境(IDE),这些都将帮助游戏开发人员更容易地工作。在2006年XNA发布之前(从2004年到2006年),DirectX开发者只能在DirectX SDK的开发文档上方看到“XNA”标识,如图1-1所示(XNA意思就是“XNAs Not Acronymed”)。

图1-1

图 1-1
 

     这就是说微软已经开发XNA Framework有一段时间了,但是开发者对它并不了解。XNA有可能是DirectX的继任者,但是在2005年底为Windows Vista平台而订制的Direct3D 10测试版发布了,这又表明对这样一个新的操作系统平台来说DirectX仍然是首选的图形框架。随后,在2006年的GDC大会上微软发布了XNA Build March 2006 CTP版本。XNA Build是一个允许你管理复杂构建过程的工具,很像Msbuild和Ants,但比它们更复杂、更强大。微软以开源的方式发布了一款游戏叫MechCommander 2,很多人下载了这款游戏并重新构建。但过了一段时间发现,一些中小规模的开发组实际上并不需要这样一款复杂的构建管理工具。

     之后,此事慢慢沉寂下来,只有微软自己以及DirectX MVP们(幸运的是我也是其中一员)开始接触并了解即将发布的XNA Framework和XNA Game Studio。而其他人直到8月由微软举办的Gamefest大会上才看到它们,微软在2006年8月30号宣布了XNA Game Studio Express Beta1。在第一款测试版本中,XNA只包含一个初学者工具包——“Space Wars”,此时还没有太多的3D功能。很多开发者和爱好者们开始体验XNA,并使用XNA中的Sprite类写了很多2D小游戏。虽然你可以很快地创建自己的Pong游戏克隆,或者是简单的射击游戏,但是却很难写自己的3D模型导入器以及渲染代码。

     最初,XNA Game Studio Express只是定位在初学者、爱好者和学生群体,帮助他们快速地创建自己的可以在Windows和Xbox 360平台上运行的游戏。但这并不是说专业的游戏开发工作室就不能使用XNA,不过专门面向专业的游戏开发工作室的XNA Game Studio专业版将在2007年的夏季发布(译者注:实际上并没有发布)。如果你想使用Visual Studio 2005专业版来开发XNA游戏,可以参照本章稍后将要介绍的技巧。

     令人高兴的是,几个月之后的2006年11月份微软又发布了另一款测试版,并在2006年12月发布了XNA Game Studio Express的最终正式版,该版本加入了内容管道(Content Pipeline)的内容和很多新特性,这些都将在第2章和第3章中介绍。

     XNA是完全免费的,并且第一次允许开发者同时为Windows和Xbox 360平台开发游戏。但是如果你想在Xbox 360控制台上运行你的游戏,你要加入“Creators Club”,并交纳99美元的年费。

XNA Game Studio Express

     图1-2是XNA Game Studio Express运行时的界面图,随后你将学习如何安装它。

图1-2

图 1-2

     上图不仅仅看上去很像Visual C# 2005 Express,实际上就是它,只是如果创建XNA项目会对项目设置有一些小小的更改,同时在“工具-选项”中还有一个特殊的选项,允许你添加自己的Xbox 360设备并输入密钥。另外,在该IDE中还有一些新的特性,比如:内容管道可以帮助你快速地将texture、模型和shader导入到项目中。更多的新特性随后将一一介绍。

     XNA Game Studio Express是目前唯一一个可以使用XNA Framework来开发游戏的集成开发环境,不过微软将在2007年夏季或者稍晚些时候发布XNA Game Studio Professional版本,XNA Game Studio Professional 将基于Visual Studio 2005 Professional版本,并允许你使用所有Visual Studio的插件和特性。如果你有Visual Studio 2005并打算创建XNA项目,但Visual Studio 2005中并不包含相应的模板。更不幸的是,你也无法使用Visual Studio 2005打开在XNA Game Studio Express中创建的.csproj文件。继续往下读,你将在“使用Visual Studio 2005 Professional?”部分了解更多让Visual Studio 2005和XNA一起工作的技巧。

     微软还提到另一个XNA IDE版本叫做XNA Studio,这个版本基于Visual Studio Team System版本,并且定位在大型的游戏开发工作室。了解XNA Framework更多知识可以访问:http://msdn.microsoft.com/directx/xna/faq

应用程序模型

     本质上XNA Framework框架可以分为如图1-3所示的三个部分:

图1-3

图1-3

     上图所列的DLL文件全部使用C# 编写,并且是完全的托管动态库,这也就是说你可以使用像Reflection(可以从http://www.aisto.com/roeder/dotnet 获得)这样的工具打开它们并查看它们是如何工作的 ,如图1-4所示。大部分内部函数只是调用DirectX的DLL,这也简化了操作。内容管道稍后将讨论。

图1-4

图1-4

     每个XNA项目都使用一个Game类,它包含了所有重要的游戏组件,比如图形设备(Graphic Device)、窗口设置以及内容管理器,你还可以添加用户输入和声音处理,基本上你的游戏所做的每一件事情都由Game类来处理,或者由Game类中封装的其它组件来处理。

     下面是Game类中包含的最重要的三个方法(见图1-5)。在正式版本中,Game1.cs(该文件在你创建一个新的XNA项目时由系统自动生成)文件中还默认添加了两个辅助方法:LoadGraphicsContent和UnloadGraphicsContent,但这些方法在本书中不会用到,因为在Initialize函数中进行所有的初始化更容易。

图1-5

图1-5

  • Initialize ( )
  • Update (GameTime time)
  • Draw (GameTime time)
     或许您已经猜到这些函数的功能了。Initialize方法用来加载所有的游戏内容,设置启动参数,初始化你需要的每一样东西。如果你想参考微软为XNA提供的设计模式,你可以把这些加载代码放到LoadGraphicsContent方法中。Update方法在游戏的每一帧重画之前被调用,来更新游戏时间、用户输入、声音以及其它任何在游戏屏幕上看不到的数据。如果你的游戏显卡功能有限的话,Update方法被调用的次数要比Draw方法多得多,本书中的所有例子都不用特别考虑Update方法和Draw方法的被调用次数,但无论如何你的更新代码(Update)要独立于重画代码(Draw)。最后,在重画每一帧的时候,Draw方法将被调用来把所有东西绘制到屏幕上。在单元测试的时候,Update方法和Draw方法之间的独立性并不总是那么重要,大多数时候都可以被忽略,但在最终发布的游戏中一定要确保游戏逻辑和重画代码保持独立。例如,在Windows平台上,用户可能按下Alt和Tab键,或者最小化游戏窗口,这种情况下Draw方法就不必再被调用,但游戏仍然会在后台继续运行,这一点对于要保持游戏者同步性的网络游戏来说尤其重要。

     另外,你也可以添加GameComponent类到你的Game类中,这些类也包含Update和Draw方法,这两个方法在Game的Update和Draw方法中被自动调用,而初始化在构造函数中直接进行。最初,微软想让开发者直接在Visual Studio的设计器中来创建或者添加游戏组件,这个功能在XNA Game Studio Express的第一个测试版中可以看到(2006年8月30号)。后来,由于设计器功能工作起来不是很好,Xbox 360平台也不支持,而且很多开发者也不用它,它就被去掉了。

     “游戏组件”这个想法主要是为了重用代码,以便在多个游戏之间进行共享,比如一个帧计数器(Frame Counter)或者一个sky cube mapping renderer for the 3D background。个人认为这有两个主要缺点:XNA本身并没有标准的游戏组件,而且开发者自己来写这样一个应用模型甚至对它进行扩展也不是很难。在本书中我不会过多地使用GameComponent这些类,不过你们可以在自己的游戏中随意使用,第四章将会详细介绍GameComponent类,以及它的优点和缺点。在Game类中包含一个Components属性,可以用它来很容易地添加更多组件。

     不过,不要误会我上面所说的,其实游戏组件想法本身其实是很棒的!在XNA第一个测试版发布的时候,微软的XNA Framework项目经理Mitch Walker做过一个网络讲座(webcast),来介绍游戏组件以及如何组合使用它们。最初,我对内容管道以及游戏组件这样的概念也并不是很明白,从网络讲座来看它们很酷,但是当我写自己的第一个XNA游戏时发现第一个测试版提供的设计器功能并不是非常有用。在第二个测试版以及最终的正式版中,很多最初的游戏组件代码以及XNA Game Studio中的图形设计器组件都被删除了。之所以这样,是因为微软找不到一个好的方法在Xbox 360控制台上来实现并应用设计器以及游戏组件的想法(这些以前只在Windows平台上可以正常工作)。这正好证实了我的第一感觉:游戏组件的概念并不是很有用,甚至在某些方面它会限制你的想法(第四章将会有详细介绍)。

     基本上每一个游戏都会实现自己的UI界面以及菜单逻辑。实际上仔细想想会发现,在 每一个应用程序中使用Windows的那些标准的菜单系统是一件很让人厌烦的事情,然而在每个游戏中都以一种全新的方式来创建新的菜单将是一个非常好的体验。而且如果你想创建新的游戏,你还可以很容易地提取出代码创建自己的游戏组件,这样你就可以重用这些代码(比如之前提到的SkyCubeMapping类)。有些游戏组件,比如第四章将要讲到的摄像机类(Camera)以及游戏屏幕图截取器类(Screenshot Capturer),都是非常好的组件示例,这些都可以在其他游戏中被重用,但本书中所涉及的游戏当中的其他东西都没有使用游戏组件的概念来实现。

     使用这种应用程序开发模型,微软希望游戏开发者团体能够很容易地创建并分享他们的游戏组件,同时促进XNA开发团体的不断进步。有关更多信息可以参考www.codeplex.com上的体验项目。

内容管道

     内容管道主要用来导入、编译和加载游戏资源,比如texture、3D模型、shader以及声音文件(如图1-6),它极大地减少了代码量,因为没有内容管道的帮助你要获取图形、3D数据以及shader这些数据都不得不自己编写代码。例如,如果你在项目中添加一个使用了两个texture和一个shader的模型文件,那么内容管道将处理这个模型文件并自动获取需要的texture和shader,内容管道会把这些数据编译成二进制形式,它帮你获取一切你想要的东西,而不需要你自己去做。

图1-6

图1-6

     现在假设你添加到项目中的模型需要使用的shader包含一个错误。在过去,当你运行游戏的时候,会出现一个异常告诉你shader无法编译,游戏将终止。而现在,在程序Build 过程中shader就已经被编译了,你无需通过运行游戏来查看是否有错误,你可以根据XNA Game Studio Express提供给你的在构建过程中出现的错误消息很快地修复这些错误,然后再重新编译就可以了。

     内容管道并不仅仅包含一个DLL文件,总共包含如下五个DLL:
  • Microsoft.Xna.Framework.Content.Pipeline.dll 它包含了内容管道最基本的功能
  • Microsoft.Xna.Framework.Content.Pipeline.EffectImporter.dll 它用来编译和导入shader
  • Microsoft.Xna.Framework.Content.Pipeline.FBXImporter.dll 它是所有DLL中最大的一个,包含了大量的代码来导入 .fbx类型的3D模型文件,并且还支持很多其他特性,比如皮肤(Skinning)和骨骼(Bones)等
  • Microsoft.Xna.Framework.Content.Pipeline.TextureImporter.dll 它主要用来导入texture文件,这些文件可以是dds文件(这是最好的纹理格式,并且支持硬件压缩),也可以是 .png .jpg .bmp .tga等格式文件,2D sprites也是texture并通常采用未压缩32位格式
  • Microsoft.Xna.Framework.Content.Pipeline.XImporter.dll 允许你导入 .x 3D模型文件,这是一种很多DirectX程序和示例都使用的格式
     在你编写游戏的过程中永远都不需要使用这些DLL,它们仅仅会在把数据构建并编译
到.xnb(XNA Binary)文件中才被使用。这样你就不必再去考虑这些游戏内容文件,当游戏运行的时候就已经可以确保所有内容文件都存在了。千万不要去修改.xnb文件,这些文件就像.exe类型的输出文件一样不可以直接修改,并且数据也不可以再被转换回texture、模型或者shader(虽然有可能这么做,但没有可以使用的工具)。而且,在Windows和Xbox 360平台上,即使游戏的源代码以及所使用的内容文件可能一样,但.xnb文件也会有很大的差别。

     另外,你也可以创建自己的内容处理器,把你拥有的其他任何类型的游戏资源(比如另一种格式的模型文件)编译到.xnb文件中。You explore that in Part II when you have to make sure all your 3D models have tangent data for the normal mapping shaders

     好了,以上就是目前你要掌握的基础知识,是时候开始行动编写第一个游戏了。
原文地址:https://www.cnblogs.com/AlexCheng/p/2120346.html