Skip to main content
本逐步解說記錄了建立一個小型 sample-game 遊戲並為 XBOX Series X|S 主機建置的端對端流程。接著你會將完整的遊戲部署到 XBOX dev kit、診斷啟動失敗,並建立可安裝的 XVC。 完成的範例使用 C++、Direct3D 12,以及含 XBOX Extensions 的 GDK(GDKX)。它也使用 DirectXTK12 作為選用的轉譯輔助工具。兩個球拍都由電腦控制,因此當你反覆調整圖形、遊戲玩法與特效時,遊戲可以在無人操作的情況下持續執行。
透過 GitHub 或 WinGet 取得的公開版 GDK 僅支援 Windows PC 遊戲開發。若要編譯並部署 XBOX 主機可執行檔,請從 XBOX Secure Downloads 安裝含 XBOX Extensions 的 GDK(GDKX)。存取權限需要經核准的 XBOX 開發者帳戶。請參閱 ID@XBOX 加入流程存取 GDK 資源與下載

你將建置的內容

完成本逐步解說之後,你將擁有:
  • 一個原生 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
如果你使用其他版本進行本逐步解說,請使用開發 PC 上安裝的 GDK 版本,而非 260402

步驟 1:建立工作資料夾

開啟 PowerShell 並建立一個空的根資料夾。
本逐步解說最終使用的專案配置如下:
Visual Studio 會從 Direct3D 12 XBOX Game 範本建立 DeviceResources.*Main.cpppch.*StepTimer.h 與外殼視覺 PNG 檔案。加入範例專屬的原始碼時,請保留這些產生的檔案。

步驟 2:確認 XBOX GDK 安裝

開啟隨 GDKX 安裝的 XBOX Series X|S VS 2022 Gaming Command Prompt。此捷徑通常位於「開始」功能表的 Microsoft GDK 底下。 你也可以從一般的命令提示字元初始化環境:
確認 XBOX 建置與部署工具可以使用:
如果出現以下情況,表示 GDK 安裝尚未準備好進行主機開發:
  • GXDKEDITION 為空。
  • 缺少 XBOX 命令提示字元捷徑。
  • Visual Studio 未顯示 XBOX 專案範本。
  • 無法使用 Gaming.XBOX.Scarlett.x64 MSBuild 平台。
  • 找不到 xbconnectxbapp
如果只有 Desktop GDK 命令提示字元與 Desktop 範本可用,那麼很可能安裝的是公開版 PC GDK,而不是 GDKX。

步驟 3:建立原生 XBOX 專案

1

開啟 Visual Studio 2022 並選擇 Create a new project

Language 設為 C++Platform 設為 XBOXProject 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

建立專案

支援的工作流程是透過 Visual Studio 建立專案。手動複製 d3d12game_gx 範本檔案是一種復原技巧,不是建議的新專案工作流程。

確認專案不是 UWP

在加入遊戲程式碼之前,請確認專案:
  • 包含 MicrosoftGameConfig.mgc
  • 使用 Gaming.XBOX.*.x64 專案平台。
  • 連結到 XBOX GDK 平台程式庫。
  • 不使用 Package.appxmanifest 作為其遊戲設定。
  • 是從 Direct3D 12 XBOX Game 建立的,而非通用 Windows 範本。
如果專案是 UWP,請刪除它並從 XBOX GDK 範本建立新專案。轉換產生的 UWP 專案比使用正確的範本重新開始更容易出錯。

步驟 4:固定 GDK 版本並設定主機目標

固定 GDK 版本可防止之後安裝的 GDK 無聲無息地變更專案使用的工具鏈。 sample-game.vcxproj 的主要屬性群組中,設定:
使用 Visual Studio 的 Configuration Manager 確認以下方案組態: 如果遊戲只支援 XBOX Series X|S 主機,可以省略 XBOX One 系列主機的組態。若要讓同一款遊戲跨世代推出,請參閱跨世代

步驟 5:建置未修改的範本

在加入相依項目或遊戲程式碼之前,先建置產生的範本。這可以將工具鏈問題與範例引入的問題區隔開來。 XBOX Series X|S VS 2022 Gaming Command Prompt 執行:
若為 XBOX One 系列主機,請初始化 XBOX One 命令環境並建置 XBOX One 平台:
在原始 XBOX 範本成功建置之前,請勿繼續。

步驟 6:加入 DirectXTK12 作為選用輔助工具

建立 GDK 遊戲並不需要 DirectXTK12。XBOX GDK 範本已提供直接以 Direct3D 12 建置遊戲所需的 Direct3D 12 裝置、命令佇列、交換鏈與遊戲迴圈。 本範例使用獨立的 Microsoft 開放原始碼程式庫 DirectXTK12。該程式庫可減少 sprite 轉譯、描述元管理、貼圖載入、資源上傳與圖形記憶體管理所需的低階轉譯公用程式碼。遊戲可以用自己的引擎或直接的 D3D12 實作取代這些輔助工具。 將 DirectXTK12 複製(clone)到專案中:
在 Visual Studio 中:
  1. external\DirectXTK12\DirectXTK_GDKX_2022.vcxproj 加入方案。
  2. sample-game 加入 DirectXTK12 作為專案參考。
  3. $(SolutionDir)external\DirectXTK12\Inc 加入 include 目錄。
  4. 以相同的 XBOX 平台與組態建置這兩個專案。
sample-game 專案使用以下屬性:
接著加入 include 路徑與專案參考:
在本專案中,DirectXTK12 的著色器建置命令已修改為透過明確的專案相對路徑呼叫 CompileShaders.cmd:
這可避免在 MSBuild 呼叫著色器編譯器時依賴目前的命令目錄。

步驟 7:加入遊戲程式碼

本範例將遊戲玩法狀態與轉譯分離,因此可以在不變更 Direct3D 程式碼的情況下調整模擬。 保留範本產生的檔案,包括 DeviceResources.*Main.cpppch.*StepTimer.h 與五個外殼視覺 PNG 檔案。將以下範例專屬檔案加入專案:

使用固定的模擬時步

本專案使用範本的 StepTimer,並採用 120 Hz 固定更新。當畫格時間變動時,固定的時步可以讓碰撞回應與 AI 行為保持穩定。 模擬包含:
  • 兩個球拍的狀態。
  • 一個圓形冰球的狀態。
  • 左右兩側的分數。
  • 發球延遲與交替的發球方向。
  • 球拍、牆面與進球碰撞的撞擊事件。

實作圓形冰球碰撞

將每個球拍視為軸對齊矩形,將冰球視為圓形:
  1. 找出球拍矩形上最接近冰球中心的點。
  2. 計算該點到冰球中心的距離平方。
  3. 如果該距離不大於冰球半徑的平方,即發生碰撞。
  4. 將冰球移到球拍之外,以防止重複重疊。
  5. 根據命中偏移量與球拍速度計算出射角度。
  6. 稍微增加冰球速度,但不超過上限。
即使冰球是以方形貼圖繪製,這樣仍可讓物理維持圓形。

加入預測式自動遊玩

每個球拍會:
  • 預測冰球將在其水平位置的哪個點相交。
  • 將預測座標沿場地上下牆面反射。
  • 以固定的反應間隔更新其目標。
  • 使用加速度與最高速度限制,而不是瞬間移動。
  • 加入少量確定性的瞄準誤差。
為了讓比賽能夠得分,每一側會偶爾進入短暫的失誤時段,刻意偏離預測的攔截點。請錯開初始失誤計時器,讓兩個球拍不會同時漏接。

使用 DirectXTK12 轉譯場景

建立:
  • GraphicsMemory
  • 一個包含白色貼圖與冰球貼圖的描述元堆積。
  • 一個一般 alpha 的 SpriteBatch
  • 一個用於粒子的加色(additive)SpriteBatch
  • 透過 ResourceUploadBatchCreateDDSTextureFromFile 建立的 DDS 貼圖。
使用 SpriteBatch 繪製場地、中線、球拍、分數、冰球軌跡與冰球。在加色階段繪製粒子。 完成的範例會在 1920 x 1080 的虛擬座標系統中轉譯,並將該場景縮放到輸出檢視區。

讓特效保持節制

最終調校使用:
  • 短暫、以指數衰減的螢幕震動。
  • 較小的條紋狀撞擊粒子。
  • 球拍命中時的粒子多於牆面命中。
  • 進球時較強烈的爆發效果。
  • 低 alpha 的冰球軌跡。
  • 短暫的綠色撞擊閃光。
這些調整保留了撞擊回饋,同時避免遊戲看起來像卡通,或讓球拍碰撞在視覺上過於突兀。

步驟 8:建立並部署貼圖素材

本範例需要:
  • Assets\white.dds:1 x 1 的白色 RGBA 貼圖,用於繪製矩形與粒子。
  • Assets\xbox_logo.dds:256 x 256 的 RGBA 貼圖,用於冰球。
素材指令碼會:
  1. 載入來源標誌。
  2. 將其調整為 256 x 256。
  3. 套用羽化的圓形 alpha 遮罩。
  4. 寫出帶有 DX10 標頭的 RGBA8 DDS。
  5. 建立 1 x 1 的白色 DDS。
從 PowerShell 執行:
sample-game.vcxproj 中將兩個 DDS 檔案註冊為部署內容:
使用標準標頭加 DX10 延伸的 DDS 檔案,在像素資料之前有 148 個位元組。在最初的開發過程中,一個自訂 DDS 寫入器輸出了 152 個位元組,導致遊戲在載入貼圖時以 0x8007000D 失敗。如果你使用自訂 DDS 寫入器,請在部署之前驗證標頭配置。

步驟 9:建置遊戲

從 XBOX Series X|S VS 2022 Gaming Command Prompt 執行:
鬆散建置的輸出位於:
確認輸出包含:
  • sample-game.exe
  • MicrosoftGame.config
  • 外殼視覺 PNG 檔案
  • Assets\white.dds
  • Assets\xbox_logo.dds
  • 必要的執行階段 DLL
  • 建置產生的 Game OS 映像或其他部署中繼資料
專案原始檔名為 MicrosoftGameConfig.mgc。GDK 的 MGCCompile 建置項目會驗證它,並在建置輸出中產生 MicrosoftGame.config。部署與封裝都使用產生的 .config 檔案。請參閱遊戲設定

步驟 10:連線到 XBOX dev kit

使用其 Tools IP 位址或主機名稱設定預設主機:
檢查儲存的主機:
執行連線診斷:
如果遊戲使用 Partner Center 沙箱,請設定區分大小寫的沙箱 ID 並重新啟動主機:
顯示目前的沙箱:

步驟 11:部署完整的遊戲

部署整個建置輸出資料夾:
請勿只複製 sample-game.exe。遊戲還需要 MicrosoftGame.config、素材、執行階段相依項目、外殼影像與部署中繼資料。只複製可執行檔並不是有效的完整部署。
若在變更素材或設定之後需要乾淨地重新部署:
部署之後使用 xbapp list 找出已註冊的套件完整名稱與應用程式使用者模型 ID(AUMID)。AUMID 以 !Game 結尾。

步驟 12:啟動並驗證遊戲

啟動 xbapp list 回報的確切 AUMID:
等待遊戲處理程序:
驗證套件正在執行:
預期結果為:
此時,自動遊玩的對戰畫面應該會出現在 dev kit 上。

步驟 13:診斷立即啟動失敗

如果遊戲立即結束,請不要因為可執行檔已被複製就假設部署成功。

取得最後一次遊戲結果

監視偵錯輸出

在一個命令提示字元中啟動偵錯輸出監視器:
從另一個命令提示字元啟動遊戲:
本範例在以下位置加入了 OutputDebugStringA 訊息:
  • 遊戲初始化。
  • DirectXTK12 資源建立。
  • 每次貼圖載入。
  • Sprite 管線建立。
  • 貼圖上傳完成。
  • 畫格例外狀況。
最初的開發過程將啟動失敗定位在載入 white.dds。載入器傳回 0x8007000D,表示 DDS 資料格式錯誤。修正 DDS 標頭並執行乾淨的完整部署之後,啟動問題便解決了。 若需要更多啟動診斷,請在重現失敗時執行 xbWatson。另請參閱錯誤處理

步驟 14:安全地反覆修改

對於大多數僅涉及程式碼的變更:
  1. 建置 Debug。
  2. 終止執行中的套件。
  3. 部署完整的輸出資料夾。
  4. 啟動已註冊的 AUMID。
  5. 查詢套件狀態。
若變更涉及 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。
在原始檔控制的範例中請使用預留位置。請勿複製其他產品的身分識別。 對於 XBOX Series X|S 主機,重要的結構如下:
XBOX Series X|S 主機的套件必須設定 TargetDeviceFamily="Scarlett"。XBOX One 系列主機的套件請使用另一個獨立的設定。

建置 Release 組態

暫存套件內容

將 Release 輸出複製到暫存目錄,但要讓 gameos.xvd 排除在內容對應之外,也不要將 PDB 檔案作為一般套件內容包含在內。

產生配置

對於這個小型範例,產生的配置只包含一個啟動區塊:

建立 dev kit 測試套件

預設的測試加密適合用於本機 dev kit 安裝:
MicrosoftGame.config 中已有 StoreId 時,一般的 Store 提交不需要 /productid。除非文件記載的離線或光碟情境明確要求,否則請省略它。

為 Partner Center 套件使用提交加密

請先以 dev kit 測試加密產生 sample-game 套件,以便驗證安裝與啟動。對於將要提交的套件,請遵循目前的封裝原則並使用 /lk/l 建議的可重複 /lk 工作流程為:
請妥善保管 LEKB。不要將它提交到原始檔控制。

安裝並啟動 XVC

測試完成後終止套件:

常見問題與修正方式

另請參閱

最後修改於 2026年9月1日