सीधे WPF विंडो पर XNA दृश्य प्रदर्शित करें
सारांश
वर्णन करता है कि XNA के साथ सीधे WPF विंडो में रेंडर कैसे करें।
परिचालन का वातावरण
आवश्यकताएँ
समर्थित XNA संस्करण |
|
समर्थित प्लेटफार्म |
|
Windows आवश्यक वर्टेक्स शेडर संस्करण | 1.1 |
Windows आवश्यक पिक्सेल शेडर संस्करण | 1.1 |
परिचालन का वातावरण
प्लेटफार्म |
सार तत्व
WPF अनुप्रयोगों में XNA का उपयोग करने में, मैंने दृश्य प्रदर्शित करने के लिए WindowsFormsHost नियंत्रण का उपयोग किया, लेकिन अब मैं बहुभुज प्रदर्शित करने के लिए केवल WPF विंडो का उपयोग करना चाहता हूं। "डब्ल्यूपीएफ अनुप्रयोगों में एक्सएनए का उपयोग करना" एक प्रतिनिधित्व का एक सा है, इसलिए मैं मतभेदों को समझाऊंगा।
नामस्थान उपनाम
// 名前空間エイリアス
using Xna = Microsoft.Xna.Framework;
using XnaGraphics = Microsoft.Xna.Framework.Graphics;
रंग और मैट्रिक्स संरचनाएँ XNA Framework और WPF नामस्थान द्वारा कवर किए जाते हैं, क्योंकि आप इसे उपयोग करने के लिए नामस्थान से संरचना का नाम निर्दिष्ट करना होगा। हालांकि, यह हर बार लंबा लगता है, इसलिए मैं एक नामस्थान उपनाम बना रहा हूं। उदाहरण के लिए, "Microsoft.Xna.Framework.Rectangle" अब "Xna.Rectangle" के रूप में निर्दिष्ट किया जा सकता है।
समयपाल
.NET Framework 3.0 के बाद से, "System.Windows.Threading.DispatcherTimer" नामक टाइमर वर्ग उपलब्ध है, और इस टाइमर वर्ग प्रत्येक फ़्रेम को रेंडर करने के लिए उपयोग किया जाता है। WPF UI के समान थ्रेड पर प्रसंस्करण की अनुमति देने के लिए DispatcherTimer का उपयोग करता है।
<summary>
タイマー
</summary>
private DispatcherTimer timer = null;
फ़ील्ड, एक डिस्पैचरटाइमर घोषित करना।
<summary>
タイマーイベント
</summary>
<param name="sender"></param>
<param name="e"></param>
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
this.Draw();
}
एक विधि को परिभाषित करता है जिसे DispatcherTimer नियमित अंतराल पर कॉल करता है।
// タイマー
this.timer = new DispatcherTimer();
this.timer.Tick += new EventHandler(dispatcherTimer_Tick);
this.timer.Interval = new TimeSpan(0, 0, 0, 0, 16);
this.timer.Start();
यह टाइमर सेट करने की प्रक्रिया है। DispatcherTimer का एक उदाहरण बनाने और कॉल करने के लिए विधि और समय अंतराल सेट करने के बाद, DispatcherTimer.Start विधि टाइमर प्रारंभ करता है।
विंडो हैंडल प्राप्त करना
Direct3D डिवाइस बनाने के लिए, आपको विंडो हैंडल की आवश्यकता होती है. हालांकि, डब्ल्यूपीएफ में विंडो हैंडल की अवधारणा नहीं है, इसलिए इसे सीधे विंडो क्लास से प्राप्त करने का कोई तरीका नहीं है।
हालाँकि, कई बार जब विंडो हैंडल की आवश्यकता होती है, जैसा कि इस स्थिति में, विंडो हैंडल Win32 कोड के लिए एक इंटरऑप के रूप में "System.Windows.Interop.WindowInteropHelper" वर्ग के माध्यम से प्राप्त किया जा सकता है। (यह विंडो क्लास है)
// ウィンドウハンドルを取得する
IntPtr handle = new WindowInteropHelper(this).Handle;
Direct3D डिवाइस बनाते समय इस हैंडल का उपयोग करें. हालाँकि, यदि आप OnInitialized विधि में विंडो हैंडल प्राप्त करने का प्रयास करते हैं, तो यह 0 लौटाएगा, शायद इसलिए कि विंडो अभी तक नहीं बनाई गई है। इस नमूने में, डिवाइस OnSourceInitialized विधि में बनाया जाता है।
निर्दिष्ट क्षेत्र में प्रस्तुत करें
आप गंतव्य क्षेत्र को GraphicsDevice.Present के दूसरे तर्क के रूप में निर्दिष्ट कर सकते हैं. नमूने में, मैं इसे ऑफसेट के रूप में स्थिति (50, 50) पर खींचने की कोशिश करता हूं। आकार बैकबफर (300, 300) के आकार के समान है। पहला तर्क वह क्षेत्र है जहां से आकर्षित करना है, और यदि नल निर्दिष्ट है, तो मूल बफर का उपयोग किया जाता है।
// 描画先を指定する
Xna.Rectangle rect = new Xna.Rectangle(
50, 50,
(int)this.viewSize.Width, (int)this.viewSize.Height);
this.device.Present(null, rect, this.windowHandle);
किसी उपकरण को नष्ट करना
जब आप विंडो बंद करते हैं तो आप अपने डिवाइस को नष्ट कर रहे हैं। मूल रूप से, मैं इसे डिस्पोज विधि के साथ संभालना चाहता था, लेकिन चूंकि डब्ल्यूपीएफ विंडो क्लास डिफ़ॉल्ट रूप से आईडीस्पोजेबल को विरासत में नहीं देता है, इसलिए मैंने इसे यहां लिखा था।
<summary>
ウインドウが閉じたとき
</summary>
<param name="e"></param>
protected override void OnClosed(EventArgs e)
{
if (this.device != null)
{
this.device.Dispose();
this.device = null;
}
base.OnClosed(e);
}
फाँसी
यदि आप नमूना प्रोग्राम चलाते हैं, तो आप इसे स्क्रीन छवि के साथ चला सकते हैं जैसे कि आलेख की शुरुआत में दी गई है.
पहली नज़र में, यह अच्छी तरह से प्रस्तुत करता है, लेकिन जब मैं माउस के साथ खींचकर विंडो का आकार बदलता हूं, तो आकार बदलने के दौरान दृश्य झिलमिलाहट या गायब हो जाता है। ऐसा लगता है कि डब्ल्यूपीएफ प्रतिपादन के साथ संघर्ष हो रहा है, और मैंने बहुत सी चीजों की कोशिश की लेकिन इसे हल नहीं कर सका।
यदि आप XNA का उपयोग कर रहे हैं, तो WindowsFormsHost नियंत्रण का उपयोग करना सुरक्षित लगता है।
प्रोग्राम को .NET फ़्रेमवर्क 3.0, नवीनतम DirectX रनटाइम और Microsoft XNA फ़्रेमवर्क पुनर्वितरण योग्य 2.0 की आवश्यकता होती है। इसके अलावा, हार्डवेयर आवश्यकता के रूप में, "एक ग्राफिक्स कार्ड जो पिक्सेल शेडर 1.1 या उच्चतर का समर्थन करता है" की आवश्यकता होती है।
इसके अलावा, परियोजना "विजुअल स्टूडियो 2008 व्यावसायिक संस्करण" में बनाई गई थी। Visual Studio 2008 के लिए एक वातावरण तैयार करें।