第一部分 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

这就是说微软已经开发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

上图不仅仅看上去很像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

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

图1-4

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

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

图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

现在假设你添加到项目中的模型需要使用的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/zoujia867/archive/2009/01/28/906933.html

《XNA高级编程:Xbox 360和Windows》1-1相关推荐

  1. 《XNA高级编程:Xbox 360和Windows》1-2

    1.2免费获取XNA Game Studio Express 要开始编写代码,您必须确保已经安装了一些工具,其中IDE是您快速开始的一个非常重要的工具.如果您已经安装并配置了XNA Game Stud ...

  2. 《XNA高级编程:Xbox 360和Windows》5-1

    第五章编写自己的XNA图像引擎 5.1本章概览 在本书的第一部分,您学习了XNA Framework,使用SpriteBatch类渲染2D图像,并且做了几个有趣的小游戏.现在,是时候探索更加令人兴奋的 ...

  3. 《XNA高级编程:Xbox 360和Windows》3-6

    3.6 StringHelper类 StringHelper类是最大的辅助类之一,估计它是我写的第一个辅助类,因为针对字符串的处理操作非常多,很容易就可以想到一些方法来改善性能,更容易地处理字符串列表 ...

  4. 北通xbox360模拟器_如何将无线Xbox 360控制器连接到计算机

    北通xbox360模拟器 The wired Xbox 360 controller is USB, so using it for PC gaming is easy–but things get ...

  5. Windows Phone 7游戏高级编程:使用XNA Game Studio 4

    <Windows Phone 7游戏高级编程:使用XNA Game Studio 4> 基本信息 原书名:Professional Windows Phone 7 Game Develop ...

  6. xbox360链接pc_如何在Windows PC上使用Xbox 360控制器

    xbox360链接pc The keyboard and mouse might be a good fit for many native computer games, but it feels ...

  7. Windows高级编程学习笔记(一)

    写在前面的话 之前学的Windows编程都是界面啊.网络编程啊之类的纯应用层面的东西,总是感觉而自己没有达到自己期望中的水平.什么水平呢?如果让你编写监控系统资源的工具,或者DLL注入相关软件,或者底 ...

  8. [STM32F1]基于STM32F103实现Xbox 360 Controller for Windows 之Xinput

    上个月由于家里有事,实现了并枚举成功的Xinput,就差数据处理没有完成,请假在家,客户急要,只好请同事改改,玩usb hid已经差不多两年了,至今也算没有实现Xbox 360 Controller ...

  9. ASP.NET MVC 4高级编程(第4版)

    <ASP.NET MVC 4高级编程(第4版)> 基本信息 作者: (美)Jon Galloway Phil Haack Brad Wilson K. Scott Allen 译者: 孙远 ...

最新文章

  1. mysql全表扫描和用索引的区别
  2. BZOJ1355: [Baltic2009]Radio Transmission
  3. [Machine Learning]--无监督学习
  4. 利用位运算解决 N 皇后问题
  5. Window捕获消息机制-C#
  6. html5 烟雾,jQuery烟雾背景发生器(HTML5 Canvas插件waterpipe.js
  7. c# xls 复制一行_C# 复制Excel单元格格式
  8. Javascript 中的非空判断 undefined,null, NaN的区别
  9. 一位 JavaScript 铁杆粉眼中的 Rust!
  10. ACM学习历程—HDU5668 Circle(数论)
  11. 小程序源码:全新外卖侠cps5.6全套微信小程序源码下载(内附加2.7.5版本微擎)支持多种CPS收益和流量主收益
  12. markdown 插入视频 、gif、 MP3
  13. 2020年iOS如何申请苹果公司开发者账号流程详细图文介绍
  14. 4. DBSCAN方法及其应用
  15. 什么是微信公众号开发
  16. 动态网站数据采集 - 去哪儿网火车票查询爬虫
  17. shen_tian_hao的C++快快编程AC代码库(每周更新)
  18. python水位传感器输出水位_水位传感器坏了的表现_判断水位传感器好坏方法
  19. foxmail邮件数据和通讯录的备份恢复
  20. SQLite下载与基本操作

热门文章

  1. 机器学习基础知识详解!
  2. GNN教程:DGL框架中的采样模型!
  3. 算法原理:大数据处理的分治思想!
  4. 【廖雪峰python入门笔记】while循环
  5. 代码详解 | 用Pytorch训练快速神经网络的9个技巧
  6. 「留光」1小时:中科大让我们离「量子U盘」又近了一步
  7. 有一群200w年薪的朋友是什么感觉?谈一谈入学中国科学院大学的几点感受吧
  8. html 标签、图像、链接、注释、锚点定位、特殊字符
  9. 汇编语言reg和sreg bp的介绍
  10. 理解卷积神经网络的局限