何謂XNA:
XNA Framework 是建置於 .NET Framework 2.0上,另外還加入了一些專註於遊戲開發上類別庫,在指定的平台上使程式碼重用達之最大效果。XNA Framework 在一個特別為有管理式遊戲啟動並執行通用語言執行層(Common Language Runtime)版本上運行。這個執行層支援Windows XP、Windows Vista和XBox 360。由於遊戲是開發在執行層上,使得遊戲能在所有支援XNA Framework 的平台上只要很少甚至不需要任何更改便能運行。現時所有在XNA Framework 上的遊戲必需使用C #和XNA Game Studio Express IDE開發。
XNA Framework 把所有用作遊戲編程的低階技術包起來,由此,遊戲開發員就可以專註於遊戲內容開發而不用關心遊戲移植至不同平台上的問題,遊戲只要開發於XNA 的平台上,所有硬體只要支援XNA都能運行。XNA Framework 還內建一些工具,例如XACT以協助遊戲內容開發。這些工具還能協助開發視覺和聽覺效果和和像真度很高的模型製作。
XNA Framework 同時支援2D 和3D 的遊戲開發也支援XBox 360 的控制器和震動效果。Xbox Live賣場可以升級開發人員的XNA Game Studio Express 以使能把他們開發的遊戲用於Xbox 360上。
由於XNA基於.NET 2.0,其開發效率比C++直接調用DirectX API 快了不少,對於我等業餘的遊戲開發人員,是件好事。
XNA相關:
現在XNA最高版本已升級至3.1,並且加入了對Video的支援,並且需要在VS2008或其Express版本中安裝。(至少理論上是,本人本地VS2008+2010+Win7屢次安裝遭自動復原,請教老外結果仍不理想,最終只能硬著頭皮再安裝個Express用於XNA)
其次,國內現在XNA的相關資源非常之少,嚴重依賴於相關英文參考。建議大家去看 Learning XNA 3.0-XNA 3.0 Game Development for the PC, Xbox 360, and Zune;XNA 3.0 Game Programming Recipes-A Problem-Solution Approach 和 Beginning XNA 3.0 Game Programming-From Novice to Professional相關的書,我看下來還是非常不錯的。
貌似國內不少人正翻譯或已經部分翻譯此類文。
下載XNA
第一個XNA程式
安裝完XNA Framework後,在VS中即出現XNA的相關項目Template. 我們隨便建立一個名曰 WindowsGame1的XNA項目。
編譯後,出現藍天白雲一片
現在,我們開始嘗試在藍天白雲中,增加一些我們自己的元素。
插一句
習慣於windows編程的朋友往往比較習慣對事件的監聽或觸發。其實,windows本身是基於訊息佇列的,事件就是不斷監聽訊息並做出相應的處理。 不熟悉的朋友可以在dotnet winForm中重載WndProc即可知曉。
在每個遊戲中,都存在訊息迴圈,即不斷計算和控制介面不斷重新整理的迴圈。XNA也不例外,其Microsoft.Xna.Framework.Game以及我們以後說到的GameComponent都存在著自己的訊息迴圈。
其中,
Initialize用於對遊戲介面內一些對象的初始化。
LoadContent用於載入遊戲內的一些資源,像,檔案,聲音等。
緊接著,Update和Draw 便開始遊戲內的訊息迴圈,前者主要用於相關計算,後者用於繪製。
XNA的預設重新整理率是60fps(Frame/Second)
我們首先在Content Directory下添加一張一存在的圖片old english sheepdog.png 將其Content Importer和Processor 改為Texture - XNA Framework
請注意,XNA源生的API不支援GIF,如果需要匯入則需要自己實現相應的Importer和Processor
插一句
Mircosoft.Xna.Framework.Content.Pipeline 是專門用於處理遊戲資源的管道,無論是映像還是聲音,3D資源或是XML的處理和編譯都是在其之下處理編譯的。
編譯後,任意資源都會被編譯成.XNB(XNA二進位檔案)。請注意,雖說XNA能同吃Windows和XBox,但其資源檔編譯過程是不同的,不可通用,須重新編譯。
緊接著,匯入圖片後,我們可以緊接著LoadContent以及Update和Draw了
//建立變數img;用於儲存映像
Texture2D img;
//在LoadContent中增加
this.img = this.Content.Load<Texture2D>("old english sheepdog");
其中"old english sheepdog"就是剛才載入的映像的Name屬性。
這樣,我們便可以直接在Draw方法中,讓XNA的每次重新整理都畫出這樣圖片了
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(img, new Rectangle(0, 0, 50, 50), Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
簡單解釋下以上代碼,
GraphicsDevice.Clear(Color.CornflowerBlue);用於擦除當前螢幕內的映像
spriteBatch 通常用於繪製Sprite,即精靈。
請注意,在XNA的一個Game裡請避免使用多個 spriteBatch ,並且所有映像的繪製都必須在spriteBatch 的Begin和End之間。
至於 spriteBatch.Draw 具有多個重載, 具體參考
這樣,我們第一個映像就誕生了
細心的你發現了吧,遊戲介面內沒有滑鼠游標,那多簡單,自己畫個。
//聲明全域變數p
Point p;
//在Update方法中增加
MouseState ms=Mouse.GetState();
p = new Point(ms.X, ms.Y);
//修改Draw方法
spriteBatch.Draw(img, new Rectangle(p.X, p.Y, 50, 50), Color.White);
這樣,滑鼠游標,便變成當前映像了。
當然,如果你只需要預設windows滑鼠游標作為遊戲游標,則不需要這麼麻煩
//在Initialize中
this.IsMouseVisible = true;
即可。
這樣,我們第一個XNA程式便完成了。
轉載:
http://www.cnblogs.com/edwin1986/archive/2010/01/15/XNA_1.html