創建Game Components

此文檔是基於 XNA Beta 2的

     Game components是 XNA Framework 基礎的一部分;他是用來統一game的對象數據的一種方法,由於他起的作用,這個Framework 裏的game類就可以自由的使用他們了。創建一個game component 的目的是爲了創建一個可重用的代碼"塊"(block),可以用他來完成很多事情。一個game component可以是一個簡單的可以繪製到屏幕上2D精靈,也可以是一個高級的3D地形;game component可以用來做相當多的事情。爲了讓事情變得簡單,我們將從創建一個在屏幕上繪製位圖(bitmap)的組件開始。爲了讓我們的組件可以在屏幕上渲染數據,我們不能從GameComponent繼承,而必須要從DrawableGameComponent繼承。這樣做是爲了讓我們可以訪問一些用來在遊戲中控制圖形數據的重要的方法。

想了解更多關於GameComponent 和 DrawableGameComponent的信息請看文章結尾處。 點擊這裏

     打開Visual C# Express (Game Studio Express),創建一個新工程;我給這個工程命名爲"Tutorial1"。在你點擊確定以後,IDE創建所有你需要的東西,包括一個基本的Game類,他的名字是"Game1.cs"。讓我們繼續添加一個組件吧,你可以通過點擊"添加(Add)->新建項"(New Item),選擇Game Component(我將他命名爲"Sprite"),然後點擊添加。

     在這個基本的game component模板加載後,第一件我們要做的事情就是將他從GameComponent類繼承改爲從DrawableGameComponent類繼承。請參照下面的代碼段進行修改。

// 將這一行...
public partial class Sprite : Microsoft.Xna.Framework.GameComponent
// 改成這樣...
public partial class Sprite : Microsoft.Xna.Framework.DrawableGameComponent

     這將允許我們在恰當的時候重載Draw函數。讓我們來重點看看我們要在屏幕上繪製位圖需要哪些成員。恩,需要一個 ContentManager,一個SpriteBatch, 一個Texture2D 還有 一個 Rectangle (用來表示精靈要繪製到屏幕上的區域)。讓我們將他們添加好然後繼續...你可能還需要添加兩個XNA Framwork庫的引用。請確定Members Region(成員區域)在Sprite類裏,而不是using語句所在的區域。

using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
...
#region Members
protected SpriteBatch m_sBatch;
protected ContentManager m_conManager;
protected Texture2D m_texture;
protected Rectangle m_dest = new Rectangle(0, 0, 0, 0);
#endregion

     現在我們擁有了一些可以使用的成員了。然而在我們繼續深入研究之前,讓我們先討論在開發一個game component時的一些practice的標準。設計一個game component的步驟可以分爲3-4個階段(非drawable的component只要3個階段)。第一階段是構造函數;在這裏進行所有一般的初始化操作還有將組件添加到services collection的操作(將在後面的指南里討論)都是很重要的。不應該在構造函數裏獲取其他service的引用。獲取Game.Services collection裏的對象的引用的操作應該在Initialization 方法內進行 (階段2).然後階段 3是加載(load)和卸載(unload)任何我們使用的圖形素材(content)。在我們的例子中,這些圖形素材包括SpriteBatch 和 ContentManager 對象還包括Texture2D對象.這些方法在DeviceReset/Create/Lost 事件發生時調用,並且他們對於讓應用程序在窗口大小改變或者最小化後能繼續運行起着非常重要的作用。最後一個階段所包含的方法在"game loop"中被循環調用。他們是Update和Draw(只是DrawableGameComponent類中有),他們可以用來移動對象和/或繪製對象。下面是我們每個階段的代碼,註釋描述了每一步我們要做些什麼。由於我們不需要在階段1和2進行任何特定的初始化,所以我們只需要關心加載素材和繪製他們。我們使用素材管道來將圖片加載到Texture2D中。等一會,我們將加載真正的素材到工程中。

加載 / 卸載 圖形素材

protected override void LoadGraphicsContent(bool loadAllContent)
{
    base.LoadGraphicsContent(loadAllContent);

    if (!loadAllContent)
        return;
    
    // 創建一個新的content manager
    //      - 這個類將幫助我們加載圖片到紋理中
    m_conManager = new ContentManager(game.Services);
    
    // 創建一個新的spritebatch
        //      - 這個類將幫助我們繪製紋理到屏幕上
    m_sBatch = new SpriteBatch(this.GraphicsDevice);

    // 加載紋理資源,ball.png
    m_texture = m_conManager.Load<Texture2D>("ball");

    // 創建目標矩形(rectangle).
    //      - 這將用來表示精靈繪製的位置和大小。
    m_dest = new Rectangle(128, 128, m_texture.Width, m_texture.Height);
}

protected override void UnloadGraphicsContent(bool unloadAllContent)
{
    base.UnloadGraphicsContent(unloadAllContent);

    if (!unloadAllContent)
        return;

    // 釋放紋理
    m_texture.Dispose();

    // 釋放SpriteBatch.
    m_sBatch.Dispose();

    // 釋放素材管理器(content manager).
    m_conManager.Dispose();
}

     現在是添加繪製代碼的時候了,讓我們來在屏幕上繪製一些實實在在的東西吧。一個SpriteBatch 對象就可以幫助你將多個紋理渲染到屏幕上,對於要將成百個精靈立即渲染到屏幕上的情況SpriteBatch將能幫上很大的忙。

繪製

public override void Draw(GameTime gameTime)
{
    m_sBatch.Begin(SpriteBlendMode.AlphaBlend);

    m_sBatch.Draw(m_texture, m_dest, Color.Maroon);

    m_sBatch.End();

    base.Draw(gameTime);
}

     這個指南的組件方面已經完成了。我們需要將這個素材(content)添加到我們的工程中。 在Game Studio Express進行這個操作非常方便,因爲當我們添加一個素材項目的時候,他將被立即作爲素材來構造(build)。我們這個指南中我使用的是一個PNG文件, "ball.png",這是一個24x24象素大小並且包含透明的用來創建一個球的圖片。你可以通過右擊下面的圖片選擇圖片另存爲來保存這個文件,將他保存在你的工程的目錄裏。當你完成這一切以後在你的工程的解決方案瀏覽器( Solution Explorer )內右擊你的工程,選擇“添加->現有項”,在文件類型內選擇 "All Files",然後添加這個文件, ball.png。請確保這個資源的屬性窗口內的名字爲 "ball",只有這樣你才能正確的加載這個資源。

     當你完成這些以後,你已經可以使用你的Sprite組件了!只需要在你的game類內創建一個引用,然後實例化他,並且將他添加到 Components collection中。這樣做可以確保這個component的方法 (Update, Initialize, and Draw)能夠在適當的時候被調用。

Sprite sprite;
...
sprite = new Sprite(this);
...
this.Components.Add(sprite);

當你構造並且運行你的應用程序後,你應該可以得到一個與下面截圖相同的畫面。這裏有這個指南的源代碼,點擊 這裏.

關於GameComponent and DrawableGameComponent更多的信息
 

     在Beta2中,只有不多的幾種方法用來創建game component,取決於你的需求你可以選擇其中任意一種方法。讓我們來看看兩個主要的component類吧, GameComponent 和 DrawableGameComponent. 從他們的名字中我們就能知道GameComponent不需要渲染任何東西而DrawableGameComponents則正好相反.

  • GameComponent
    • Interfaces

       

      • IGameComponent
      • IUpdateable
      • IDisposable
  • DrawableGameComponent
    • Interfaces

       

      • IGameComponent
      • IUpdateable
      • IDisposable
      • IDrawable

     你可以看到,這兩個component是如此相似,差別只在於DrawableGameComponent多了LoadGraphicsContent/UnloadGraphicsContent兩個protected方法還有一個Draw方法.既然我們想繪製一個精靈到屏幕上,那我們就需要從DrawableGameComponent繼承了.如果我們希望的話,我們也可以簡單的在一個類上直接實現IDrawable,IUpdateable和IGameComponent這幾個接口,然後配合Game類使用

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章