Sdílet prostřednictvím


Nastavení herního projektu

Poznámka:

Toto téma je součástí Vytvoření jednoduché hry pro Univerzální platformu Windows (UPW) pomocí série kurzů DirectX. Téma na tomto odkazu nastaví kontext pro řadu.

Prvním krokem při vývoji hry je vytvoření projektu v sadě Microsoft Visual Studio. Jakmile nakonfigurujete projekt speciálně pro vývoj her, můžete ho později znovu použít jako druh šablony.

Cíle

  • Vytvořte nový projekt v sadě Visual Studio pomocí šablony projektu.
  • Porozumějte vstupnímu bodu a inicializaci hry tím, že prozkoumáte zdrojový soubor pro třídu App.
  • Podívejte se na herní cyklus.
  • Zkontrolujte soubor package.appxmanifest projektu.

Vytvoření nového projektu v sadě Visual Studio

Poznámka:

Informace o nastavení sady Visual Studio pro vývoj pro C++/WinRT – včetně instalace a použití rozšíření sady C++/WinRT Visual Studio (VSIX) a balíčku NuGet (který společně poskytuje podporu pro šablonu projektu a sestavení) – viz podpora sady Visual Studio pro C++/WinRT.

Nejprve nainstalujte (nebo aktualizujte na) nejnovější verzi rozšíření sady Visual Studio C++/WinRT (VSIX); viz výše uvedená poznámka. Potom v sadě Visual Studio vytvořte nový projekt podle šablony projektu Core App (C++/WinRT). Zaměřte se na nejnovější obecně dostupnou verzi Windows SDK, tedy takovou, která není ve verzi Preview.

Projděte si třídu App, abyste porozuměli IFrameworkViewSource a IFrameworkView

V projektu základní aplikace otevřete soubor zdrojového kódu App.cpp. V ní je implementace třídy App, která představuje aplikaci a její životní cyklus. V tomto případě samozřejmě víme, že aplikace je hra. Budeme ho ale označovat jako aplikace, abychom mohli obecněji mluvit o tom, jak se aplikace pro Univerzální platformu Windows (UPW) inicializuje.

Funkce wWinMain

Funkce wWinMain je vstupním bodem aplikace. Takto vypadá wWinMain (z App.cpp).

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

Vytvoříme instanci třídy App (to je jediná instance třídy App, která je vytvořená), a předáme ji statické metodě CoreApplication.Run. Všimněte si, že CoreApplication.Run očekává rozhraní IFrameworkViewSource. Proto App třída potřebuje implementovat toto rozhraní.

Další dvě části v tomto tématu popisují IFrameworkViewSource a IFrameworkView rozhraní. Tato rozhraní (stejně jako CoreApplication.Run) představují způsob, jak vaše aplikace může poskytnout Windows poskytovatele pohledu. Windows používá tohoto zprostředkovatele zobrazení k připojení aplikace k prostředí Windows, abyste mohli zpracovávat události životního cyklu aplikace.

Rozhraní IFrameworkViewSource

Třída App skutečně implementuje IFrameworkViewSource, jak je vidět v následujícím výpisu.

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

Objekt, který implementuje IFrameworkViewSource je objekt objektu zprostředkovatele zobrazení. Úkolem tohoto objektu je vyrobit a vrátit objekt zprostředkovatele zobrazení .

IFrameworkViewSource má jedinou metodu IFrameworkViewSource::CreateView. Systém Windows volá tuto funkci na objektu, který předáte CoreApplication.Run. Jak vidíte výše, App::CreateView implementace této metody vrátí *this. Jinými slovy, objekt App vrátí sám sebe. Vzhledem k tomu, že IFrameworkViewSource::CreateView má návratový typ hodnoty IFrameworkView, z toho vyplývá, že také třída App musí implementovat to rozhraní. A vidíte, že se to děje ve výpisu výše.

Rozhraní IFrameworkView

Objekt, který implementuje IFrameworkView je objekt zprostředkovatele zobrazení. A teď jsme poskytli Windows tohoto zprostředkovatele zobrazení. Je to stejný objekt App, který jsme vytvořili v wWinMain. Třída App slouží jako zprostředkovatele zobrazení a .

Nyní může Windows volat implementace metod IFrameworkViewtřídy App. V implementacích těchto metod má vaše aplikace možnost provádět úlohy, jako je inicializace, začít načítat prostředky, které bude potřebovat, připojit příslušné obslužné rutiny událostí a přijmout CoreWindow, které vaše aplikace použije k zobrazení výstupu.

Vaše implementace metod IFrameworkView se volají v pořadí uvedeném níže.

A tady je kostra třídy App (v App.cpp), která ukazuje podpisy těchto metod.

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() { ... }
    ...
}

Toto byl jen úvod do IFrameworkView. O těchto metodách a jejich implementaci se podrobněji zabýváme v Definice rámce aplikace UWP pro hru.

Uspořádat projekt

Projekt základní aplikace, který jste vytvořili ze šablony projektu, obsahuje funkcionalitu, kterou bychom měli v tuto chvíli upravit. Potom můžeme projekt použít k opětovnému vytvoření hry střelecké galerie (Simple3DGameDX). Proveďte následující změny třídy App v App.cpp.

  • Odstraňte datové členy daného objektu.
  • OdstraněníOnPointerPressed, OnPointerMoved a addvisual
  • Odstraňte kód z SetWindow.

Projekt se sestaví a spustí, ale v klientské oblasti se zobrazí jenom plná barva.

Herní smyčka

Abyste získali představu o tom, jak vypadá herní smyčka, podívejte se do zdrojového kódu pro ukázkovou hru Simple3DGameDX, kterou jste stáhli.

Třída aplikace má datový člen s názvem m_main, typu GameMain. A tento člen se používá v App::Run takto.

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

GameMain::Run najdete v GameMain.cpp. Je to hlavní smyčka hry a tady je velmi hrubý přehled, který ukazuje nejdůležitější funkce.

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);
        }
    }
}

Zde je stručný popis toho, co tato hlavní herní smyčka dělá.

Pokud okno hry není zavřené, odešlete všechny události, aktualizujte časovač a pak vykreslujte a prezentujte výsledky grafického kanálu. O těchto obavách se dozvíte mnohem více a probereme to v tématech Definování UWP architektury aplikace hry, Vykreslovací framework I: Úvod do vykreslovánía Vykreslovací framework II: Vykreslování hry. Toto je ale základní struktura kódu hry DirectX pro UPW.

Kontrola a aktualizace souboru package.appxmanifest

Soubor Package.appxmanifest obsahuje metadata o projektu UPW. Tato metadata se používají k balení a spuštění hry a k odeslání do Microsoft Storu. Soubor obsahuje také důležité informace, které systém hráče používá k poskytování přístupu k systémovým prostředkům, které hra potřebuje ke spuštění.

Spusťte návrháře manifestu poklikáním na soubor Package.appxmanifest v průzkumníku řešení .

snímek obrazovky editoru manifestu package.appx

Další informace o souboru package.appxmanifest a balíčku najdete v tématu Návrhář manifestu. Prozatím se podívejte na kartu Schopnosti a zvažte dostupné možnosti.

snímek obrazovky s výchozími možnostmi aplikace direct3d.

Pokud nevyberete možnosti, které vaše hra používá, například přístup k internetu pro globální panel s vysokým skóre, nebudete mít přístup k odpovídajícím prostředkům ani funkcím. Při vytváření nové hry se ujistěte, že jste vybrali všechny možnosti potřebné rozhraními API, která vaše hra volá.

Teď se podíváme na zbývající soubory, které jsou součástí ukázkové hry Simple3DGameDX.

Kontrola dalších důležitých knihoven a souborů zdrojového kódu

Pokud máte v úmyslu vytvořit šablonu herního projektu pro sebe, abyste ji mohli znovu použít jako výchozí bod pro budoucí projekty, budete chtít zkopírovat GameMain.h a GameMain.cpp z Simple3DGameDX projektu, který jste stáhli, a přidat je do nového projektu základní aplikace. Projděte si tyto soubory, zjistěte, co dělají, a odeberte cokoli, co je specifické pro Simple3DGameDX. Zakomentujte také cokoli, co závisí na kódu, který jste ještě nezkopírovali. Stejně jako příklad GameMain.h závisí na GameRenderer.h. Při kopírování dalších souborů z Simple3DGameDXbudete moct zrušit komentář.

Zde je stručný přehled některých souborů v Simple3DGameDX, které budou užitečné pro zahrnutí do vaší šablony, pokud ji vytváříte. V každém případě jsou stejně důležité pro pochopení, jak Simple3DGameDX sám pracuje.

Zdrojový soubor Složka souborů Popis
DeviceResources.h/.cpp Veřejné služby Definuje třídu DeviceResources, která řídí všechny prostředky zařízení DirectX . Definuje také rozhraní IDeviceNotify, které slouží k upozornění aplikace, že zařízení grafického adaptéru bylo ztraceno nebo znovu vytvořeno.
DirectXSample.h Veřejné služby Implementuje pomocné funkce, jako je ConvertDipsToPixels. ConvertDipsToPixels převede délku pixelů nezávislých na zařízení na délku ve fyzických pixelech.
GameTimer.h/.cpp Veřejné služby Definuje časovač s vysokým rozlišením, který je užitečný pro herní nebo interaktivní vykreslovací aplikace.
GameRenderer.h/.cpp Renderování Definuje třídu GameRenderer, která implementuje základní kanál vykreslování.
GameHud.h/.cpp Renderování Definuje třídu pro vykreslení přehledového displeje (HUD) pro hru s využitím Direct2D a DirectWrite.
VertexShader.hlsl a VertexShaderFlat.hlsl Stínovače Obsahuje kód jazyka HLSL (High-Level Shader Language) pro základní vrcholové shadery.
PixelShader.hlsl a PixelShaderFlat.hlsl Stínovače Obsahuje kód jazyka HLSL (High-Level Shader Language) pro základní pixelové shadery.
ConstantBuffers.hlsli Stínovače Obsahuje definice datových struktur pro konstantní vyrovnávací paměti a struktury shaderu používané k předávání matic model-view-projection (MVP) a per-vertex dat do vrcholového shaderu.
pch.h/.cpp není k dispozici Obsahuje běžné funkce C++/WinRT, Windows a DirectX.

Další kroky

V tomto okamžiku jsme ukázali, jak vytvořit nový projekt UPW pro hru DirectX, podívali se na některé části v ní a začali přemýšlet o tom, jak tento projekt převést na druh opakovaně použitelné šablony pro hry. Podívali jsme se také na některé důležité části ukázkové hry Simple3DGameDX.

Další část je Definovat architekturu aplikace pro UWP hry. Podrobněji se podíváme na to, jak funguje Simple3DGameDX.