แสดงผลข้อความโดยพลการใน XNA โดยใช้ Windows API?


9

ในความเห็นของแอนดรูว์กับคำถามอื่นของฉันเขาตั้งข้อสังเกตว่ามันเป็นไปได้ที่จะแสดงข้อความเป็น Texture2D โดยใช้ Windows API แทนที่จะวาดข้อความโดยตรงด้วย SpriteBatch สิ่งนี้ทำได้อย่างไร ฉันเดาว่ามีขั้นตอนกลางก่อนที่จะเขียนข้อมูลภาพลงใน Texture2D

ฉันถามเพราะสิ่งนี้จะทำให้ฉันสามารถแสดงอักขระ Unicode ได้ทันทีแทนที่จะต้องแสดงร่ายมนตร์ที่จำเป็นทั้งหมดด้วย SpriteFont (ร่ายมนตร์มากเกินไปในภาษาเกาหลีและภาษาญี่ปุ่นเพื่อทำให้เส้นทางนี้เป็นไปไม่ได้และเศร้า) ขอบคุณ!

คำตอบ:


4

เมื่อใช้การสะท้อนบางอย่างคุณสามารถจับตัวชี้พื้นผิว Direct3D จาก Texture2D จากตรงนั้นคุณสามารถใช้ API ใด ๆ ที่สามารถแสดงผลกับพื้นผิว DX ได้ ฉันทำสิ่งนี้เมื่อเร็ว ๆ นี้เพื่อโฮสต์เนื้อหา XNA ด้วย D3DImage ของ WPF (พร้อมการสนับสนุนช่องอัลฟา) DirectWrite สามารถแสดงผลบนพื้นผิว DX และคุณอาจใช้API ที่มีการจัดการได้ ตัวห่อ DirectX .NET ในลิงค์นั้นรองรับเฉพาะ Direct3D 10 และ 11 และไม่ใช่ Direct3D 9 (ซึ่ง XNA ใช้ AFAIK) อย่างไรก็ตามคุณอาจยังสามารถใช้งานได้ ในบันทึกย่อด้านข้างหากคุณต้องการแสดงผลกราฟิกแบบเวกเตอร์คุณอาจสามารถใช้วิธีการที่คล้ายกันในการทำงานร่วมกับ Direct2D โดยธรรมชาติแล้วสิ่งนี้จะไม่ทำงานบนแพลตฟอร์มที่รองรับ XNA นอกเหนือจาก Windows


1
ฉันแค่อยากจะชี้ให้เห็นว่าคุณยังสามารถใช้มือจับหน้าต่างสำหรับ xna และบอกให้มันแสดงผลเหมือนกับ win32 panel แทน จากนั้นคุณสามารถใช้วิธีการใด ๆ ที่คุณต้องการแสดงผลบนสุดของเกมเนื่องจากคุณเพียงแค่วาด backbuffer ไปยังตัวควบคุม win32 มันสกปรกมาก แต่ก็ใช้งานได้ดีสำหรับฉันเมื่อฉันรวมแผงป้อนข้อมูลแท็บเล็ตพีซีกับ XNA ผลที่ได้คือสิ่งที่ดูเหมือนจะเป็นหน้าต่าง XNA มาตรฐาน แต่ด้วยการรู้จำลายมือที่มองไม่เห็น ฉันเพียงแค่แสดงจังหวะบน xna แน่นอนว่าข้อความ / ป้ายกำกับ / ปุ่มก็ใช้ได้เช่นกัน อย่างไรก็ตามฉันไม่ได้ลองกับ WPF
zfedoran

1
ฉันคิดว่าจะมีปัญหา "น่านฟ้า" กับวิธีการของคุณ Arriu คุณสามารถแสดงเนื้อหาที่ด้านบนของหน้าต่าง XNA โดยที่ช่องอัลฟายังคงอยู่หรือไม่? กฎทั่วไปคือพิกเซลสามารถ "เป็นเจ้าของ" โดย API กราฟิกเดียวเท่านั้นซึ่งทำให้เกิดปัญหากับเนื้อหาที่โปร่งใสหรือโปร่งแสง หากนี่เป็นความจริงสำหรับวิธีการของคุณเช่นกันมันจะเป็นปัญหาสำหรับการแสดงข้อความบนสิ่งอื่นนอกเหนือจากพื้นหลังสีทึบ
Mike Strobel

ขออภัยฉันอาจสับสนเล็กน้อย วิธีที่ฉันอธิบายไม่ได้ทำอะไรมากไปกว่าบอกให้พาเนลวาดพื้นผิวบนพื้นหลัง คล้ายกับวิธีที่คุณสามารถบอกกล่องรับภาพว่าจะวาดรูปอย่างไร แต่แทนที่จะเป็นพื้นผิว / ภาพเป็นไฟล์มันคือแบ็กบุฟเฟอร์ xna ฉันไม่ได้วาดรูปด้านบนหรือบนแผง / หน้าต่าง ดังนั้นจึงไม่มีปัญหากับ "น่านฟ้า"
zfedoran

อ่าฉันเข้าใจแล้ว ดังนั้นวิธีการของคุณคล้ายกับวิธีที่ฉันโฮสต์เนื้อหา XNA ใน WPF (โดยใช้ D3DImage) แทนที่จะเป็นแหล่งบิตแมปทั่วไปแหล่งรูปภาพคือพื้นผิว XNA / Direct3D ฉันยอมรับว่านี่เป็นวิธีที่ดีที่สุดในการเลือกตัวเลือกที่มี - ไม่มีปัญหาในน่านฟ้าและประสิทธิภาพค่อนข้างดีเพราะไม่จำเป็นต้องคัดลอก / ตัด
Mike Strobel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.