2007年10月9日 星期二

XNA Game Studio Express 初試

http://richielin-programer.blogspot.com/2007/10/xna-game-express_09.html

image
系統需求

Windows XP SP2 及 Vista 各版本 (看來 Microsoft 已徹底放棄 Windows 2000 了)
支援 Shader Model 1.1 及至少支援 DirectX 9.0c 的圖形界面卡

檔案下載

Visual Studio 2005 Express Editions 及 SP1
Microsoft XNA Game Studio Express 1.0 Refresh
.NET Framework 2.0
.NET Framework 1.1

##CONTINUE##

基本觀念

開啟 Windows Game 範本的新專案,一些繁瑣的前置作業都由 XNA 做好了
包含已建立最重要的螢幕顯示物件 GraphicsDeviceManager ,及以下五個主要的事件

  • Initialize: 初始化遊戲中任何與 Graphics 無關的資源,如設定、遊戲進度等資料
  • LoadGraphicsContent: 載入 Graphics 相關的資源,如模組、圖示等
  • UnloadGraphicsContent: 釋放載入的 Graphics 資源
  • Update: 處理、計算每個 Frame 要顯示的狀態,或做些程式判斷等動作
  • Draw: 顯示至螢幕

遊戲最重要的觀念就是處理使用者輸入的狀況,並將結果顯示於螢幕達成與使用者互動
在這裡就是由 UpdateDraw 兩個 Event 來負責處理輸入、運算及顯示輸出

第一個遊戲

這裡以 Microsoft 官網 MSDN 上範本來測試
在螢幕上貼上一個圖檔
以上一步產生的新專案為例,就直接顯示 GameThumbnail.png 這個新專案內建圖檔好了
但必須注意須將 GameThumbnail.png 的 XNA Framework Content 屬性設為 True
才會將 GameThumbnail.png 加入 XNA Content Pipeline 內讓程式可以呼叫使用

// This is a texture we can render.
Texture2D myTexture;

// Set the coordinates to draw the sprite at.
Vector2 spritePosition = Vector2.Zero;

// This is the object that will draw the sprites.
SpriteBatch spriteBatch;

protected override void LoadGraphicsContent( bool loadAllContent )
{
    if (loadAllContent)
    {
        myTexture = content.Load<Texture2D>("GameThumbnail");
        spriteBatch = new SpriteBatch(graphics.GraphicsDevice);
    }
}
protected override void Draw(GameTime gameTime)
{
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

    // Draw the sprite.

    spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
    spriteBatch.Draw(myTexture, spritePosition, Color.White);
    spriteBatch.End();

    base.Draw(gameTime);
}

加入程式碼後,按 F5 執行
遊戲畫面顯示如下,左上角為載入並顯示的圖檔
image

來吧! 加入移動及碰撞

我們之前有提到過,update 函式是用來處理輸入及運算用的
這是個會不斷被呼叫的 Event ,透過每次呼叫該函式來處理計算一些事情後
讓 draw 函式可以顯示正確的畫面
以本範例來說,可以在 update 被呼叫時將圖示移動固定位置並判斷是否碰到視窗邊緣
讓下次 draw 函式被呼叫時可以將圖示顯示在正確位置上


// Store some information about the sprite's motion.
Vector2 spriteSpeed = new Vector2(50.0f, 50.0f);

protected override void Update(GameTime gameTime)
{
    // Allows the default game to exit on Xbox 360 and Windows.
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit(); 

    // Move the sprite around.
    UpdateSprite(gameTime); 

    base.Update(gameTime);
}

void UpdateSprite(GameTime gameTime)
{
    // Move the sprite by speed, scaled by elapsed time.
    spritePosition += spriteSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;

    int MaxX = graphics.GraphicsDevice.Viewport.Width - myTexture.Width;
    int MinX = 0;
    int MaxY = graphics.GraphicsDevice.Viewport.Height - myTexture.Height;
    int MinY = 0; 

    // Check for bounce.
    if (spritePosition.X > MaxX)
    {
        spriteSpeed.X *= -1;
        spritePosition.X = MaxX;
    } 
    else if (spritePosition.X < MinX)
    {
        spriteSpeed.X *= -1;
        spritePosition.X = MinX;
    }

    if (spritePosition.Y > MaxY)
    {
        spriteSpeed.Y *= -1;
        spritePosition.Y = MaxY;
    }
    else if (spritePosition.Y < MinY)
    {
        spriteSpeed.Y *= -1;
        spritePosition.Y = MinY;
    }
}

按 F5 後的執行結果如下
圖示會不斷的移動,當碰到視窗邊緣時即返回
image

當然寫個遊戲不是那麼簡單的事
本篇參考 Microsoft XNA MSDN 的範例可以改善的東西太多,如流暢度、聲音、輸入界面等
但本範例倒是很適合剛接觸 XNA 開發遊戲的人,分享出來與朋友共同成長
天秤之前也沒碰過 XNA 及 DirectX,只在 PPC 上寫過小遊戲 - 旋轉泡泡球 PPC 版
雖然使用的元件不同、平台不同,但概念卻相同
寫程式不也是如此,觀念正確就一通百通~

下載: 本範例程式碼及執行檔下載

0 意見: