Надання довільного тексту в XNA за допомогою API Windows?


9

У коментарі Ендрю до мого іншого запитання він зазначив, що можна надати текст Texture2D за допомогою API Windows, замість того, щоб малювати текст безпосередньо 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. Тоді ви можете використовувати будь-який метод, який хочете відобразити поверх гри, оскільки ви просто малюєте зворотний буфер до управління win32. Це дуже брудно, але для мене це спрацювало добре, коли я об'єднав вхідну панель планшетного ПК з XNA. Результатом цього стало те, що було звичайним вікном XNA, але з невидимим розпізнаванням рукописного тексту. Я просто відображав штрихи поверх xna. Звичайно, текст / мітки / кнопки також працюватимуть. Однак я не пробував цього з WPF.
zfedoran

1
Я думаю, що з вашим методом виникнуть проблеми "повітряного простору", Арріу. Чи змогли ви відобразити вміст поверх вікна XNA з альфа-каналом неушкодженим? Загальне правило полягає в тому, що пікселем може бути «належить» лише один графічний API, що спричиняє проблеми з прозорим або напівпрозорим вмістом. Якщо це справедливо і для вашого методу, тоді було б проблематично відображати текст поверх будь-якого іншого, крім суцільного кольорового фону.
Майк Стробель

Вибачте, я, можливо, трохи заплутався. Описаний нами метод не має нічого іншого, як наказувати панелі намалювати текстуру на її тлі. Подібно до того, як ви можете сказати графіці, яке зображення намалювати. Але замість текстури / зображення є файлом, це backbaffer xna. Я не малював поверх або над панеллю / вікном. Тож проблем із "повітряним простором" не було.
zfedoran

А, бачу. Тож ваш підхід дуже схожий на те, як я розмістив вміст XNA у WPF (використовуючи D3DImage). Замість типового джерела растрового зображення джерелом зображення є поверхня XNA / Direct3D. Я погоджуюся, що це найкращий підхід, враховуючи наявні варіанти - проблем з повітряним простором немає, а продуктивність дуже хороша, тому що не потрібно зайвих копіювання / прошивання.
Майк Стробель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.