Windows API kullanarak XNA'da rastgele metin oluşturma?


9

Andrew'un diğer sorumla ilgili yorumunda, metni doğrudan bir SpriteBatch ile çizmek yerine, Windows API'sını kullanarak bir Texture2D'ye metin oluşturmanın mümkün olduğunu belirtti. Bu nasıl yapılır? Resim verilerini bir Texture2D'ye yazmadan önce bir ara adım olduğunu tahmin ediyorum.

Bu SpriteFont (Korece ve Japonca çok fazla glifleri bu yolu ne yazık ki olanaksız hale getirmek için) kullanarak gerekli tüm glifleri önceden render etmek yerine, Unicode karakterleri anında oluşturmam için izin vereceğim diye soruyorum. Teşekkürler!

Yanıtlar:


4

Bazı yansımalar kullanarak, bir Texture2D'den Direct3D yüzey işaretçisini alabilirsiniz. Oradan, bir DX yüzeyine dönüştürülebilen API'leri kullanabilirsiniz. Son zamanlarda WPF D3DImage (alfa kanalı desteği ile) XNA içeriği barındırmak için yaptım. DirectWrite bir DX yüzeyine dönüşebilir ve yönetilen API'leri bile kullanabilirsiniz . Bu bağlantıdaki DirectX .NET sarmalayıcıları, Direct3D 9'u (XNA'nın AFAIK kullandığı) değil, yalnızca Direct3D 10 ve 11'i destekler. Ancak, yine de çalışmasını sağlayabilirsiniz. Yan notta, vektör grafikleri oluşturmak istiyorsanız, Direct2D ile birlikte çalışmak için benzer bir yaklaşım kullanabilirsiniz. Doğal olarak, bunların hiçbiri Windows dışındaki XNA destekli herhangi bir platformda çalışmaz.


1
Sadece xna için pencere tutamacını alabileceğinizi ve bunun yerine win32 paneli gibi bir şeye işlemesini söyleyeceğinizi belirtmek istiyorum. Daha sonra backbuffer'ı bir win32 kontrolüne çizdiğiniz için oyunun üstünde işlemek istediğiniz herhangi bir yöntemi kullanabilirsiniz. Bu çok kirli ama Tablet PC giriş panelini XNA ile birleştirdiğimde benim için iyi çalıştı. Sonuç, standart bir XNA penceresi gibi görünen ancak görünmez el yazısı tanıma özelliğiyle ortaya çıktı. Sadece xna'nın üstünde konturlar gösterdim. Tabii ki metin / etiketler / düğmeler de çalışacaktır. Ancak, bunu WPF ile denemedim.
zfedoran

1
Metodunuzda "hava sahası" sorunları olacağını düşünürüm, Arriu. Alfa kanalı olduğu gibi bir XNA penceresinin üstünde içerik oluşturabildiniz mi? Genel kural, bir pikselin yalnızca bir grafik API tarafından "sahip olunabilmesi" dir, bu da saydam veya yarı saydam içerikle ilgili sorunlara neden olur. Bu yönteminiz için de geçerliyse, metni düz renk arkaplandan başka bir şey üzerinde oluşturmak sorunlu olacaktır.
Mike Strobel

Üzgünüm, biraz kafa karıştırıcı olabilirdim. Açıkladığım yöntem, panele arka planına bir doku çizmesini söylemekten başka bir şey yapmıyor. Bir imagebox'a hangi görüntünün çizileceğini nasıl söyleyebileceğinize benzer. Ancak doku / görüntü bir dosya olmak yerine, xna backbuffer'dır. Panelin / pencerenin üzerinde veya üzerinde çizim yapmıyordum. Yani "hava sahası" ile ilgili hiçbir sorun yoktu.
zfedoran

Ah, anlıyorum. Yani yaklaşımınız XNA içeriğini WPF'de (D3DImage kullanarak) nasıl barındırdığımıza çok benziyor. Tipik bir bitmap kaynağı yerine, görüntü kaynağı bir XNA / Direct3D yüzeyidir. Mevcut seçenekler göz önüne alındığında bunun en iyi yaklaşım olduğunu kabul ediyorum - hava sahası sorunu yok ve performans oldukça iyi çünkü gereksiz kopyalama / blitting gerekli değil.
Mike Strobel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.