XNA 以 Game 類別封裝迴圈:
static void Main()
{
using (var game = new SpacewarGame()) game.Run();
}
Run() 內部持續呼叫 Tick → Update → Draw,直到視窗關閉。
GameState 列舉:LogoSplash、TitleScreen、SelectionScreen、EvolvedScreen、VictoryScreen 等。ChangeState 切換狀態,建立對應的 Screen 衍生類別實例。Screen 封裝該狀態專屬的 Update、Draw、資源與輸入處理。Game (XNA)
└─ SpacewarGame : Game
├─ BeginRun() → 播放片頭音樂、建立初始相機、ChangeState(LogoSplash)
├─ ChangeState(GameState) → 實例化對應 Screen
├─ Update() → currentScreen.Update()
└─ Draw() → currentScreen.Render()
Screen (抽象基類)
├─ TitleScreen : FullScreenSplash : Screen
├─ SelectionScreen : Screen
├─ SpacewarScreen : Screen
│ ├─ EvolvedScreen : SpacewarScreen
│ └─ RetroScreen : SpacewarScreen
└─ VictoryScreen : Screen
public class SpacewarScreen : Screen
{
protected Projectiles bullets;
protected Ship ship1, ship2;
protected SceneItem sun;
protected Particles particles;
protected SceneItem backdrop;
protected bool paused = true;
protected int player1Score, player2Score;
// ...
}
包含所有遊戲實體(飛船、子彈、粒子、太陽、背景)與分數狀態。
Game.Tick (由 Idle 事件觸發) → Game.Update → SpacewarGame.Update → currentScreen.UpdateGame.DrawFrame → Game.Draw → SpacewarGame.Draw → currentScreen.Render