Örnek oyunu genişletme

Uyarı

Bu konu, DirectX öğretici serisi ile basit bir Evrensel Windows Platformu (UWP) oluşturma oyunun bir parçasıdır. Bu bağlantıdaki konu başlığı, serinin bağlamını ayarlar.

Katman için XAML kullanan bu oyunun sürümünü indirmek için bkz. DirectX ve XAML oyun örneği. Örneği oluşturma hakkındaki ayrıntılar için benioku dosyasını orada okuduğunuzdan emin olun.

Bu noktada temel bir Evrensel Windows Platformu (UWP) DirectX 3D oyununun temel bileşenlerini ele aldık. Görünüm sağlayıcısı ve işleme işlem hattı dahil olmak üzere bir oyunun çerçevesini ayarlayabilir ve temel bir oyun döngüsü uygulayabilirsiniz. Ayrıca temel bir kullanıcı arabirimi katmanı oluşturabilir, sesleri birleştirebilir ve denetimleri uygulayabilirsiniz. Kendi oyununuzu oluşturmaya gidiyorsunuz, ancak daha fazla yardım ve bilgiye ihtiyacınız varsa bu kaynaklara göz atın.

Bindirme için XAML kullanma

Ayrıntılı olarak ele almadığımız alternatiflerden biri katman için Direct2D yerine XAML'nin kullanılmasıdır. XAML'nin kullanıcı arabirimi öğelerini çizmek için Direct2D'ye göre birçok avantajı vardır. En önemli avantajı, Windows 10'un DirectX oyununuza eklenmesini daha kullanışlı hale getiriyor olmasıdır. Bir UWP uygulamasını tanımlayan yaygın öğelerin, stillerin ve davranışların çoğu XAML modeliyle sıkı bir şekilde tümleştirilir ve bu da oyun geliştiricisinin uygulaması için çok daha az işe yaramasını sağlar. Kendi oyun tasarımınız karmaşık bir kullanıcı arabirimine sahipse Direct2D yerine XAML kullanmayı göz önünde bulundurun.

XAML ile daha önce yapılan Direct2D'ye benzer bir oyun arabirimi oluşturabiliriz.

XAML

XAML katman

Direct2D

D2D kaplama

Benzer son sonuçlara sahip olsalar da Direct2D ve XAML arabirimlerini uygulama arasında bir dizi fark vardır.

Özellik XAML Direct2D
Katman tanımlama Belirli bir XAML dosyasında tanımlanan \*.xaml. XAML'yi anladıktan sonra, Direct2D ile karşılaştırıldığında daha karmaşık katman oluşturma ve yapılandırma işlemleri daha kolay hale getirilir. Direct2D temel öğelerinin bir koleksiyonu olarak tanımlanır ve DirectWrite bir Direct2D hedef arabelleğine el ile yerleştirilen ve yazılan dizeleri.
Kullanıcı arabirimi öğeleri XAML kullanıcı arabirimi öğeleri, Windows::UI::Xaml ve Windows::UI::Xaml ::Controls dahil olmak üzere Windows Çalışma Zamanı XAML API'lerinin parçası olan standartlaştırılmış öğelerden gelir. XAML kullanıcı arabirimi öğelerinin davranışını işleyen kod, Main.xaml.cpp bir codebehind dosyasında tanımlanır. Basit şekiller dikdörtgenler ve üç nokta gibi çizilebilir.
Pencereyi yeniden boyutlandırma Yeniden boyutlandırma ve görüntü durumu değişikliği olaylarını doğal olarak işler ve buna göre üst katmanını dönüştürür. Katman bileşenlerinin nasıl yeniden çizileceğini el ile belirtmeniz gerekir.

Bir diğer büyük fark, takas zinciriile ilgilidir. Takas zincirini bir Windows::UI::Core::CoreWindow nesnesine eklemeniz gerekmez. Bunun yerine, XAML içeren bir DirectX uygulaması, yeni bir SwapChainPanel nesnesi oluşturulduğunda bir takas zincirini ilişkilendirir.

Aşağıdaki kod parçacığında, DirectXPage.xaml dosyasında SwapChainPanel için XAML'nin nasıl bildirilmesi gösterilmektedir.

<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 nesnesi, uygulama teklisi tarafından başlatma oluşturulan geçerli pencere nesnesinin content özelliği olarak ayarlanır.

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

Yapılandırılan takas zincirini XAML'niz tarafından tanımlanan SwapChainPanel örneğine eklemek için, ISwapChainPanelNative arabirimi uygulaması temel alınan yerel bir işaretçi edinmeniz ve ISwapChainPanelNative::SetSwapChain çağırarak yapılandırılan takas zincirinizi geçirmeniz gerekir.

DX::DeviceResources::CreateWindowSizeDependentResources'tan aşağıda yer alan kod parçacığı, DirectX/XAML birlikte çalışmasıyla ilgili ayrıntıları sunar:

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

Bu işlem hakkında daha fazla bilgi için bkz. DirectX ve XAML birlikte çalışma.

Örnek

Katman için XAML kullanan bu oyunun sürümünü indirmek için bkz. DirectX ve XAML oyun örneği. Örneği oluşturma hakkındaki ayrıntılar için benioku dosyasını orada okuduğunuzdan emin olun.

Bu konuların geri kalanında ele alınan örnek oyunun sürümünden farklı olarak, XAML sürümü çerçevesini sırasıyla App.cpp ve GameInfoOverlay.cpp yerine App.xaml.cpp ve DirectXPage.xaml.cpp dosyalarında tanımlar.