Anasayfa Eğitseller Oyun Yapımı DirectX Eğitselleri Bölüm 3 - Boş Pencere Oluşturmak

DirectX Eğitselleri Bölüm 3 - Boş Pencere Oluşturmak PDF Yazdır e-Posta
Kullanıcı Değerlendirmesi: / 1
ZayıfEn iyi 
Eğitseller - Oyun Yapımı
Salı, 19 Ağustos 2008 00:03

Directx ile ekrana birşeyler çizdirebilmemiz için öncelikle bir pencereye ihtiyacımız var. Bu konumda biraz winAPI programlama ile ilgilenmemiz gerekecek. WinAPI kodları genelde bu işe yeni olanların gözünü korkutur ki aslında haklılar :). Ama burada yazacağımız pencere oluşturma kodunu bir kere anlayıp yazdıktan sonra kopyala/yapıştır ömür boyu kullanabilirsiniz.

İlk olarak winAPI 'ın genel başlık dosyasını ekleyerek başlıyoruz.

#include "windows.h"       

Bir win32 pencere uygulamasının main metodu şöyledir:

int WINAPI WinMain(HINSTANCE hinstance,              //program göstericisi
HINSTANCE prevInstance, //kullanılmıyor
PSTR cmdLine, //komut satırı argümanı (char*)
int showCmd) //pencere durumu

Bir pencereyi 3 aşamada oluşturabiliriz:

1-Pencerenin özelliklerini tanımlamak : Bunu yapmak için bir WNDCLASS yapısını doldurmamız gerekiyor.

WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW; //stil
wc.lpfnWndProc = (WNDPROC)WndProc; //wnd methodu
wc.cbClsExtra = 0; //ekstra bellek
wc.cbWndExtra = 0; //ekstra bellek
wc.hInstance = hinstance; //program göstericisi
wc.hIcon = LoadIcon(0, IDI_APPLICATION); //simge
wc.hCursor = LoadCursor(0, IDC_ARROW); //kursör
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //arka plan rengi
wc.lpszMenuName = 0; //menu
wc.lpszClassName = "window"; //pencere sınıf adı

2-Doldurduğumuz wndclass yapısını register etmek. Bunu RegisterClass(Ex) metodu ile gerçekleştiriyoruz.

RegisterClass(&wc);

3-Register ettiğimiz tanım ile CreateWindow(Ex) metodunu çağırarak pencereyi yaratıyoruz.

HWND hwnd = CreateWindow("window",      //pencere sınıf adı
"bos pencere", //pencere etiketi
WS_OVERLAPPEDWINDOW, //pencere parametreleri(bkz. msdn)
0, //başlangıç x koordinatı
0, //başlangıç y koordinatı
800, //genişlik
600, //yükseklik
0, //ebeveyn pencere
0, //menü
hinstance, //program göstericisi
0); //kullanıcı bilgisi

4-Son olarak pencereyi gösterip güncellememiz gerekiyor.

ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);

Windows programları olay-güdümlüdür yani bir olay gerçekleşene kadar öylece beklerler. Her pencerenin bu olayları işlediği bir geri çağrım(callback) metodu vardır. Genellikle WndProc olarak isimlendirilen bu metod herhangi bir olay oluştuğunda otomatik olarak çağrılır ve bizim o metod içerisinde yazdığımız tepkileri verir. Dikkat ettiyseniz bu metodu wndclass yapısını doldururken bir değer olarak verdik. Program döngüsünde windows mesajlarının işlenmesi ve kalan zamanda da bizim yapmak istediklerimiz yapılır. Burada bir msg yapısı tanımlıyoruz. Bu windows mesajlarını temsil eden bir yapıdır. PeekMessage metodu windows'un mesaj kuyruğunda mesaj olup olmadığını kontrol eder ve eğer mesaj varsa bunu msg yapısına aktarır. Biz de orada iki metod yardımı ile bu mesajları pencere metoduna yollarız. Mesaj olmadığı zamanlarda diğer işlemler yapılır.

MSG msg;                                                                 //windows mesaj yapısı
while(true)
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE)) //mesaj kuyruğunu kontrol et
{
if (msg.message == WM_QUIT)break; //çıkış mesajı gelince bitir
TranslateMessage(&msg);
DispatchMessage(&msg); //mesajı işleyecek metoda yolla
}
else
{
//diğer işler
}
}

Son olarak daha önce bahsettiğimiz pencere geri çağrım(callback) metodundan bahsedelim. Yukarıda bahsettiğim gibi gelen mesajlar bu metoda yollanır. Bu metod birden fazla pencerenin de mesajlarına karşılık verebilir.Burada görüldüğü gibi sadece 2 tane mesaja cevap verdik, diğerlerini ise windowsa bıraktık.

LRESULT CALLBACK WndProc(HWND hwnd,    //hangi pencere
UINT msg, //mesaj türü
WPARAM wParam, //mesaj bilgisi
LPARAM lParam) //mesaj bilgisi
{
switch(msg)
{
//pencere yok edilirken çıkış mesajı yolla
case WM_DESTROY:
{
::PostQuitMessage(0);
break;
}
//bir tuşa basılınca çağrılır
case WM_KEYDOWN:
{
//esc ile pencereyi yok et
if( wParam == VK_ESCAPE )DestroyWindow(hwnd);
break;
}
}
//diğer mesajlar ile windows ilgilenir
return DefWindowProc(hwnd, msg, wParam lParam);
}

Evet boş pencere eğitselimiz bu kadar. Çok fazla detaya girmedik, directx kullanmak için windows programlama hakkında çok detaylı bilgi sahibi olmak gerekmiyor ama biliyor olmak her zaman bir artıdı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
Son Güncelleme ( Salı, 19 Ağustos 2008 01:22 )
  Yorum yok.
Yorum ekle. (0 yorum)

 

OyunGelistirici.net - Türk Oyun Yapımcılarının Buluşma Noktası

Bu sitede yazılan tüm yazıların hakları yazarlarına aittir. İzin alınmadan yayınlanamaz.

Bu sitede Firefox kullanmanız önerilir. En az 1024 x 768 masaüstü çözünürlüğü tavsiye edilir.