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