Microsoft XNA ("XNA's Not Acronymed"),完全支持托管代码的运行环境,由微软提供用以帮助电脑游戏开发、电脑软件开发及管理的一些工具。XNA把游戏设计员从“反复刻版编程”中解放出来,还把游戏开发上的所有需要结合到一个系统之中。XNA 工具集在2004年3月24日在美国加州圣荷西市的游戏开发者大会首次亮相,第一个公开技术预览在2006年3月14日推出,最新版本3.0在2008年10月30日推出。
XNA Framework 是建置于.NET Framework 2.0上,XNA 将DirectX的功能以托管代码的方式封装运作(因此微软终止了Managed DirectX 9.0的开发,所以有人称XNA为Managed DirectX 2.0),另外还加入了一些专注于游戏开发上类别库,在指定的平台上使“代码重用”达之最大效果。XNA Framework 在一个特别为有管理式游戏运行的通用语言运行库(Common Language Runtime)版本上运行。这个运行层支持Windows XP、Windows Vista、Windows 7、Windows Phone 7和XBox 360。由于游戏是开发在运行层上,使得游戏能在所有支持XNA Framework 的平台上只要很少甚至不需要任何更改便能运行。现时所有在XNA Framework 上的游戏必需使用C #和XNA Game Studio Express IDE开发。
XNA 的程序都是继承自Game class,它包含了所有重要的游戏组件,比如图形设备(Graphic Device)、窗口设置以及内容管理器,你也可以添加GameComponent class到你的Game class。XNA Framework 把所有用作游戏编程的低端技术封装起来,例如XNA提供了Effect(BasicEffect)类别来处理大部分绘图着色相关的工作,开发人员不需再理会“矩阵变量”相乘,只要指定对象的World、View、Projection即可,其相乘效果由Shader档自动处理。Effect 本身还能用于加载和编译shader, Effect.CurrentTechnique 可用于指定technique, 像是AmbientLight; Effect.SetValue可以用来设置Shader的参数。一个effect包含一个或多个technique,一个technique包含一个以上的pass。在pass里面可能还有VertexShader, PixelShader,这些元素构成一份effect文件, 这也就是极简化后的HLSL代码。因此,游戏开发员就可以专注于游戏内容开发而不用关心游戏移植至不同平台上的问题,游戏只要开发于XNA 的平台上,所有硬件只要支持XNA都能运行。XNA Framework 还内置一些工具,例如XACT以帮助游戏内容开发。这些工具还能帮助开发视觉和听觉效果和和像真度很高的模型制作。
XNA Framework 同时支持2D 和3D 的游戏开发也支持XBox 360 的控制器和震动效果。Content Pipeline被用来导入.fbx格式,而且加载像纹理(Texture)、3D模型、着色器(shader)。Shader指令经过编译之后,直接加载到显卡上的GPU来运行。Xbox Live卖场可以升级开发者的XNA Game Studio Express 以使能把他们开发的游戏用于Xbox 360上。
首先,让我们看看Programs.cs文件的摘要内容:
using System; namespace WindowsGame1 { #if WINDOWS || XBOX static class Program { static void Main(string args) { using (Game1 game = new Game1()) { game.Run(); } } } #endif }
首先要使用System名称空间,并且判断运行环境是否在Windows或是Xbox360下
并写了一个静态类别 Program 里面的static void Main(string args){...}
是程序的进入点(C#基本常识),然后产生一个Game1对象game,最后使用Game1对象的run方法运行游戏。
后面介绍有关Game1对象的类别分段代码
using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media;
这里是很基本的名字空间使用,简介每个名称空间的用途。
namespace WindowsGame1 { ..... }
首先设置了一个WindowsGame1的名称空间,里面包含着一个类别:
public class Game1 : Microsoft.Xna.Framework.Game { ...... }
Game1类别,继承Microsoft.Xna.Framework.Game类别
其中Game1类别里面又有
GraphicsDeviceManager graphics; SpriteBatch spriteBatch;
public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; }
GraphicsDeviceManager类别是管理有关绘图卡方面的设置
SpriteBatch类别则是有关2D图片、文字的绘画设置。
还可以看到一个建构式public Game1(){...}
里面让graphics对象先产生出来
并规定Content的目录在Content文件夹之下
接下来
protected override void Initialize() { base.Initialize(); }
是一个改写原父类的初始方法
因为Microsoft已经把繁复的初始内写在父类当中
变得相当简化,直接调用base(基底类别)使用即可
所以可以让制作者专心在游戏重点的初始化
接下来
protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); }
这是改写读取材质 音效...etc的方法,先让spritBatch对象透过绘图设备参数,而产生
然后制作者可以上传其想要的内容,写法如下:
Content.Load<T>("AssetName");
T可以是很多种类型,像是Texture2D、Model...等,而AssetName则是内容名称。
这里主要是使用到了泛型
protected override void UnloadContent() { }
这个改写方法是用来回收内容的。接下来
protected override void Update(GameTime gameTime) { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); base.Update(gameTime); }
这是改写了逻辑更新的方法,也是整个游戏的重心所在,GameTime对象可以获取游戏时间。另外透过GamePad对象 可以得知玩家1是否按下了倒退键而结束游戏如果想透过键盘可以这样写:
if (Keyboard.GetState().IsKeyDown(Keys.Back)){...}
最后会调用父类 base.Update(gameTime);
接下来
protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); base.Draw(gameTime); }
这部分是绘图的部分,也需要游戏时间确定画面跟逻辑更新是同步的,首先使用GameDevice对象Clear方法,把画面清成淡蓝色,同时也调用父类进行运作。Update跟Draw会连续进行每秒钟60HZ的更新速度来跑动游戏,直到出现离开程序指令。
BasicEffect是XNA 内置的 Shader, 支持12种渲染模型,ContentPipeline根据xnb模型文件说明,设置模型的MeshPart的BasicEffect参数。
XNA中实现Shader很简单。对XNA程序来说,Shader是一个小程序,只要把shader文件(.fx)导入到Contents 即可,会自动生成素材(material)。
technique Technique1 { pass Pass1 { VertexShader = compile VertexShaderFunction(); PixelShader = compile PixelShaderFunction(); } }
再透过XNA Effect class 来加载和编译shader。HLSL可以在XNA或是DirectX使用。
effect = Content.Load<Effect>("MyShader"); effect.CurrentTechnique = effect.Techniques ; effect.Begin(); foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Begin(); ... pass.End(); } effect.End(); // 終止使用 effect
如果想要改用BasicEffect 以外的Shader, 你必须自己调用DrawPrimitive()。
2006年, Microsoft XNA Build March 2006 CTP 在GDC 上被发布。XNA Build 是一工具,允许你管理复杂的编译,类似Msbuild 和Ants,功能更强大。2006年8月30日微软宣布了XNA Game Studio Express Beta1。2006年12月微软又发布了XNA Game Studio Express的正式版,该版本加入了内容管道(Content Pipeline)。
2010年美国当地时间3月15日,微软官方XNA发布了期待已久的XNA 4.0的社区预览版和路线图,包含在Windows Phone Developer Tool CTP中。目前只有英文版本,可以用于编写Silverlight或XNA for Windows Phone游戏,Xbox游戏,PC游戏,没有Zune游戏的开发模版。
第一个XNA Game Studio Express 的beta版本首度于2006年8月30日提供下载,2006年11月1日有第二个版本推出。2006年12月11日微软首度提供正式版
2007年4月24日, Microsoft 更新 XNA Game Studio Express 1.0 Refresh.
XNA Game Studio 2.0 于2007年12月13日推出. XNA Game Studio 2.0Visual Studio 2005亦实现有相同的特色与功能 (包括免费的 Visual C# 2005 Express Edition)。
XNA Game Studio 3.0 (基于Visual Studio 2008) 支持Zune的游戏开发。beta版在2008年9月推出.2008年10月30日推出正式版. XNA Game Studio 3.0 目前可支持 C# 3.0, Visual Studio 2008之上还支持LINQ. 在XNA3.0中,SoundEffect可以不透过XACT也可以做到特效的处理。
XNA Game Studio 3.1于2009年6月11日推出。可支持 video playback, 并修正了Audio API, 还支持Xbox LIVE Party system 并且可以使用 Xbox 360 Avatars。
XNA Game Studio 4 最早2010年3月9日由 "Community Technical Preview" 在 GDC 上发布, 并于2010年9月16日完整推出.。XNA 4集成了Visual Studio 2010, 可支持Windows Phone 7 平台 (包括:3D API的硬件加速)。VertexDeclaration 在 XNA Game Studio 4.0中略有改变,另外SpriteBatch.Begin也可以配合pixel shader。
XNA架构素材管道(XNA Framework Content Pipeline)是一种可扩展的素材处理框架,素材(Content)是在Visual C# Express内进行管理。在添加素材时,需要选择工具(importer),例如: Autodesk FBX,.FX, .XAP,这些工具用于接收资料,FBX是一种转移3D(3D transport)文件格式,将其标准化(normalize)。
正式名称是 XNA Game Studio Professional, XDK Extensions 是 XNA Game Studio 附加,可用于发展Microsoft Xbox 360.
虽然已被世界上很多开发员采用,但XNA 并未能真正发挥的作用,例如使游戏编程更容易。这是因为他没有一些重要的功能如骨骼动画(Skeletal animation),对初学者而言还是比较复杂的编程。另一个问题是有人认为XNA 没让开发者有太多控制权,这使得大多数的大型游戏制件过还是用C++直接调用DirectX。
在程序编辑上,XNA 确实大幅改善了繁杂的程序设计。包括:资源回收系统、简易声音API, 与背景保护程序的冲突改善等。但是由于企业界已经投入大量心力在C++与DirectX上面,目前仍然鲜见有企业愿意针对新语言C# 还有新平台XNA 进行投资。