Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Bu konu, DirectX öğretici serisi ile basit bir Evrensel Windows Platformu (UWP) oluşturma
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
XAML ile daha önce yapılan Direct2D'ye benzer bir oyun arabirimi oluşturabiliriz.
XAML
Direct2D
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>
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
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.