共用方式為


設定遊戲專案

備註

本主題是 使用 DirectX 教學課程系列建立簡單的通用 Windows 平臺 (UWP) 遊戲的一部分。 該連結中的主題設定了整個系列的背景。

開發遊戲的第一個步驟是在 Visual Studio Microsoft中建立專案。 在特別為遊戲開發設定項目之後,您稍後就可以將其重新使用為一種範本。

目標

  • 使用項目範本在Visual Studio中建立新專案。
  • 藉由檢查 App 類別的來源檔案,瞭解遊戲的進入點和初始化。
  • 查看遊戲迴圈。
  • 檢閱專案的 package.appxmanifest 檔案。

在 Visual Studio 中建立新專案

備註

如需設定 Visual Studio 以進行 C++/WinRT 開發的資訊,包括安裝和使用 C++/WinRT Visual Studio 延伸模組 (VSIX) 和 NuGet 套件 (一起提供專案範本和組建支援),請參閱 Visual Studio 對 C++/WinRT 的支援

第一次安裝(或更新至)最新版本的 C++/WinRT Visual Studio 延伸模組 (VSIX):請參閱上述附注。 然後,在Visual Studio中,根據 核心應用程式 (C++/WinRT) 項目範本建立新的專案。 以 Windows SDK 的最新正式推出版本 (也就是非預覽) 版本為目標。

檢閱 App 類別,以了解 IFrameworkViewSourceIFrameworkView

在您的 Core App 專案中,開啟原始程式碼檔案 App.cpp。 在這裡,實現了 App 類別,這代表應用程式及其生命週期。 當然,在此案例中,我們知道應用程式是遊戲。 但是,我們將它稱為 應用程式,以便更普遍地討論通用 Windows 平臺 (UWP) 應用程式初始化的方式。

wWinMain 函式

wWinMain 函式是應用程式的進入點。 以下是 wWinMain 的樣子(從 App.cpp)。

int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
    CoreApplication::Run(winrt::make<App>());
}

我們建立了一個 App 類別的實例(這是唯一創建的 App 的實例),然後將它傳遞給靜態方法 CoreApplication.Run。 請注意,CoreApplication.Run 預期 IFrameworkViewSource 介面。 因此,App 類別必須實作該介面。

本主題中的下兩節將說明 IFrameworkViewSourceIFrameworkView 介面。 這些介面(以及 CoreApplication.Run)是應用程式為 Windows 提供 檢視提供者的方式。 Windows 會使用該檢視提供者將應用程式與 Windows 殼層連線,讓您可以處理應用程式生命週期事件。

IFrameworkViewSource 介面

App 類別確實實作 IFrameworkViewSource,如下列清單所示。

struct App : winrt::implements<App, IFrameworkViewSource, IFrameworkView>
{
    ...
    IFrameworkView CreateView()
    {
        return *this;
    }
    ...
}

實作 IFrameworkViewSource 的物件為 檢視提供者工廠 物件。 該物件的任務是製造並傳回 檢視提供者 物件。

IFrameworkViewSource 具有單一方法 IFrameworkViewSource::CreateView。 Windows 會在傳遞至 CoreApplication.Run 的物件上呼叫該函式,。 如上所示,該方法的 App::CreateView 實作會傳回 *this。 換句話說,App 物件會傳回本身。 由於 IFrameworkViewSource::CreateView 具有 IFrameworkView的傳回值類型,因此 App 類別也需要實作 介面 。 您可以在上述清單中看到它確實如此。

IFrameworkView 介面

實作 IFrameworkView 的物件是 檢視提供者 物件。 我們已經向 Windows 提供了該檢視提供者。 這是我們在 wWinMain中建立的同一個 App 物件。 因此,App 類別可同時作為 檢視提供者工廠檢視提供者

現在 Windows 可以呼叫 App 類別 IFrameworkView方法的實作。 在這些方法的實作中,您的應用程式有機會執行初始化等工作、開始載入所需資源、連接相應的事件處理程式,以及接收應用程式將用來顯示輸出的 CoreWindow

您的 IFrameworkView 方法的實作會依如下所示的順序被呼叫。

以下是 應用程式 類別的基本架構(於 App.cpp中),顯示這些方法的簽章。

struct App : winrt::implements<App, IFrameworkViewSource, IFrameworkView>
{
    ...
    void Initialize(Windows::ApplicationModel::Core::CoreApplicationView const& applicationView) { ... }
    void SetWindow(Windows::UI::Core::CoreWindow const& window) { ... }
    void Load(winrt::hstring const& entryPoint) { ... }
    void OnActivated(
        Windows::ApplicationModel::Core::CoreApplicationView const& applicationView,
        Windows::ApplicationModel::Activation::IActivatedEventArgs const& args) { ... }
    void Run() { ... }
    void Uninitialize() { ... }
    ...
}

這隻是 IFrameworkView的簡介。 在定義遊戲的 UWP app 架構 中,我們會更詳細地了解這些方法,以及如何實作這些方法。

整理專案

您從專案範本建立的核心應用程式專案包含我們此時應該整理的功能。 之後,我們可以使用專案重新建立射擊庫遊戲(Simple3DGameDX)。 對 中的 App.cpp 類別進行下列變更。

  • 刪除其數據成員。
  • 刪除 OnPointerPressedOnPointerMovedAddVisual
  • SetWindow中刪除程式代碼。

專案將會建置並執行,但只會在客戶端區域中顯示純色。

遊戲迴圈

若要了解遊戲迴圈的外觀,請查看您所下載 Simple3DGameDX 範例遊戲的原始程式碼。

App 類別具有一個名為 m_main的資料成員,其類型為 GameMain。 該成員在 App::Run 中使用,如下所示。

void Run()
{
    m_main->Run();
}

您可以在 中找到 GameMain.cpp。 這是遊戲的主迴圈,這裡有一個非常粗略的概要,展現最重要的功能。

void GameMain::Run()
{
    while (!m_windowClosed)
    {
        if (m_visible)
        {
            CoreWindow::GetForCurrentThread().Dispatcher().ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
            Update();
            m_renderer->Render();
            m_deviceResources->Present();
        }
        else
        {
            CoreWindow::GetForCurrentThread().Dispatcher().ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending);
        }
    }
}

以下是此主要遊戲迴圈的簡要說明。

如果遊戲的視窗未關閉,請處理所有事件、更新定時器,然後轉譯並呈現圖形處理程序的結果。 還有更多對這些考慮的說明,我們將在主題 定義遊戲的UWP應用程式框架渲染架構 I:渲染簡介、以及 渲染架構 II:遊戲渲染中討論。 但這是UWP DirectX 遊戲的基本程式代碼結構。

檢閱並更新 package.appxmanifest 檔案

Package.appxmanifest 檔案包含 UWP 專案的相關元數據。 這些元數據用於封裝和啟動您的遊戲,以及提交至Microsoft市集。 檔案還包含重要信息,這些信息是玩家系統用於提供遊戲運行所需系統資源存取權的。

在 [方案總管]中按兩下 Package.appxmanifest 檔案,以啟動 指令清單設計工具

package.appx 指令清單編輯器的螢幕快照。

如需 package.appxmanifest 檔案和封裝的詳細資訊,請參閱 宣告檔設計工具。 現在,請先查看 [功能] 索引標籤,並瀏覽所提供的選項。

具有 direct3d 應用程式預設功能的螢幕快照。

如果您未選取遊戲使用的功能,例如存取全域高分板 因特網,則您將無法存取對應的資源或功能。 當您建立新遊戲時,請務必選擇遊戲呼叫的 API 所需的功能。

現在讓我們看看 Simple3DGameDX 範例遊戲隨附的其餘檔案。

查看其他重要的程式庫和原始碼檔案

如果您確實想要為自己建立一種遊戲項目範本,以便重新使用該範本作為未來專案的起點,則您會想要複製 GameMain.h,並將 GameMain.cpp 從您下載的 Simple3DGameDX 項目複製,並將這些專案新增至新的 Core App 專案。 研究這些檔案,瞭解它們的功能,並移除任何特定於 Simple3DGameDX的項目。 此外,請註釋掉任何依賴於您尚未複製的程式碼。 透過範例,GameMain.h 取決於 GameRenderer.h。 當您從 Simple3DGameDX複製更多檔案時,您將能夠取消註解。

以下是 Simple3DGameDX 中一些檔案的簡要概述,這些檔案適合包含在您正在製作的範本中。 無論如何,理解 Simple3DGameDX 本身的運作方式同樣重要。

來源檔案 檔案資料夾 說明
DeviceResources.h/.cpp 公用事業 定義 DeviceResources 類別,控制所有 DirectX 裝置資源。 此外,也會定義 IDeviceNotify 介面,用來通知應用程式圖形適配卡裝置已遺失或重新建立。
DirectXSample.h 公用事業 實作輔助函式,例如 ConvertDipsToPixelsConvertDipsToPixels 會將裝置獨立圖元的長度轉換成實體圖元的長度。
GameTimer.h/.cpp 公用事業 定義適用於遊戲或互動式轉譯應用程式的高解析度定時器。
GameRenderer.h/.cpp 渲染 定義 GameRenderer 類別,這個類別會實作基本的轉譯管線。
GameHud.h/.cpp 渲染 定義一個類別,來使用 Direct2D 和 DirectWrite 繪製遊戲的抬頭顯示器(HUD)。
VertexShader.hlsl 和 VertexShaderFlat.hlsl 著色器 此程式碼包含用於基本頂點著色器的高階著色器語言(HLSL)。
PixelShader.hlsl 和 PixelShaderFlat.hlsl 著色器 包含基本圖元著色器的高階著色器語言 (HLSL) 程式代碼。
ConstantBuffers.hlsli 著色器 包含常數緩衝區和著色器結構的數據結構定義,用來將model-view-projection (MVP) 矩陣和每個頂點數據傳遞至頂點著色器。
pch.h/.cpp N/A 包含常見的 C++/WinRT、Windows 和 DirectX 入檔。

後續步驟

此時,我們已示範如何為 DirectX 遊戲建立新的 UWP 專案、查看其中的某些部分,並開始思考如何將該專案轉換成遊戲的可重複使用範本。 我們也查看了 Simple3DGameDX 範例遊戲的一些重要部分。

下一節是 定義遊戲的 UWP 應用程式架構。 在那裡,我們將更仔細地瞭解 Simple3DGameDX 的運作方式。