首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

XNA Game Studio Express 開發教學(5):3D 世界座標投影繪製 2D 護盾

     編輯:關於C語言

從 3D 到 2D:座標投影詳解

Spacewar Evolved 是 3D 遊戲,但護盾是 2D Sprite。需在繪製前將飛船 3D 位置投影至 2D 螢幕座標。

投影程式碼逐步拆解

// 1. 載入圓形貼圖
Texture2D shieldTex = SpacewarGame.ContentManager.Load<Texture2D>(
    SpacewarGame.Settings.MediaPath + @"textures\circle");

// 2. 開始 SpriteBatch,啟用 Alpha 混合
batch.Begin(SpriteBlendMode.AlphaBlend);

// 3. 3D → 2D 投影
Vector3 screenPos = device.Viewport.Project(
    position,                    // 飛船世界座標
    SpacewarGame.Camera.Projection, // 投影矩陣
    SpacewarGame.Camera.View,      // 視圖矩陣
    Matrix.Identity);              // 世界矩陣 (飛船已在世界座標)

// 4. 計算繪製原點置中
Vector2 origin = new Vector2(shieldTex.Width / 2f, shieldTex.Height / 2f);
Vector2 drawPos = new Vector2(screenPos.X - origin.X, screenPos.Y - origin.Y);

// 5. 繪製參數
batch.Draw(shieldTex, drawPos, null,
    new Color(new Vector4(0f, 1f, 0f, 0.5f)), // 半透明綠
    0f, origin,
    (3f * (float)Math.Abs(Math.Cos(exitShieldTime))) + 2f, // 縮放
    SpriteEffects.None, 0f); // 層深 0 = 最上層

batch.End();

矩陣角色說明

矩陣用途
View定義攝影機位置/朝向,將世界座標轉為視圖空間
Projection定義視野角、長寬比、近遠裁剪面,將視圖空間轉為裁剪空間
Viewport.Project結合上述矩陣 + 視口尺寸,輸出螢幕像素座標

ContentManager 與 Asset Name

ContentManager.Load<T>("assetName") 中的 "circle" 對應 Content/Textures/circle.tga。Content Pipeline 建置時會將副檔名移除,以檔名作為 Asset Name。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved