sample-game 遊戲並為 XBOX Series X|S 主機建置的端對端流程。接著你會將完整的遊戲部署到 XBOX dev kit、診斷啟動失敗,並建立可安裝的 XVC。
完成的範例使用 C++、Direct3D 12,以及含 XBOX Extensions 的 GDK(GDKX)。它也使用 DirectXTK12 作為選用的轉譯輔助工具。兩個球拍都由電腦控制,因此當你反覆調整圖形、遊戲玩法與特效時,遊戲可以在無人操作的情況下持續執行。
你將建置的內容
完成本逐步解說之後,你將擁有:- 一個原生 XBOX GDK 專案(非 UWP 專案)。
- 適用於 XBOX Series X|S 主機與 XBOX One 系列主機的 Debug、Profile 與 Release 組態。
- 一個自動遊玩的範例遊戲,具備計分、預測式球拍 AI、粒子特效、移動軌跡,以及帶貼圖的圓形冰球。
- 在 XBOX dev kit 上執行的完整鬆散檔案(loose-file)部署。
- 一個選用的、已與 Store 關聯的 XVC,可在 dev kit 上安裝與測試。
開始之前
本逐步解說使用以下環境驗證:- Visual Studio 2022 Enterprise 17.14。
- April 2026 Update 2 GDKX,版本
260402。 - 適用於 XBOX Series X|S 主機的
Gaming.XBOX.Scarlett.x64。 - 適用於 XBOX One 系列主機的
Gaming.XBOX.XboxOne.x64。 - DirectXTK12 認可(commit)
e656d54637b2830fc6eb5ecd9b329a9c72cb87d4。
260402。
步驟 1:建立工作資料夾
開啟 PowerShell 並建立一個空的根資料夾。DeviceResources.*、Main.cpp、pch.*、StepTimer.h 與外殼視覺 PNG 檔案。加入範例專屬的原始碼時,請保留這些產生的檔案。
步驟 2:確認 XBOX GDK 安裝
開啟隨 GDKX 安裝的 XBOX Series X|S VS 2022 Gaming Command Prompt。此捷徑通常位於「開始」功能表的 Microsoft GDK 底下。 你也可以從一般的命令提示字元初始化環境:GXDKEDITION為空。- 缺少 XBOX 命令提示字元捷徑。
- Visual Studio 未顯示 XBOX 專案範本。
- 無法使用
Gaming.XBOX.Scarlett.x64MSBuild 平台。 - 找不到
xbconnect或xbapp。
步驟 3:建立原生 XBOX 專案
1
開啟 Visual Studio 2022 並選擇 Create a new project
將 Language 設為 C++、Platform 設為 XBOX、Project type 設為 Games。
2
選擇 Direct3D 12 XBOX Game
將專案名稱設為
sample-game,位置設為 D:\repos\sample-game。3
保持 Place solution and project in the same directory 為未勾選
這樣方案會位於根目錄,而專案位於
D:\repos\sample-game\sample-game。4
建立專案
d3d12game_gx 範本檔案是一種復原技巧,不是建議的新專案工作流程。
確認專案不是 UWP
在加入遊戲程式碼之前,請確認專案:- 包含
MicrosoftGameConfig.mgc。 - 使用
Gaming.XBOX.*.x64專案平台。 - 連結到 XBOX GDK 平台程式庫。
- 不使用
Package.appxmanifest作為其遊戲設定。 - 是從 Direct3D 12 XBOX Game 建立的,而非通用 Windows 範本。
步驟 4:固定 GDK 版本並設定主機目標
固定 GDK 版本可防止之後安裝的 GDK 無聲無息地變更專案使用的工具鏈。 在sample-game.vcxproj 的主要屬性群組中,設定:
如果遊戲只支援 XBOX Series X|S 主機,可以省略 XBOX One 系列主機的組態。若要讓同一款遊戲跨世代推出,請參閱跨世代。
步驟 5:建置未修改的範本
在加入相依項目或遊戲程式碼之前,先建置產生的範本。這可以將工具鏈問題與範例引入的問題區隔開來。 從 XBOX Series X|S VS 2022 Gaming Command Prompt 執行:步驟 6:加入 DirectXTK12 作為選用輔助工具
建立 GDK 遊戲並不需要 DirectXTK12。XBOX GDK 範本已提供直接以 Direct3D 12 建置遊戲所需的 Direct3D 12 裝置、命令佇列、交換鏈與遊戲迴圈。 本範例使用獨立的 Microsoft 開放原始碼程式庫 DirectXTK12。該程式庫可減少 sprite 轉譯、描述元管理、貼圖載入、資源上傳與圖形記憶體管理所需的低階轉譯公用程式碼。遊戲可以用自己的引擎或直接的 D3D12 實作取代這些輔助工具。 將 DirectXTK12 複製(clone)到專案中:- 將
external\DirectXTK12\DirectXTK_GDKX_2022.vcxproj加入方案。 - 從
sample-game加入 DirectXTK12 作為專案參考。 - 將
$(SolutionDir)external\DirectXTK12\Inc加入 include 目錄。 - 以相同的 XBOX 平台與組態建置這兩個專案。
sample-game 專案使用以下屬性:
CompileShaders.cmd:
步驟 7:加入遊戲程式碼
本範例將遊戲玩法狀態與轉譯分離,因此可以在不變更 Direct3D 程式碼的情況下調整模擬。 保留範本產生的檔案,包括DeviceResources.*、Main.cpp、pch.*、StepTimer.h 與五個外殼視覺 PNG 檔案。將以下範例專屬檔案加入專案:
使用固定的模擬時步
本專案使用範本的StepTimer,並採用 120 Hz 固定更新。當畫格時間變動時,固定的時步可以讓碰撞回應與 AI 行為保持穩定。
模擬包含:
- 兩個球拍的狀態。
- 一個圓形冰球的狀態。
- 左右兩側的分數。
- 發球延遲與交替的發球方向。
- 球拍、牆面與進球碰撞的撞擊事件。
實作圓形冰球碰撞
將每個球拍視為軸對齊矩形,將冰球視為圓形:- 找出球拍矩形上最接近冰球中心的點。
- 計算該點到冰球中心的距離平方。
- 如果該距離不大於冰球半徑的平方,即發生碰撞。
- 將冰球移到球拍之外,以防止重複重疊。
- 根據命中偏移量與球拍速度計算出射角度。
- 稍微增加冰球速度,但不超過上限。
加入預測式自動遊玩
每個球拍會:- 預測冰球將在其水平位置的哪個點相交。
- 將預測座標沿場地上下牆面反射。
- 以固定的反應間隔更新其目標。
- 使用加速度與最高速度限制,而不是瞬間移動。
- 加入少量確定性的瞄準誤差。
使用 DirectXTK12 轉譯場景
建立:GraphicsMemory。- 一個包含白色貼圖與冰球貼圖的描述元堆積。
- 一個一般 alpha 的
SpriteBatch。 - 一個用於粒子的加色(additive)
SpriteBatch。 - 透過
ResourceUploadBatch與CreateDDSTextureFromFile建立的 DDS 貼圖。
SpriteBatch 繪製場地、中線、球拍、分數、冰球軌跡與冰球。在加色階段繪製粒子。
完成的範例會在 1920 x 1080 的虛擬座標系統中轉譯,並將該場景縮放到輸出檢視區。
讓特效保持節制
最終調校使用:- 短暫、以指數衰減的螢幕震動。
- 較小的條紋狀撞擊粒子。
- 球拍命中時的粒子多於牆面命中。
- 進球時較強烈的爆發效果。
- 低 alpha 的冰球軌跡。
- 短暫的綠色撞擊閃光。
步驟 8:建立並部署貼圖素材
本範例需要:Assets\white.dds:1 x 1 的白色 RGBA 貼圖,用於繪製矩形與粒子。Assets\xbox_logo.dds:256 x 256 的 RGBA 貼圖,用於冰球。
- 載入來源標誌。
- 將其調整為 256 x 256。
- 套用羽化的圓形 alpha 遮罩。
- 寫出帶有 DX10 標頭的 RGBA8 DDS。
- 建立 1 x 1 的白色 DDS。
sample-game.vcxproj 中將兩個 DDS 檔案註冊為部署內容:
使用標準標頭加 DX10 延伸的 DDS 檔案,在像素資料之前有 148 個位元組。在最初的開發過程中,一個自訂 DDS 寫入器輸出了 152 個位元組,導致遊戲在載入貼圖時以
0x8007000D 失敗。如果你使用自訂 DDS 寫入器,請在部署之前驗證標頭配置。步驟 9:建置遊戲
從 XBOX Series X|S VS 2022 Gaming Command Prompt 執行:sample-game.exeMicrosoftGame.config- 外殼視覺 PNG 檔案
Assets\white.ddsAssets\xbox_logo.dds- 必要的執行階段 DLL
- 建置產生的 Game OS 映像或其他部署中繼資料
MicrosoftGameConfig.mgc。GDK 的 MGCCompile 建置項目會驗證它,並在建置輸出中產生 MicrosoftGame.config。部署與封裝都使用產生的 .config 檔案。請參閱遊戲設定。
步驟 10:連線到 XBOX dev kit
使用其 Tools IP 位址或主機名稱設定預設主機:步驟 11:部署完整的遊戲
部署整個建置輸出資料夾:xbapp list 找出已註冊的套件完整名稱與應用程式使用者模型 ID(AUMID)。AUMID 以 !Game 結尾。
步驟 12:啟動並驗證遊戲
啟動xbapp list 回報的確切 AUMID:
步驟 13:診斷立即啟動失敗
如果遊戲立即結束,請不要因為可執行檔已被複製就假設部署成功。取得最後一次遊戲結果
監視偵錯輸出
在一個命令提示字元中啟動偵錯輸出監視器:OutputDebugStringA 訊息:
- 遊戲初始化。
- DirectXTK12 資源建立。
- 每次貼圖載入。
- Sprite 管線建立。
- 貼圖上傳完成。
- 畫格例外狀況。
white.dds。載入器傳回 0x8007000D,表示 DDS 資料格式錯誤。修正 DDS 標頭並執行乾淨的完整部署之後,啟動問題便解決了。
若需要更多啟動診斷,請在重現失敗時執行 xbWatson。另請參閱錯誤處理。
步驟 14:安全地反覆修改
對於大多數僅涉及程式碼的變更:- 建置 Debug。
- 終止執行中的套件。
- 部署完整的輸出資料夾。
- 啟動已註冊的 AUMID。
- 查詢套件狀態。
MicrosoftGameConfig.mgc、素材或部署中繼資料,請先解除安裝舊的鬆散部署再重新部署。這可以防止過時的檔案或註冊資料掩蓋修正結果。
選用:建立並測試 XVC
鬆散部署是最快的開發迴圈。當你需要測試類零售安裝,或為 Partner Center 準備套件時,再建立 XVC。完整的封裝參考請參閱封裝。將 MicrosoftGame.config 與 Partner Center 建立關聯
從該產品的 Game setup > Identity details 取得以下值:- Package Identity Name。
- Package Identity Publisher。
- Publisher Display Name。
- Store ID。
- XBOX Title ID。
- MSA App ID。
TargetDeviceFamily="Scarlett"。XBOX One 系列主機的套件請使用另一個獨立的設定。
建置 Release 組態
暫存套件內容
將 Release 輸出複製到暫存目錄,但要讓gameos.xvd 排除在內容對應之外,也不要將 PDB 檔案作為一般套件內容包含在內。
產生配置
建立 dev kit 測試套件
預設的測試加密適合用於本機 dev kit 安裝:為 Partner Center 套件使用提交加密
請先以 dev kit 測試加密產生 sample-game 套件,以便驗證安裝與啟動。對於將要提交的套件,請遵循目前的封裝原則並使用/lk 或 /l。
建議的可重複 /lk 工作流程為:
