當安裝好了VS 2008和XNA GameStudio 3.0後,我們就可以開始學習XNA了。
首先,在VS 2008中新建一個XNA GameStudio 3.0項目(選擇Windows Game類型),會生成一個最簡單 的、可運行的游戲模板。
接下來我們將注意力轉移到我們要剖析的重點 —— 從Microsoft.Xna.Framework.Game繼承的Game1 類,其代碼如下:
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
protected override void Initialize()
{
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
}
protected override void UnloadContent()
{
}
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
base.Draw(gameTime);
}
}
我們簡單解釋一下該類中所用到的重要類型。
GraphicsDeviceManager 圖形設備管理器,用於訪問圖形設備的通道。
GraphicsDevice 圖形設備。
Sprite 精靈,繪制在屏幕上的的2D或3D圖像,比如游戲場景中的一個怪獸就是一個Sprite。
SpriteBatch 它使用同樣的方法來渲染一組Sprite對象。
而Microsoft.Xna.Framework.Game 這個基類就像是一個基礎框架,它把整個游戲流程串聯了起來,即 ,整個游戲會按如下流程運轉。
該圖中的五個方法正好對應著Game1類中的五個方法,它們的作用解釋如下。
Initialize方法用於初始化與游戲相關的對象,比如初始化圖形設備、游戲環境設置等。
LoadContent方法在Initialize方法之後調用,它用於加載游戲所需要的圖形或其它素材,比如模型、 圖片、聲音等。
Update和Draw方法構成了游戲循環。
Update方法用於改變和控制游戲的狀態,主導著游戲邏輯的進行。
Draw方法用於在屏幕上繪制我們的場景、Sprite。要注意的是,我們應該盡可能少的在Draw方法中處 理游戲邏輯——它們應該在Update方法中被處理。Draw方法僅僅負責繪制。
Update和Draw方法都接受一個GameTime類型的參數,GameTime有什麼作用了?這個參數可以幫助我們 依據實際的游戲時間而不是處理器的速度來決定動畫或其它事件的發生時刻。
在這個最簡單的例子中,游戲將以默認的60fps(Frame/Second)運行。
UnloadContent方法在游戲結束時被調用,該方法用於卸載在LoadContent方法中所加載的素材和那些 需你要進行特別處理的善後事宜。
狀態輪詢與事件監聽
寫過Windows應用程序的朋友都知道,當用鼠標點擊Form上的一個Button時,會觸發一個Click事件, 而我們的應用程序通過監聽到事件的發生進而來處理事件。
而在游戲開發中,我們需要將我們的這種“事件”思維切換到“輪詢”思維。也就是說,游戲中,用 戶的鼠標、鍵盤操作並不會觸發相關的事件。如果是這樣的話,那我們該如何知道用戶是否按下了鼠標了 ?答案是我們需要在游戲循環中(確切的說是在Update方法中)不斷地檢測輸入設備(比如鼠標)的狀態 來進行判斷。
這就是輪詢機制與事件機制的區別,也是游戲開發和普通windows應用開發需要轉換思路的地方。
歸根到底,windows事件機制也是對輪詢機制(即Windows消息循環)的一個封裝。
今天的介紹就到這裡,下一節我們將介紹與渲染相關的基礎知識。
最後,附上XNA GameStudio 3.0的下載地址:http://creators.xna.com/en-us/xnags_islive