MicrosoftXNA("XNA'sNotAcronymed"[1]),完全支持託管代碼的運行環境,由微軟提供用以幫助電腦遊戲開發、電腦軟體開發及管理的一些工具。XNA把遊戲設計員從“反覆刻版編程”中解放出來[2],還把遊戲開發上的所有需要結合到一個系統之中。[3]XNA工具集在2004年3月24日在美國加州聖荷西市的遊戲開發者大會首次亮相,第一個公開技術預覽在2006年3月14日推出,最新版本3.0在2008年10月30日推出。
概觀
[編輯]XNAFrameworkXNAFramework是建置於.NETFramework2.0上,XNA將DirectX的功能以託管代碼的方式封裝運作(因此微軟終止了ManagedDirectX9.0的開發,所以有人稱XNA為ManagedDirectX2.0),另外還加入了一些專注於遊戲開發上類庫,在指定的平台上使“代碼重用”達之最大效果。XNAFramework在一個特別為有管理式遊戲運行的通用語言運行庫(CommonLanguageRuntime)版本上運行。這個運行層支持WindowsXP、WindowsVista、Windows7、WindowsPhone7和XBox360。由於遊戲是開發在運行層上,使得遊戲能在所有支持XNAFramework的平台上只要很少甚至不需要任何更改便能運行。現時所有在XNAFramework上的遊戲必需使用C#和XNAGameStudioExpressIDE[1]開發。
XNA的程式都是繼承自Gameclass,它包含了所有重要的遊戲組件,比如圖形設備(GraphicDevice)、視窗設定以及內容管理器,你也可以添加GameComponentclass到你的Gameclass。XNAFramework把所有用作遊戲編程的低級技術封裝起來,例如XNA提供了Effect(BasicEffect)類型來處理大部分繪圖著色相關的工作,開發人員不需再理會“矩陣變數”相乘,只要指定對象的World、View、Projection即可[4],其相乘效果由Shader檔自動處理。Effect本身還能用於載入和編譯shader,Effect.CurrentTechnique可用於指定technique,像是AmbientLight;Effect.SetValue可以用來設定Shader的參數。一個effect包含一個或多個technique,一個technique包含一個以上的pass。在pass裡面可能還有VertexShader,PixelShader,這些元素構成一份effect檔案,這也就是極簡化後的HLSL代碼。因此,遊戲開發員就可以專注於遊戲內容開發而不用關心遊戲移植至不同平台上的問題,遊戲只要開發於XNA的平台上,所有硬體只要支持XNA都能運行。XNAFramework還內置一些工具,例如XACT以幫助遊戲內容開發。這些工具還能幫助開發視覺和聽覺效果和和像真度很高的模型製作。
XNAFramework同時支持2D和3D的遊戲開發也支持XBox360的控制器和震動效果。Contentpipeline被用來導入.fbx格式,而且載入像紋理(Texture)、3D模型、著色器(shader)。Shader指令經過編譯之後,直接載入到顯示卡上的GPU來運行。XboxLive賣場可以升級開發者的XNAGameStudioExpress以使能把他們開發的遊戲用於Xbox360上。
[編輯]XNA的流程簡介
首先,讓我們看看Programs.cs檔案的摘要內容:
usingSystem;
namespaceWindowsGame1
{
#ifWINDOWS||XBOX
staticclassProgram
{
staticvoidMain(string[]args)
{
using(Game1game=newGame1())
{
game.Run();
}
}
}
#endif
}
首先要使用System命名空間,並且判斷運行環境是否在Windows或是Xbox360下
並寫了一個靜態類型Program裡面的staticvoidMain(string[]args){...}
是程式的進入點(C#基本常識),然後產生一個Game1對象game,最後使用Game1對象的run方法運行遊戲。
後面介紹有關Game1對象的類型分段代碼
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingMicrosoft.Xna.Framework;
usingMicrosoft.Xna.Framework.Audio;
usingMicrosoft.Xna.Framework.Content;
usingMicrosoft.Xna.Framework.GamerServices;
usingMicrosoft.Xna.Framework.Graphics;
usingMicrosoft.Xna.Framework.Input;
usingMicrosoft.Xna.Framework.Media;
這裡是很基本的命名空間使用,簡介每個命名空間的用途。
SystemC#最基本的命名空間
System,Collections.Generic泛型的命名空間
System.LinqLing(一種嵌入式的資料庫查詢語言)的命名空間
Microsoft.Xna.FrameworkXNA基礎命名空間
Microsoft.Xna.Framework.AudioXNA音效方面命名空間
Microsoft.Xna.Framework.ContentXNA內容輸出入命名空間
Microsoft.Xna.Framework.GamerServicesXNA玩家許可權命名空間
Microsoft.Xna.Framework.GraphicsXNA繪圖命名空間
Microsoft.Xna.Framework.InputXNA輸出入(鍵盤、滑鼠)命名空間
Microsoft.Xna.Framework.MediaXNA多媒體命名空間
namespaceWindowsGame1
{
.....
}
首先設定了一個WindowsGame1的命名空間,裡面包含著一個類型:
publicclassGame1:Microsoft.Xna.Framework.Game
{
......
}
Game1類型,繼承Microsoft.Xna.Framework.Game類型
其中Game1類型裡面又有
GraphicsDeviceManagergraphics;
SpriteBatchspriteBatch;
publicGame1()
{
graphics=newGraphicsDeviceManager(this);
Content.RootDirectory="Content";
}
GraphicsDeviceManager類型是管理有關繪圖卡方面的設定
SpriteBatch類型則是有關2D圖片、文字的繪畫設定。
還可以看到一個建構式publicGame1(){...}
裡面讓graphics對象先產生出來
並規定Content的目錄在Content資料夾之下
接下來
protectedoverridevoidInitialize()
{
base.Initialize();
}
是一個改寫原父類型的初始方法
因為Microsoft已經把繁複的初始內寫在父類型當中
變得相當簡化,直接調用base(基底類型)使用即可
所以可以讓製作者專心在遊戲重點的初始化
接下來
protectedoverridevoidLoadContent()
{
spriteBatch=newSpriteBatch(GraphicsDevice);
}
這是改寫讀取材質音效...etc的方法,先讓spritBatch對象通過繪圖設備參數,而產生
然後製作者可以上載其想要的內容,寫法如下:
Content.Load<T>("AssetName");
T可以是很多種類型,像是Texture2D、Model...等,而AssetName則是內容名稱。
這裡主要是使用到了泛型
protectedoverridevoidUnloadContent()
{
}
這個改寫方法是用來回收內容的。接下來
protectedoverridevoidUpdate(GameTimegameTime)
{
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);
接下來
protectedoverridevoidDraw(GameTimegameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
base.Draw(gameTime);
}
這部分是繪圖的部分,也需要遊戲時間確定畫面跟邏輯更新是同步的,首先使用GameDevice對象Clear方法,把畫面清成淡藍色,同時也調用父類型進行運作。Update跟Draw會連續進行每秒鐘60HZ的更新速度來跑動遊戲,直到出現離開程式指令。
[編輯]XNA中實現Shader
BasicEffect是XNA自帶的Shader,支持12種渲染模型,ContentPipeline根據xnb模型檔案說明,設定模型的MeshPart的BasicEffect參數。
XNA中實現Shader很簡單。對XNA程式來說,Shader是一個小程式,只要把shader檔案(.fx)導入到Contents即可,會自動生成素材(material)。
techniqueTechnique1
{
passPass1
{
VertexShader=compilevs_2_0VertexShaderFunction();
PixelShader=compileps_2_0PixelShaderFunction();
}
}
再通過XNAEffectclass來載入和編譯shader。HLSL可以在XNA或是DirectX使用。
effect=Content.Load<Effect>("MyShader");
effect.CurrentTechnique=effect.Techniques["AmbientLight"];
effect.Begin();
foreach(EffectPasspassineffect.CurrentTechnique.Passes)
{
pass.Begin();
...
pass.End();
}
effect.End();//終止使用effect
如果想要改用BasicEffect以外的Shader,你必須自己調用DrawPrimitive()。
[編輯]XNABuild
2006年,MicrosoftXNABuildMarch2006CTP在GDC上被發布。XNABuild是一工具,允許你管理複雜的編譯,類似MSBuild和ANTS,功能更強大。2006年8月30日微軟宣布了XNAGameStudioExpressBeta1。2006年12月微軟又發布了XNAGameStudioExpress的正式版,該版本加入了內容管道(ContentPipeline)。
[編輯]XNAGameStudio
2010年美國當地時間3月15日,微軟官方XNA發布了期待已久的XNA4.0的社區預覽版和路線圖,包含在WindowsPhoneDeveloperToolCTP中。目前只有英文版本,可以用於編寫Silverlight或XNAforWindowsPhone遊戲,Xbox遊戲,PC遊戲,沒有Zune遊戲的開發模版。
[編輯]XNAGameStudioExpress
第一個XNAGameStudioExpress的beta版本首度於2006年8月30日提供下載,2006年11月1日有第二個版本推出。2006年12月11日微軟首度提供正式版[5]
2007年4月24日,Microsoft更新XNAGameStudioExpress1.0Refresh.[6]
[編輯]XNAGameStudio2.0
XNAGameStudio2.0於2007年12月13日推出.[7]XNAGameStudio2.0[8]VisualStudio2005亦實現有相同的特色與功能(包括免費的VisualC#2005ExpressEdition)。
[編輯]XNAGameStudio3.0
XNAGameStudio3.0(基於VisualStudio2008)支持Zune的遊戲開發。beta版在2008年9月推出.[9]2008年10月30日推出正式版.XNAGameStudio3.0目前可支持C#3.0,VisualStudio2008之上還支持LINQ.在XNA3.0中,SoundEffect可以不通過XACT也可以做到特效的處理。
[編輯]XNAGameStudio3.1
XNAGameStudio3.1於2009年6月11日推出。可支持videoplayback,並修正了AudioAPI,還支持XboxLIVEPartysystem並且可以使用Xbox360Avatars[10]。
[編輯]XNAGameStudio4
XNAGameStudio4最早2010年3月9日由"CommunityTechnicalPreview"在GDC上發布,並於2010年9月16日完整推出.[11]。XNA4集成了VisualStudio2010,可支持WindowsPhone7平台(包括:3DAPI的硬體加速)。VertexDeclaration在XNAGameStudio4.0中略有改變,另外SpriteBatch.Begin也可以配合pixelshader。
[編輯]XNAFrameworkContentPipeline
XNA架構素材管道(XNAFrameworkContentPipeline)是一種可擴展的素材處理框架,素材(Content)是在VisualC#Express內進行管理。在添加素材時,需要選擇工具(importer),例如:AutodeskFBX,.FX,.xap,這些工具用於接收數據,FBX是一種轉移3D(3Dtransport)檔案格式,將其標準化(normalize)。
[編輯]XDKExtensions
正式名稱是XNAGameStudioProfessional,XDKExtensions是XNAGameStudio附加,可用於發展MicrosoftXbox360.[12]
[編輯]XNA批評
雖然已被世界上很多開發員採用,但XNA並未能真正發揮的作用,例如使遊戲編程更容易。這是因為他沒有一些重要的功能如骨骼動畫(Skeletalanimation),對初學者而言還是比較複雜的編程。另一個問題是有人認為XNA沒讓開發者有太多控制權,這使得大多數的大型遊戲製件過還是用C++直接調用DirectX。
在程式編輯上,XNA確實大幅改善了繁雜的程式設計。包括:資源回收系統、簡易聲音API,與背景保護程式的衝突改善等。但是由於企業界已經投入大量心力在C++與DirectX上面,目前仍然鮮見有企業願意針對新語言C#還有新平台XNA進行投資。