|
Direct3d'de ekrana birşeyler yazdırmanın bir kaç yolu vardır. Genellikle D3DX kütüphanesinin sağladığı ID3DXFont yapısı kullanılır ama bu sınıf çizim için GDI kullandığı için performansa büyük darbe vurur. Bkz. GDI. Burada çok kaba bir şekilde sdk ile gelen CD3DFont sınıfından bahsedeceğiz. Bu sınıfı kullanmak için öncelikle dxutil.cpp, d3dutil.cpp, d3dfont.cpp, dxutil.h, d3dutil.h ve d3dfont.h dosyalarını projeye ekliyoruz. #include "d3dx/d3dfont.h" //tanımlar Aygit* aygit; CD3DFont* font1; CD3DFont* font2; CD3DFont* font3;
d3dfont.h başlık dosyasını ekledikten sonra 3 tane font tanımladık. CD3DFont sınıfı yazı çizmek için untransformed vertex'ler kullanarak yüksek performans elde eder(3B text'de yazabilir). Bunun götürüsü ise GDI fontları kadar komplike formatlamalar yapamamasıdır. Basit yazı işleri için hem yeterli hemde hızlı olduğu için sıklıkla tercih edebileceğiniz bir yöntem. //font1 font1 = new CD3DFont("Times New Roman", 16, 0); font1->InitDeviceObjects( aygit->getDevice() ); font1->RestoreDeviceObjects(); //font2 font2 = new CD3DFont("Impact", 20, 0); font2->InitDeviceObjects( aygit->getDevice() ); font2->RestoreDeviceObjects(); //font3 font3 = new CD3DFont("", 36, D3DFONT_BOLD); font3->InitDeviceObjects( aygit->getDevice() ); font3->RestoreDeviceObjects();
Yeni bir CD3DFont nesnesi oluşturmak için yazının tipini ve boyutunu veriyoruz. Son paramatrede ise kalınlaştırma(bold), yana yatırma(italik) vb. ayarlar belirtiliyor. Fontun kullanılabilir duruma gelmesi için sırasıyla InitDeviceObjects ve RestoreDeviceObjects metodlarının çağrılması gerekiyor. Kodu açık olduğu için bu metodları kendiniz inceleyebilirsiniz. char fps_str[16]; sprintf(fps_str,"Fps : %i", aygit->getFPS()); font1->DrawText(20,20, D3DCOLOR_XRGB(255,255,255),fps_str); //beyaz (fps) font2->DrawText(20,60, D3DCOLOR_XRGB(255,0,0),"Test"); //kırmızı font3->DrawText(20,100,D3DCOLOR_XRGB(0,255,0),"Test"); //yeşil
Font nesnelerini kullanarak ekrana birşeyler yazdırmak oldukça basit. Yazılacak konumu, renk değerini ve string'i parametre olarak vermek yeterli. Deneme amaçlı olarak burada 3 farklı tipte font kullandık ve en başta fps değerini ekrana yazdırdık. //delete all font3->InvalidateDeviceObjects(); font3->DeleteDeviceObjects(); SAFE_DELETE (font3); font2->InvalidateDeviceObjects(); font2->DeleteDeviceObjects(); SAFE_DELETE (font2); font1->InvalidateDeviceObjects(); font1->DeleteDeviceObjects(); SAFE_DELETE (font1); Programdan çıkarken gösterildiği şekilde font nesnelerini siliyoruz. SAFE_DELETE'den önce gene 2 metod çağrısı yapmak gerekiyor. Detaylarını inceleyebilirsiniz. Bitirmeden önce birkaç noktaya değinelim: -CD3DFont sınıfı font oluşturmak için bir kereliğine GDI çağrısı yapar ve bunu bir dokuda tutar. Büyük boyutlu font demek büyük boyutlu doku demektir. Büyük dokularda bellekte büyük yer kaplarlar. O yüzden büyük fontlardan kaçınmak yada kendi font sisteminizi yazıp küçük fontları "scale" etmek daha sağlıklı olacaktır. -DrawText komutu renderstate'lerde değişiklik yapar o yüzden oyun döngünüzde diğer çizimler için yaptığınız ayarları her seferinde yinelemeniz gerekecektir. Bu state değişimleri pahalı işlemlerdir o yüzden mümkün olduğunca aynı state'de çizilecek nesneleri birbiri ardına çizdirin, karışık sırada çizdirmek performansı düşürür. Kaynak Kodu İndir -------- EKSTRALAR -------- Ekran Kartı Bilgisi Kodu: http://directx.oyungelistirici.net/dx/onbilgi.rar Kavramlar: http://www.oyungelistirici.net/index.php/egitseller/14-oyunyapimi/233-kavramlar DirectX Kaynakları: http://www.chadvernon.com/blog/tutorials/ http://www.directxtutorial.com/ http://www.zanir.szm.sk/index.html http://www.pieterg.com/ http://www.32bits.co.uk/ http://triplebuffer.devmaster.net/tutorials/archive/ http://www.two-kings.de/ http://www.mvps.org/directx/indexes/index.htm http://www.drunkenhyena.com/cgi-bin/directx.pl DirectX Kitapları: http://www.amazon.com/ adresinde DirectX'i aratmanız yeterli. -------- ÖNEMLİ -------- -Bu sitedeki dökümanlar Türkçe kaynak eksikliği yüzünden hazırlanmış ve ihtiyaç duyanların serbest kullanımına sunulmuştur. -Sunulan kodlar ve bilgilerin doğruluk ve etkinlikleri konusunda bir garanti verilmemekle beraber her türlü talep ve düzeltmelerinizi mail yada ilgili forum başlığı yoluyla iletebilirsiniz -Dökümanlarda daha çok genel kavramlara değinilmiş olup detaylı bilgi edinmek için directx dökümanını ve çeşitli kaynakları (özellikle kitap) okumanız tavsiye edilir. Farklı kaynakların bağlantılarını bu dökümanın sonunda bulabilirsiniz. -Bu eğitsellerden verim alabilmek için orta düzeyde c++ bilgisi yeterlidir. Onun dışında winAPI hakkında bilgi sahibi olmak directx'i kavramakta size yardımcı olacaktır. Ayrıca eğitseller ardışık bağlantılı olduğu için bu işte yeni iseniz sırayla gitmeniz tavsiye edilir. -Örnek kodlar Virusl Studio 2003 projeleridir, vs2005 ile de kullanılabilir. -Kavramları Türkçeleştirmek için çok çaba sarfedilmemiştir, çoğu yerde İngilizce isimler kullanılmıştır. Merak ettikleriniz için kavram sözlüğüne bakabilirsiniz. -İndireceğiniz yazılımlardan dolayı PC'nizin ya da bünyenizin zarar görmesi durumunda sorumluluk kabul etmeyiz, geçmiş olsuna gelebiliriz :) -Yazılanların hakkı saklı değildir, sağda solda ben yaptım diye dağıtabilirsiniz :)
Yunus KARA
|