加載 Spacewar Starter Kit 將需要一點時間。完全加載後,您將看到在“Solution Explorer”(解 決方案資源管理器)窗格中顯示的代碼文件。您還將看到有關如何玩游戲的說明。為了獲得最佳體驗,請 插上兩個 Xbox 360 控制器。也可以使用鍵盤;加載 Spacewar Starter Kit 時,將在說明頁上顯示控件 。
按 F5 可以編譯和運行 Spacewar 應用程序。啟動游戲後,選擇 Evolved 模式,體驗一會玩游戲的感 覺。
了解游戲循環
XNA 提供的核心功能之一是游戲循環。此循環持續不斷地更新游戲的狀態(基於用戶輸入、游戲情況 和任何其他適用情況)並進行呈現(這涉及繪制到屏幕、播放相應的音頻、調試控制器以及為用戶提供任 何其他形式的輸出)。了解 Spacewar 中游戲循環的工作原理,可以更好地幫助您理解本文中將對初學者 工具包進行的某些修改。
與任何其他 .Net 應用程序中一樣,游戲執行都從 Main 方法開始。Main 方法只構造 SpacewarGame 類的實例,並調用其基類的 Run 方法:
static void Main(string[] args)
{
using (SpacewarGame game = new SpacewarGame())
{
game.Run();
}
}
請注意,SpacewarGame 派生自 Microsoft.Xna.Framework 命名空間中的 Game 類;它公開游戲生命 周期的關鍵方法、屬性和事件。然後,覆蓋 Game 上的方法可以為游戲提供特定的功能。例如,用 SpacewarGame 覆蓋 BeginRun 方法(它是從 Run 調用的)可以播放游戲的片頭音樂,將其內部狀態機器 更改為徽標屏幕階段,並創建玩家可以查看所有內容的初始相機。
SpacewarGame 的 ChangeState 方法(由 BeginRun 方法調用)負責創建游戲中使用的許多對象。在 BeginRun 方法調用 ChangeStateas(將 GameState.LogoSplash 作為參數)時,它通過創建 TitleScreen 做出響應。TitleScreen 派生自 FullScreenSplash,後者又派生自在 Spacewar 項目中定 義的抽象 Screen 類。Screen 類表示游戲的呈現單元,如初始屏幕、選擇屏幕或實際的游戲級別。它公 開若干虛擬方法,其派生類型覆蓋這些方法以便提供屏幕特定的功能。TitleScreen 覆蓋 Screen.Update 方法,可以檢查用戶按下了 A、B 還是 X 來指示接下來要在游戲進行的操作(Evolved、Retro 或 Information)。TitleScreen 僅僅是 Spacewar 中使用的 Screen 派生類型之一;其他派生類型包括 SelectionScreen(用於選擇飛船)、EvolvedScreen(用於播放游戲的“evolved”版本)和 VictoryScreen(玩家獲勝時)等。
每個 Screen 都封裝該屏幕功能所需的狀態以及特定於該屏幕的更新和呈現行為。EvolvedScreen 和 RetroScreen(表示其各自游戲類型的主要游戲播放)都派生自 SpacewarScreen:
public class SpacewarScreen : Screen
{
protected Projectiles bullets;
protected Ship ship1;
protected Ship ship2;
protected SceneItem sun;
protected Particles particles;
protected SceneItem backdrop;
protected bool paused = true;
protected int player1Score;
protected int player2Score;
...
}
SpacewarScreen 包含要在屏幕上呈現的項,其中包括雙方飛船的 SceneItem(以派生自 SpacewarSceneItem 的 Ship 來實現,SpacewarSceneItem 派生自 SceneItem 基類),所有要呈現的各 種粒子和槍彈、游戲背景以及太陽等。它還包含游戲狀態,如玩家得分,以及游戲是否暫停。
創建游戲(我們的示例中為 SpacewarGame)時,它確保創建主機來存放游戲並為游戲提供應用程序級 服務,即事件通知(如激活、停用、退出和空閒)。後者最重要。Game.Tick 方法由此空閒處理程序調用 ,而 Tick 方法又會調用 Game.Update 和 Game.DrawFrame 方法。只要設置了當前場景(通過 ChangeState 方法),SpacewarGame.Update 就會調用 Update,並覆蓋 Game.Update 方法。 Game.DrawFrame 調用 Game.Draw(不管當前場景是什麼,SpacewarGame 都會覆蓋 Game.Draw 從而調用 Render)。