系統需求
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: 顯示至螢幕
遊戲最重要的觀念就是處理使用者輸入的狀況,並將結果顯示於螢幕達成與使用者互動
在這裡就是由 Update 及 Draw 兩個 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 執行
遊戲畫面顯示如下,左上角為載入並顯示的圖檔
來吧! 加入移動及碰撞
我們之前有提到過,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 後的執行結果如下
圖示會不斷的移動,當碰到視窗邊緣時即返回
當然寫個遊戲不是那麼簡單的事
本篇參考 Microsoft XNA MSDN 的範例可以改善的東西太多,如流暢度、聲音、輸入界面等
但本範例倒是很適合剛接觸 XNA 開發遊戲的人,分享出來與朋友共同成長
天秤之前也沒碰過 XNA 及 DirectX,只在 PPC 上寫過小遊戲 - 旋轉泡泡球 PPC 版
雖然使用的元件不同、平台不同,但概念卻相同
寫程式不也是如此,觀念正確就一通百通~
下載: 本範例程式碼及執行檔下載
0 意見:
張貼留言