Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
Pokud si chcete stáhnout verzi této hry, která používá XAML pro překryvné zobrazení, podívejte se na ukázku hry DirectX a XAML . Nezapomeňte si přečíst soubor readme, kde najdete podrobnosti o sestavení ukázky.
V tuto chvíli jsme probrali klíčové komponenty základní hry pro Univerzální platformu Windows (UWP) DirectX 3D. Můžete nastavit architekturu pro hru, včetně kanálu zobrazení a vykreslování, a implementovat základní herní smyčku. Můžete také vytvořit základní překryvné uživatelské rozhraní, začlenit zvuky a implementovat ovládací prvky. Jste na cestě k vytvoření vlastní hry, ale pokud potřebujete další nápovědu a informace, podívejte se na tyto zdroje informací.
Použití XAML pro překryvné zobrazení
Jednou z alternativ, kterou jsme podrobně neprobírali, je použití XAML místo Direct2D pro překrytí. XAML má oproti Direct2D mnoho výhod pro kreslení prvků uživatelského rozhraní. Nejdůležitější výhodou je, že díky začlenění vzhledu a chování Windows 10 do hry DirectX je pohodlnější. Mnoho běžných prvků, stylů a chování, které definují aplikaci pro UPW, jsou úzce integrovány do modelu XAML, takže je mnohem méně práce pro vývojáře her implementovat. Pokud má váš vlastní návrh her složité uživatelské rozhraní, zvažte použití XAML místo Direct2D.
Pomocí XAML můžeme vytvořit herní rozhraní, které vypadá podobně jako rozhraní Direct2D, které jsme vytvořili dříve.
XAML
Direct2D
I když mají podobné koncové výsledky, mezi implementací rozhraní Direct2D a XAML existuje celá řada rozdílů.
| Vlastnost | XAML | Direct2D |
|---|---|---|
| Definování překrytí | Definováno v souboru XAML. \*.xaml Jakmile pochopíte XAML, vytváření a konfigurace složitějších překryvů se v porovnání s Direct2D zjednoduší. |
Definováno jako kolekce primitiv Direct2D a DirectWrite řetězce ručně umístěné a zapsané do cílové vyrovnávací paměti Direct2D. |
| Prvky uživatelského rozhraní | Prvky uživatelského rozhraní XAML pocházejí ze standardizovaných prvků, které jsou součástí rozhraní API XAML prostředí Windows Runtime, včetně rozhraní Windows::UI::Xaml a Windows::UI::Xaml::Controls. Kód, který zpracovává chování elementů uživatelského rozhraní XAML, je definován v souboru codebehind Main.xaml.cpp. | Jednoduché obrazce lze kreslit jako obdélníky a elipsy. |
| Změna velikosti okna | Přirozeně se vypořádává se změnami velikosti a událostmi změn stavu zobrazení a odpovídajícím způsobem transformuje překrytí. | Je třeba ručně určit, jak překreslit překryvné součásti. |
Dalším velkým rozdílem je swapovací řetězec. Není třeba připojit řetězec prohození k objektu, jako je Windows::UI::Core::CoreWindow. Místo toho aplikace DirectX, která obsahuje XAML, přidruží swap chain, když je vytvořen nový SwapChainPanel objekt.
Následující fragment kódu ukazuje, jak deklarovat XAML pro SwapChainPanel v souboru DirectXPage.xaml .
<Page
x:Class="Simple3DGameXaml.DirectXPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Simple3DGameXaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<SwapChainPanel x:Name="DXSwapChainPanel">
<!-- ... XAML user controls and elements -->
</SwapChainPanel>
</Page>
SwapChainPanel objekt je nastaven jako Content vlastnost aktuálního objektu okna vytvořeného při spuštění singleton aplikace.
void App::OnLaunched(_In_ LaunchActivatedEventArgs^ /* args */)
{
m_mainPage = ref new DirectXPage();
Window::Current->Content = m_mainPage;
// Bring the application to the foreground so that it's visible
Window::Current->Activate();
}
Pokud chcete připojit nakonfigurovaný swap chain k SwapChainPanel instanci definované XAML, musíte získat ukazatel na základní nativní ISwapChainPanelNative implementaci rozhraní a zavolat ISwapChainPanelNative::SetSwapChain, předat svůj nakonfigurovaný swap chain.
Následující úryvek kódu z DX::DeviceResources::CreateWindowSizeDependentResources podrobně popisuje vzájemné propojení DirectX/XAML:
ComPtr<IDXGIDevice3> dxgiDevice;
DX::ThrowIfFailed(
m_d3dDevice.As(&dxgiDevice)
);
ComPtr<IDXGIAdapter> dxgiAdapter;
DX::ThrowIfFailed(
dxgiDevice->GetAdapter(&dxgiAdapter)
);
ComPtr<IDXGIFactory2> dxgiFactory;
DX::ThrowIfFailed(
dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory))
);
// When using XAML interop, the swap chain must be created for composition.
DX::ThrowIfFailed(
dxgiFactory->CreateSwapChainForComposition(
m_d3dDevice.Get(),
&swapChainDesc,
nullptr,
&m_swapChain
)
);
// Associate swap chain with SwapChainPanel
// UI changes will need to be dispatched back to the UI thread
m_swapChainPanel->Dispatcher->RunAsync(CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
{
// Get backing native interface for SwapChainPanel
ComPtr<ISwapChainPanelNative> panelNative;
DX::ThrowIfFailed(
reinterpret_cast<IUnknown*>(m_swapChainPanel)->QueryInterface(IID_PPV_ARGS(&panelNative))
);
DX::ThrowIfFailed(
panelNative->SetSwapChain(m_swapChain.Get())
);
}, CallbackContext::Any));
// Ensure that DXGI does not queue more than one frame at a time. This both reduces latency and
// ensures that the application will only render after each VSync, minimizing power consumption.
DX::ThrowIfFailed(
dxgiDevice->SetMaximumFrameLatency(1)
);
}
Pro více informací o tomto procesu si přečtěte téma interoperabilita mezi DirectX a XAML.
Ukázka
Pokud si chcete stáhnout verzi této hry, která používá XAML pro překryvné zobrazení, podívejte se na ukázku hry DirectX a XAML . Nezapomeňte si přečíst soubor readme, kde najdete podrobnosti o sestavení ukázky.
Na rozdíl od verze ukázkové hry probírané ve zbytku těchto témat definuje verze XAML svou architekturu v App.xaml.cpp a DirectXPage.xaml.cpp souborech místo App.cpp a GameInfoOverlay.cpp.