Oyun Programlama..!! |St_AnGeR|

  • Konbuyu başlatan |St_AnGeR|
  • Başlangıç tarihi
S

|St_AnGeR|

Guest
Oyun Programlama..!!

Bu Başlıq altında Başlıqdada Yasdığı gibi oyun programlama haqqında doc lar yayınlıyacağım.. (elime geçtiqce tabi ) belqi bazı arqdaslar oyun programlama ile ilgilenirde bi oyun yaparıs :p HaCKHeLL olaraq..
 
Oyun Programlama..!!

Oyun programlama evet aslında bence programlama dünyasının en uğraştırıcı işlerinden birisi. Çünkü oyunda oynanabilirliği sağlamak ve oyunun atmosferini oturtmak gerçekten zor bir iş. Aslında oyun programlama işi çok zor ve herkesin yapamayacağı bir iş olarak görülüyor, bazı noktalarda ben bu zorluğa pek katılmıyorum. Bu işi zor yapan kullanıcının yaptığınız oyunu benimsemesi ve hoşlanarak oynamasını sağlamaktır. Aslında oyun programlama aşamaları diğer programlara göre daha farklıdır. Oyunlarla olaylar sistem seviyesinde işler ve programcının oyun sistemini tasarlaması gerekmektedir. İşi asıl zor yapan olay budur herhalde.

Peki oyun üretmek için neler yapmalı hangi yolları izlemeli. Bu yazılarda hedeflediğim nokta öncelikle iki boyutlu oyunları daha sonraları üç boyutları üretmek için hangi işlemler uygulandığını açıklamaya çalışmak olacaktır. Eğer programlama tecrübeniz yoksa ve oyun programlama üzerinde çalışmak istiyorsanız öncelikle programlama üzerinde çalışmanızı tavsiye ederim böylelikle bu konudaki gelişimleri çok daha rahat biçimde takip edebilirsiniz.

Günümüzde özellikle son zamanlarda grafik teknolojisinin gelişmesi ile, son derece güzel grafiklere sahip oyunlar üretilmeye başlandı. Bu hızlı gelişim hem donanım hem de yazılım teknolojilerinde sık değişikliklere neden olmaktadır. Grafik teknolojilerinin yapılan oyunlarda verimli kullanılabilmesi için en son yeniliklerin yakından takip edilmesi gerekecektir.

Milyarlarca dolarlık bir pazara sahip olan oyunların ve programcıların serüveni tam olarak ne zaman başladı. İlk yapılan oyun olarak Brookhaven Ulusal Labratuvarlarında (Upton, NY) çalışan Higinbotham'ın yaptığı tenis oyunu gösterilir. Bu aygıtın resmi sayfada verilmiştir (resim1). Osiloskop ortadaki aygıt ve topun hareketlerini hesaplayan analog bilgisayarda sağ taraftadır. Bu oyun popülerliğini uzun yıllar korumuştur. Öyle ki sadece iki sene boyunca labaratuvarda ziyaretçilerin hizmetine sunulmuştur. Daha sonra elektronik alanında yapılan gelişmelerle firmalar yavaş yavaş Higinbotham'ın yaptığı tenis oyunun benzeri oyunları üretmeye başladı. Sonraları ilk video oyun sistemi (şimdilerde konsol diye adlandırılıyor) 1966 yılında üretildi. Bu olaydan sonra çoğu elektronik firması, elektronik alanındaki gelişmeler yardımı ile oyun konsollarını üretmeye başladılar. Öyle ki konsolların altın yılları 1980'li yılların sonuna kadar devam etti. Bu dönemde IBM firmasının ilk PC'yi pazara sokması ile programcılar ve oyuncular daha önce hiç yakalayamadıkları bir oyun ortamı yakalamış oldular.

Resim1:
oyun.jpe


PC platformu için delphi, visual c, visual basic programlama ortamlarını kullanarak oyun geliştirebiliriz ancak eğer platform olarak Xbox, Sega, Playstation vb. oyun konsollarını seçersek ne olur. Bu platformlarda durum PC'lerden biraz daha değişik. Her platformun kendine has SDK'sı (system developers kit) bulunuyor bunlar ilgili firmalardan hatırı sayılır fiyatlara temin edilebilir ;). Ancak bu SDK'lar ile birlikte bir sürü yan ürün kayıt cihazları, programlama dökümanları vs. geliyor.

Oyunları daha heyecanlı yapan kullanıcının oyunun kaderine etki edebilmesidir. Sinemada vb. diğer eğlence dünyasında ise olay daha farklıdır. Sinemada izleyiciler yönetmenin düş dünyasına yolculuk yaparlar ve yönetmenin onlara sunduğu güzellikleri izleme imkanı bulurlar. Oyunları asıl çekici yapan ise kullanıcılar oyunların gelişimine etki eder ve oyunu yaşarlar. Bu yüzden oyun yapmak oldukça zevkli bir iş olmasına rağmen, oyundaki atmosferi yakalayıp kullanıcıların yüzünü güldürebilmekte bir o kadar zordur. Aslında oyunlar hakkında - görsel ve işitsel sanatın teknolojiyi kestiği noktada oyunlar doğar - şeklinde bir cümle kursak çok yanlış olmaz sanırım.

İlk olarak 2 boyutlu grafik programlama konusu üzerinde bir şeyler yazmak istiyorum sanıyorum grafik terminolojisinin temelleri ve kullanılan tekniklerin iyice anlaşılması sonucu 3b programlama tekniklerini anlatmam çok daha kolay olacaktır. İsterseniz ilk olarak bunları gözden geçirelim. Öncelikle bir derleyiciye (compiler) ihtiyacımız var. Ben Microsoft Visual Studio 6.0'ı kullanıyorum ama Borland C++ Builder veya Visual Basic'te kullanılabilir ama bütün kaynak kodlar Visual Studio ortamında olacaktır. Daha sonra Microsoft'un oyun geliştiriciler için ürettiği DirectX API (application programmers interface) ihtiyacımız olacak. İleride tam olarak ne işe yaradığını ve neleri kullandığımızı anlatacağım. Tahmin edebileceğiniz gibi programlama dili olarak burada C kullanacağız C++'ta kullanabiliriz. Ben C++ kullanmaktan yana değilim çünkü C++ bilen insanlar çok rahat C kodlarını okuyabilirler, ama bu olayın tersi doğru değildir bu yüzden elimden geldiği kadar C dilini kullanacağım. Visual Basic ile yazılım geliştirenler için söylüyorum ki bu dili de kullanabilirsiniz Microsoft'un COM teknolojisi sayesinde nesneleri kendi platformlarında kolaylıkla dolaştırabiliyorlar ( iyi iş Microsoft : ) ). Directx'in ilk etapta 7.0 versiyonuna ihtiyaç duymaktayız. (www.microsoft.com/downloads adresinden keyword search yaparak indirebilirsiniz) Bu yazılımı, Microsoft firması yazılım geliştiriciler için ücretsiz olarak yayınlamaktadır. Bir de grafikleri hazırlayabileceğimiz bir grafik programına ihtiyaç duyacağız. Benim tercihim Adobe Photoshop, farklı yazılımlarda kullanabilirsiniz sonuç olarak bize .bmp uzantılı resim dosyaları gerekli olacağından bu dosyayı üretebileceğimiz herhangi bir resim programı kullanılabilir. Programlama açısından gelişimi daha rahat açıklayabilmek için olayları konu başlıklarına bölmek zorunda kaldım ve ilk olarak bir sonraki yazımda Windows programlama temellerinden başlamak istiyorum. Bu yazıda Dos için yazılmış örnek bir oyunun kaynak kodunu bulabileceksiniz. Bu kod yardımı ile sanıyorum oyunlardaki kodlar hakkında birkaç temel fikir elde edebilirsiniz..

örneq oyunu dowload etme içn click..

örneq oyun code leri içn click..
 
Hocam biraz yavaş git nefesimizi kstin yetişemiyoruz.Birini bitirmeden bi bakıyorum 3 konu daha.Çizim masası karşımda hala yatıyo.Dokunamadım bile.:)En iyisi arşive atıp evde sakin kafa ile okumak.Yoksa işten atılacam:)
 
Platform Windows..!!

Yazacağımız oyunlar Windows platformu altında çalışacağından dolayı dilerseniz Windows programlarının yapısını inceleyelim..

Macar İmlası (Hungarian Notation)

Microsoft firması Windows'u yazarken geliştiricilerden biri olan Charles Simonyi değişken isimleri için özel bir teknik geliştirmiş. Bu tekniğin adı Hungarian Notation olarak geçiyor. Bu ismi almasının nedenlerinden biri değişkenlerin hem İngilizce'ye benzememesi (farklı bir dilde yazılmış gibi), hem de Simonyi'nin aslen Macar olmasıdır.

Bu tekniğin asıl kullanım amacı yazılan kodda kullanılan değişken isimlerinin belli bir standarda oturtulmasını sağlamak ve kodun okunabilirliğini artırmak. Böylelikle kodun akışı içerisinde değişken tipini bilmeyen başka bir programcı değişkenin başında kullanılan birkaç harfe bakarak değişkenin tipini öğrenebilir.

Ayrıca Windows'ta kullanılan her fonksiyonun baş harfi büyük harfle başlar ve devam eden kelimelerin baş harfleri de büyük harfle yazılır..

Kod:
IsIconic( .... )
ShowWindow( ... )

Daha sonraları her firma kendi imla stilini geliştirdiği için hungarian notation un birçok versiyonu bulunmaktadır ama yukarıdaki bilgiler Microsoft'un web sitesin alındığı için orijinali olarak kabul edilebilir.
 
WinAPI'ye Giriş:

Geçen ay söylediğimiz gibi yazacağımız oyunlar platform olarak Windows işletim sistemini İşe girişmeden önce Windows programlarının yapısını incelememiz gerekiyor. Windows programlarının Dos tabanlı programlardan oldukça farklı bir mimarisi var.

Peki Windows programları ile Dos programları arasındaki farklar nelerdir. Dos programlarından aynı anda yalnız bir tanesi sistem kaynaklarını kullanmaya yetkilidir, ama Windows programları kaynakları paylaşımlı olarak kullanırlar. Yani Windows altında her şey ortak kullanımdadır. Aynı anda iki program yazıcıya çıktı yollayabilir, dosta ise bu işe tek program yetkilidir. Ayrıca Windows programlarının hepsi grafik arabirimi kullanmak zorundadır. Windows programlarının donanım bilgisine ihtiyaçları yoktur herhangi bir aygıtı kullanmak istediklerinde Windows işletim sisteminden izin alarak kullanabilirler, fakat dos programları kullanacakları donanımın bilgisine sahip olmaları gerekir. Örnek vermek gerekirse dos tabanlı oyunları düşünelim, bu tür oyunlarda ekran kartlarına kesmeler oyun tarafından gönderiliyordu fakat Windows tabanlı oyunlarda ise program yapılacak işleri önce Windows'a veya ilgili birime (directx, opengl olabilir) bildirir ve Windows'ta ilgili aygıta istenen işlemi yönlendirir yani kontrol tamamen işletim sistemindedir. Belki çoğu insan Windows işletim sistemi pek sevmez, verdiği hatalardan dolayı ama bence dizayn ve esneklik açısından mükemmele yakın bir yapıya sahip.

Peki Windows'ta olaylar nasıl dönüyor. Windows Event-Based ( Olay Tabanlı ) bir işletim sistemidir. Windows'taki programlar Windows işletim sistemi ile mesajlaşmak yoluyla haberleşirler, aynı şekilde Windows'ta çalışan programlarla mesajlaşır. Mesela oturumu kapatmak istediğimiz zaman birkaç tane programın açık olduğunu varsayalım. Windows öncelikle bilgisayarı kapatabilmek için bu programları kapatmalıdır. Bu işi gerçekleştirebilmek için, kayıt yaptırmış bütün programlara kapama emri gönderir ve programlar kendi kendilerini kapatırlar (gereken hafıza alanlarını temizler ve kullandıkları kaynakları boşaltırlar). Kodlamaya geçince ne dediğimi daha iyi anlatabileceğim sanırım. Windows bu mesaj trafiğini belirleyebilmek için iki tip queue (kuyruk) kullanıyor. Biri sistem kuyruğu ki bundan yalnızca bir tane bulunur, diğeri ise application queue (yazılım kuyuğu) ki her yazılımın kendine has kuyruğu bulunmaktadır. Kuyruk nedir kısaca onu anlatmak gerekirse, kuyrukları günlük hayatımızdaki gişe kuyruklarına benzetebiliriz. Kuyruğa yeni bir eleman geldiği zaman en sona girer ve sırası gelince çıkar yani FIFO (first in first out, ilk gelen ilk çıkar) kuralını uygular. Windows'a yeni bir emir geldiği zaman öncelikle sistemdeki kuyruğa atılır. Daha sonra işletim sistemi gelen emrin hangi uygulamaya geldiğini bulur ve bu emri o uygulamanın kuyruğuna atar. Daha sonra uygulama gelen emirleri mesaj çözücü bir fonksiyon yardımıyla çözer. Mesela kullanıcı bir tuşa bastığı zaman, tuş kodu ilk önce sistemin kuyruğunda bekletilir, sonra işletim sistemi hangi uygulama aktif durumda ise o uygulamanın kuyruğuna emri koyar, bundan sonrası uygulamanın kontrolündedir. Bu olay döngüsü Visual Basic'te, Delphi'de ve Windows üzerine yazılım geliştirilebilen her ortamda bulunmaktadır yani bir zorunluluktur. Belki diğer ortamlarda olayların akışı hakimiyeti programcıların elinden alınmış olabilir ama buda oyun geliştiricilerin neden C dilini kullandıklarını açıklar sanıyorum : ).

İsterseniz biraz kodlama yapmaya başlayalım ve öncelikle içi boş bir pencere oluşturup olay akışını kodlama bazında görmeye çalışalım. Bundan sonraki programlar için ihtiyacımız olabilecek minimum bir kod hazırlamaya çalıştım ve sanıyorum bundan sonraki çalışmaları bu kod içine gömerek yapacağız. Bu yüzden bu konu üzerinde biraz zaman ayırmakta fayda var.

Öncelikle Visual Studio'da nasıl yeni bir proje başlatabiliriz bunu görelim..

oyun_acilis.jpe


Resimde görüldüğü gibi projemizin adını yazıp yeni bir proje başlatıyoruz. Daha sonra sonraki ekranda ise empty project kısmını seçiyoruz.

oyun_acilis1.jpe


Artık yeni projemiz hazır kodlamaya geçebiliriz : ).

İçi boş bir pencere oluşturabilmek için yapacağımız işlemleri öncelikle gözden geçirelim. WNDCLASS yapısı sayesinde penceremizi oluşturacağımız sınıfı belirleyebiliriz. Aslında oyun programları genelde tek pencere içerdiği için bu yapıyı sadece bir pencere oluşturmak için kullanacağız..

Kod:
WNDCLASS wndWc;

wndWc.style             = CS_HREDRAW | CS_VREDRAW;
wndWc.lpfnWndProc       = (WNDPROC) WndProc;
wndWc.cbClsExtra        = 0;
wndWc.cbWndExtra        = 0;
wndWc.hInstance         = g_hInstance;
wndWc.hIcon             = NULL;
wndWc.hCursor           = LoadCursor(0, IDC_ARROW);
wndWc.hbrBackground	   = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndWc.lpszMenuName      = NULL;
wndWc.lpszClassName	   = "FirstWin32App";


İsterseniz elemanları tek tek inceleyelim.

style: Sınıfın tipini belirler. Biz burada CS_HREDRAW ve CS_VREDRAW flaglarini kullandık. Bunlar sayesinde penceremizin genişliğinde veya eninde değişiklik olursa penceremizin yeniden çizilmesi gerektiğini belirttik.

lpfnWndProc:
Programımıza gelecek olan mesajları çözmeye yarayacak olan fonksiyonun göstergesi. Daha öncede belirttiğim gibi Windows altında çalışan her program kendine gelen mesajları çözmekle yükümlüydü bu alanda bizim programımızın ana mesaj çözücü fonksiyonunu tutuyor.

cbClsExtra, cbWndExtra:
Genelde hep sıfırdır.

hInstance:
Program çalışırken Windows tarafından parametre olarak gönderilen kopya tutucusu (instance handler).

hIcon:
Simge. NULL olursa sistem sınıfa default bir simge atar.

hCursor:
Fare göstergesi

hbrBackground:
Pencerenin arka yüzeyini çizecek olan fırça tutucusu (handler to brush). Bu alan renk değerini de tutabilir.

lpszMenuName:
Pencereye ilişecek olan menu adı.

lpszClassName:
Sınıf adı.

Bu yapı tipini doldurduktan sonra sınıfımızı RegisterClass() fonksiyonunu kullanarak kayıt etmeliyiz.

Kod:
if( !RegisterClass(&wndWc) ) 
return false;

Bu fonksiyon parametre olarak doldurduğumuz yapı tipini alır ve başarısız olması durumunda sıfır (FALSE) döndürür. Sınıfı kayıt ettikten sonra bu sınıfı kullanan bir pencere oluşturabiliriz. Bu işlem için CreateWindow() fonksiyonunu kullanacağız

Bu fonksiyon parametre olarak doldurduğumuz yapı tipini alır ve başarısız olması durumunda sıfır (FALSE) döndürür. Sınıfı kayıt ettikten sonra bu sınıfı kullanan bir pencere oluşturabiliriz. Bu işlem için CreateWindow() fonksiyonunu kullanacağız.

Kod:
HWND CreateWindow(				
LPCTSTR lpClassName,  // kayıt yaptırmış sınıf adı
LPCTSTR lpWindowName, // pencere adı
DWORD dwStyle,        // pencere tipi
int x,                // pencerenin yatay pozisyonu
int y,                // pencerenin düşey pozisyonu
int nWidth,           // pencerenin genişliği
int nHeight,          // pencerenin yüksekliği
HWND hWndParent,      // ebeveyn(parent) pencere
HMENU hMenu,          // menu veya çocuk(child) pencere
HINSTANCE hInstance,  // program kopyası(instance)
LPVOID lpParam        
);




Platform Windows
Yasin HINISLIOĞLU

Yazacağımız oyunlar Windows platformu altında çalışacağından dolayı dilerseniz Windows programlarının yapısını inceleyelim.

Macar İmlası (Hungarian Notation)
Microsoft firması Windows'u yazarken geliştiricilerden biri olan Charles Simonyi değişken isimleri için özel bir teknik geliştirmiş. Bu tekniğin adı Hungarian Notation olarak geçiyor. Bu ismi almasının nedenlerinden biri değişkenlerin hem İngilizce'ye benzememesi (farklı bir dilde yazılmış gibi), hem de Simonyi'nin aslen Macar olmasıdır.

Bu tekniğin asıl kullanım amacı yazılan kodda kullanılan değişken isimlerinin belli bir standarda oturtulmasını sağlamak ve kodun okunabilirliğini artırmak. Böylelikle kodun akışı içerisinde değişken tipini bilmeyen başka bir programcı değişkenin başında kullanılan birkaç harfe bakarak değişkenin tipini öğrenebilir.

Kısaltma Veri Tipi Örnek
b boolean bool bProgramDurdumu
c karakter char cHarfNotu
str c++ String string strIsim
sz NULL sonlu dizi char szIsim[MAX_ISIM]
p pointer char *pToplam
i integer int iToplam
li long integer long liYildizSayisi
f floating point float fIvme
c Class class CSavasci
m_ member class int m_iInstanceNo
s static static char scHarf
g_ global HWND g_hwndMainWindowHandler


Ayrıca Windows'ta kullanılan her fonksiyonun baş harfi büyük harfle başlar ve devam eden kelimelerin baş harfleri de büyük harfle yazılır.

Ör.

IsIconic( .... )
ShowWindow( ... )
Daha sonraları her firma kendi imla stilini geliştirdiği için hungarian notation un birçok versiyonu bulunmaktadır ama yukarıdaki bilgiler Microsoft'un web sitesin alındığı için orijinali olarak kabul edilebilir.

WinAPI'ye Giriş:
 
Geçen ay söylediğimiz gibi yazacağımız oyunlar platform olarak Windows işletim sistemini İşe girişmeden önce Windows programlarının yapısını incelememiz gerekiyor. Windows programlarının Dos tabanlı programlardan oldukça farklı bir mimarisi var.

Peki Windows programları ile Dos programları arasındaki farklar nelerdir. Dos programlarından aynı anda yalnız bir tanesi sistem kaynaklarını kullanmaya yetkilidir, ama Windows programları kaynakları paylaşımlı olarak kullanırlar. Yani Windows altında her şey ortak kullanımdadır. Aynı anda iki program yazıcıya çıktı yollayabilir, dosta ise bu işe tek program yetkilidir. Ayrıca Windows programlarının hepsi grafik arabirimi kullanmak zorundadır. Windows programlarının donanım bilgisine ihtiyaçları yoktur herhangi bir aygıtı kullanmak istediklerinde Windows işletim sisteminden izin alarak kullanabilirler, fakat dos programları kullanacakları donanımın bilgisine sahip olmaları gerekir. Örnek vermek gerekirse dos tabanlı oyunları düşünelim, bu tür oyunlarda ekran kartlarına kesmeler oyun tarafından gönderiliyordu fakat Windows tabanlı oyunlarda ise program yapılacak işleri önce Windows'a veya ilgili birime (directx, opengl olabilir) bildirir ve Windows'ta ilgili aygıta istenen işlemi yönlendirir yani kontrol tamamen işletim sistemindedir. Belki çoğu insan Windows işletim sistemi pek sevmez, verdiği hatalardan dolayı ama bence dizayn ve esneklik açısından mükemmele yakın bir yapıya sahip.

Peki Windows'ta olaylar nasıl dönüyor. Windows Event-Based ( Olay Tabanlı ) bir işletim sistemidir. Windows'taki programlar Windows işletim sistemi ile mesajlaşmak yoluyla haberleşirler, aynı şekilde Windows'ta çalışan programlarla mesajlaşır. Mesela oturumu kapatmak istediğimiz zaman birkaç tane programın açık olduğunu varsayalım. Windows öncelikle bilgisayarı kapatabilmek için bu programları kapatmalıdır. Bu işi gerçekleştirebilmek için, kayıt yaptırmış bütün programlara kapama emri gönderir ve programlar kendi kendilerini kapatırlar (gereken hafıza alanlarını temizler ve kullandıkları kaynakları boşaltırlar). Kodlamaya geçince ne dediğimi daha iyi anlatabileceğim sanırım. Windows bu mesaj trafiğini belirleyebilmek için iki tip queue (kuyruk) kullanıyor. Biri sistem kuyruğu ki bundan yalnızca bir tane bulunur, diğeri ise application queue (yazılım kuyuğu) ki her yazılımın kendine has kuyruğu bulunmaktadır. Kuyruk nedir kısaca onu anlatmak gerekirse, kuyrukları günlük hayatımızdaki gişe kuyruklarına benzetebiliriz. Kuyruğa yeni bir eleman geldiği zaman en sona girer ve sırası gelince çıkar yani FIFO (first in first out, ilk gelen ilk çıkar) kuralını uygular. Windows'a yeni bir emir geldiği zaman öncelikle sistemdeki kuyruğa atılır. Daha sonra işletim sistemi gelen emrin hangi uygulamaya geldiğini bulur ve bu emri o uygulamanın kuyruğuna atar. Daha sonra uygulama gelen emirleri mesaj çözücü bir fonksiyon yardımıyla çözer. Mesela kullanıcı bir tuşa bastığı zaman, tuş kodu ilk önce sistemin kuyruğunda bekletilir, sonra işletim sistemi hangi uygulama aktif durumda ise o uygulamanın kuyruğuna emri koyar, bundan sonrası uygulamanın kontrolündedir. Bu olay döngüsü Visual Basic'te, Delphi'de ve Windows üzerine yazılım geliştirilebilen her ortamda bulunmaktadır yani bir zorunluluktur. Belki diğer ortamlarda olayların akışı hakimiyeti programcıların elinden alınmış olabilir ama buda oyun geliştiricilerin neden C dilini kullandıklarını açıklar sanıyorum : ).

İsterseniz biraz kodlama yapmaya başlayalım ve öncelikle içi boş bir pencere oluşturup olay akışını kodlama bazında görmeye çalışalım. Bundan sonraki programlar için ihtiyacımız olabilecek minimum bir kod hazırlamaya çalıştım ve sanıyorum bundan sonraki çalışmaları bu kod içine gömerek yapacağız. Bu yüzden bu konu üzerinde biraz zaman ayırmakta fayda var.

Öncelikle Visual Studio'da nasıl yeni bir proje başlatabiliriz bunu görelim.



Resimde görüldüğü gibi projemizin adını yazıp yeni bir proje başlatıyoruz. Daha sonra sonraki ekranda ise empty project kısmını seçiyoruz.



Artık yeni projemiz hazır kodlamaya geçebiliriz : ).

İçi boş bir pencere oluşturabilmek için yapacağımız işlemleri öncelikle gözden geçirelim. WNDCLASS yapısı sayesinde penceremizi oluşturacağımız sınıfı belirleyebiliriz. Aslında oyun programları genelde tek pencere içerdiği için bu yapıyı sadece bir pencere oluşturmak için kullanacağız.

WNDCLASS wndWc;

wndWc.style = CS_HREDRAW | CS_VREDRAW;
wndWc.lpfnWndProc = (WNDPROC) WndProc;
wndWc.cbClsExtra = 0;
wndWc.cbWndExtra = 0;
wndWc.hInstance = g_hInstance;
wndWc.hIcon = NULL;
wndWc.hCursor = LoadCursor(0, IDC_ARROW);
wndWc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndWc.lpszMenuName = NULL;
wndWc.lpszClassName = "FirstWin32App";

İsterseniz elemanları tek tek inceleyelim.

style: Sınıfın tipini belirler. Biz burada CS_HREDRAW ve CS_VREDRAW flaglarini kullandık. Bunlar sayesinde penceremizin genişliğinde veya eninde değişiklik olursa penceremizin yeniden çizilmesi gerektiğini belirttik.

lpfnWndProc:
Programımıza gelecek olan mesajları çözmeye yarayacak olan fonksiyonun göstergesi. Daha öncede belirttiğim gibi Windows altında çalışan her program kendine gelen mesajları çözmekle yükümlüydü bu alanda bizim programımızın ana mesaj çözücü fonksiyonunu tutuyor.

cbClsExtra, cbWndExtra:
Genelde hep sıfırdır.

hInstance:
Program çalışırken Windows tarafından parametre olarak gönderilen kopya tutucusu (instance handler).

hIcon:
Simge. NULL olursa sistem sınıfa default bir simge atar.

hCursor:
Fare göstergesi

hbrBackground:
Pencerenin arka yüzeyini çizecek olan fırça tutucusu (handler to brush). Bu alan renk değerini de tutabilir.

lpszMenuName:
Pencereye ilişecek olan menu adı.

lpszClassName:
Sınıf adı.

Bu yapı tipini doldurduktan sonra sınıfımızı RegisterClass() fonksiyonunu kullanarak kayıt etmeliyiz.

if( !RegisterClass(&wndWc) )
return false;
Bu fonksiyon parametre olarak doldurduğumuz yapı tipini alır ve başarısız olması durumunda sıfır (FALSE) döndürür. Sınıfı kayıt ettikten sonra bu sınıfı kullanan bir pencere oluşturabiliriz. Bu işlem için CreateWindow() fonksiyonunu kullanacağız

Bu fonksiyon parametre olarak doldurduğumuz yapı tipini alır ve başarısız olması durumunda sıfır (FALSE) döndürür. Sınıfı kayıt ettikten sonra bu sınıfı kullanan bir pencere oluşturabiliriz. Bu işlem için CreateWindow() fonksiyonunu kullanacağız.

HWND CreateWindow(
LPCTSTR lpClassName, // kayıt yaptırmış sınıf adı
LPCTSTR lpWindowName, // pencere adı
DWORD dwStyle, // pencere tipi
int x, // pencerenin yatay pozisyonu
int y, // pencerenin düşey pozisyonu
int nWidth, // pencerenin genişliği
int nHeight, // pencerenin yüksekliği
HWND hWndParent, // ebeveyn(parent) pencere
HMENU hMenu, // menu veya çocuk(child) pencere
HINSTANCE hInstance, // program kopyası(instance)
LPVOID lpParam
);
Fonksiyon başarılı olursa döndürdüğü değer yeni oluşturulan pencere tutucusu (window handle) olacaktır. Başarısız olursa FALSE döndürür. Burada biraz handle'lardan bahsetmek gerekli sanırım. Aslında handle lar göstergelere (pointerlara) benzetilebilir ama gösterge değillerdir. Genelde handle lar şu örnekle açıklanır. Çok lüks bir restoranda olduğunuzu farz edin, vestiyerde bekleyen elemana üzerinizdeki paltonuzu verirsiniz ve karşılığında size kupon benzeri bir şey verir. Siz bu kuponun içinde ne olduğunuz bilmek zorunda değilsiniz ama, bilirsiniz ki bunu geri verdiğiniz zaman paltonuzu geri alacaksınız. Aynı şekilde pencere (veya kontrol) oluşturduğunuz zaman Windows size handler verir. Bu handlerın ne olduğunu bilmek zorunda değilsiniz, ama bilirsiniz ki bunu Windows'a geri verdiğiniz zaman size gerekli işlemi yapacaktır. Mesela IsIconic() fonksiyonuna simge durumunda olup olmadığını öğrenmek istediğiniz pencerenin handle nı verirseniz pencerenin simge durumunda olup olmadığını öğrenebilirsiniz.

Penceremizi oluşturduk artık yapılması gereken şey pencereyi kullanıcıya göstermektir. Bunu da ShowWindow() fonksiyonu ile yaparız.

Kod:
ShowWindow(hWnd, SW_SHOW);
 
Programın initilization aşamasında yapılan işlemler bu kadar. Şimdi birazda programın yapısı ile ilgilenelim. Ana fonksiyon ve Mesaj çözücü fonksiyonu inceleyelim : ).

Önce ana fonksiyon

Ana fonksiyonun temel yapısı aşağıdaki şekildedir.

Kod:
int WINAPI WinMain(	HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
	MSG mMsg;

// WNDCLASS yapısı oluşturulur,
// pencere kayıt edilir,
// kullanıcıya gösterilir. Yani initilization
// aşamasında yapılacak işlemler bu kısımda
// halledilir.

	// Bu while loop bütün Windows programlarında
// vardır
	while( TRUE )
	{
		if(PeekMessage(&mMsg, 0, 0, 0, PM_REMOVE))
		{
		  if( mMsg.message == WM_QUIT )
			break;

			TranslateMessage(&mMsg);
			DispatchMessage(&mMsg);

		}
		else
{
		// oyunun render fonksiyonu bu
		// kısımda çağrılabilir
}
	}

	DestroyWindow(g_hWnd);
	return 0;
}

Bu döngüdeki her elemanı tek tek açıklamayacağım ama yapı olarak bundan sonra yazacağımız hemen bütün kodların ana fonksiyonu yukarıdaki gibi olacaktır.

Demiştik ki Windows altında çalışan her uygulama Windows tarafından gönderilen fonksiyonları çözmekle yükümlüdür. Peki bu mesajları yazdığımız program nasıl çözecek dilerseniz bunu inceleyelim. Yukarıda WNDCLASS yapısı içerisinde ki lpfnWndProc alana bir fonksiyon göstergesi göndermiştik. Bu fonksiyonun tanımı aşağıdaki şekilde olmalıdır,

Kod:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)

Bu fonksiyon program çalışırken ana döngüde bulunan DispatchMessage() fonksiyonu tarafından otomatik olarak çağrılır. Dilerseniz programa gelen mesajı nasıl çözeriz onu görelim. Programımızda aşağıdaki fonksiyona benzer bir fonksiyonu tanımlamamız gerekir. Bu fonksiyona mesaj ikinci parametre olarak gelir, ve mesajın taşıdığı veri tipi WPARAM ve LPARAM parametreleri ile taşınır. Mesela kullanıcı penceremiz üzerinde tuşa bastığı zaman ikinci parametre olarak tuşa basıldığı mesajı gönderilir ve WPARAM parametresi ise basılan tuşun karakter kodu fonksiyona gönderir. Mesajlar hakkında daha ayrıntılı bilgi için msdn'ye bakabilirsiniz, çünkü tanımlanmış gerçekten oldukça fazla (yüzden fazla) mesaj var buna ek olarak programcı uygulamaya has mesaj tanımlayıp onu da çözümleyebilir.

Kod:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)
{
	// gelen mesajın ne olduğunu ayırt et
	// ve ilgili mesajı çöz
	switch(uMessage)
	{
		// tuşa basıldı mesajı geldi
		// burada kullanıcının tuşa bastığı zaman
		// programın nasıl tepki vereceğini
		// belirtebiliriz
		case WM_KEYDOWN:
		{
			// hangi tuşa basılmış?
			switch (wParam)
			{
				// kullanıcı escape tuşuna basmış
				// programdan çık
				case VK_ESCAPE:
					PostQuitMessage(0);
					break;
			}
			break;
		}

		// programı kapama emri geldi
		// eğer hafızada yer ayrılmışsa
		// veya kullanılan kaynak varsa
		// hepsini boşalt		
		case WM_DESTROY:
		{
			PostQuitMessage(0);
			break;
		}

	}

	// bu fonksiyon pencereyi çizer, minimize, maximize
	// close düğmelerini vs. çizer. Yani standart bir
	// pencere çizer bize.
	return DefWindowProc(hWnd,uMessage,wParam,lParam);
	//return 1;
}


Evet, kodlama esnasında neler yapacağımız inceledik. Şimdi bu kodları pratiğe dökebiliriz. Aslında ben kaynak kod olarak yukarıda yaptığımız işlemleri yapan bir kod (C++ kullanarak yazılan CWinApp Sınıfının bulunduğu kaynak kodu da bulunuyor) koydum ama bu noktadan sonrası size kalmış. Sanıyorum bu kodlar üzerinde biraz çalışmak en azından yapıyı anlayabilmek için faydalı olacaktır.

SWinapp sınıfının bulunduğu kaynaq code

Fhistwin32app kaynaq code
 
SEPTAGH' Alıntı:
Hocam biraz yavaş git nefesimizi kstin yetişemiyoruz.Birini bitirmeden bi bakıyorum 3 konu daha.Çizim masası karşımda hala yatıyo.Dokunamadım bile.:)En iyisi arşive atıp evde sakin kafa ile okumak.Yoksa işten atılacam:)


pardon ya yeni gördünm (fazla qaptırmısm heralde ondan) saol ;) bencede ole yap yoqsa qafan bi dünya olr 2 dq da :D
 
Grafik Programlama..!!

Directx programlamaya dalmadan önce grafik programlama hakkında birkaç şey yazmak istiyorum. İki boyutlu grafik kartları nokta bazlı işlem yaparlar. Yani ekrandaki her noktanın renk değeri ekran kartına gönderilir ve gönderilen renk değerleri kullanılarak ekran kartı tarafından çizim işlemi yapılır. Bu yüzden ekran kartını iki boyutlu bir dizi (array) olarak düşünmek yapacağımız işlemleri kolaylıkla kafamızda canlandırmada yardımcı olacaktır. Tabi bu iki boyutlu diziye yazma işlemleri lineer olarak yapılacaktır.

Array.gif


Yukarıdaki resimde de görülebileceği gibi bu dizinin her elemanı bir noktayı (pixel) temsil etmektedir ve basit bir resmi ekran kartımıza aşağıdaki resimde görüldüğü biçimde çizebiliriz.

Smiley.gif


Yukarıdaki resimde de görülebileceği gibi gülen suratımızı oluşturan noktalar siyaha boyanmıştır. Bu şekilde daha karmaşık resimleri çizebiliriz.

Dizinin elemanları çizilecek noktaların renk değerlerini tutacaktır. Programımızda bu diziyi aşağıdaki şekilde tanıtabiliriz

Kod:
unsigned char ekran[600][800]; //unsigned char 8 bit veri tutar 
                                //buda max. 256 renk değeri tutabilir.

Not: Directx'te bu işleri yapan "surface"ler vardır

Ekrandaki herhangi bir köşesinin renk değerini değişmek içinse bu dizinin elemanlarını değişmemiz yeterli olacaktır. Örnek olarak ekran[13][25] = 5 gibi bir satır yazarsak ekranın x:25 y:13 noktasında bulunan noktanın rengini 5 numaralı renge boyamış oluruz (renkler hakkında daha detaylı bilgiyi yazının ilerleyen kısımlarında bulabilirsiniz). Biz directx'ten ekran kartı için bir gösterge isteyeceğiz ve gelen bu göstergeyi kullanarak ekran kartına gerek dosyadan gerekse ilgili fonksiyonları çağırarak resimler ve şekiller çizebileceğiz. Ekran kartına lineer olarak ulaşacağımızı söyledik biraz da bu konu üzerinde duralım.

Linear.gif


Dizimiz hafızada yukarıdaki şekilde tutulur. Yani 800x600 çözünürlükte çalıştığımızı düşünelim. Bu dizi (800x600) hafızada yan yana dizilir, ilk önce ilk satırın 800 adet noktası sonra ikinci satırın 800 adet noktası sonra üçüncü satırın böylelikle 600 satırın noktası yan yana dizilmiş olur. Peki herhangi bir noktaya ulaşmak istediğimizde ne yaparız. Dilerseniz örnek bir fonksiyonla olayı açıklayalım

Kod:
// Globaller 
int g_iScreenWidth = 800;
int g_iScreenHeight = 600;

bool PutPixel(int x, int y,UCHAR *ekran,UCHAR renk )
{
if( NULL == ekran )
return false;

*(ekran + ( x + (y*iScreenHeight) )) = renk;

return true;
}

Lineer olan diziye yukarıdaki şekilde ulaşabiliriz.

Peki ekran kartları grafikleri nasıl depolar. İki boyutlu işlem yapan ekran kartları daha önceleri farklı bir programda çizilmiş resimleri depolayabilir. Ekran kartları üzerindeki hafıza alanları "ram" ler tam olarak bu işe yararlar. Bu işlem için ana kart üzerindeki hafıza alanları da kullanılabilir bu tavsiye edilmez. Çünkü verinin hafızadan alınıp ekran kartı üzerine yazılması işlemciyi yoracaktır ve FPS (frame per second "saniyede çizilen kare otomatik olarak düşecektir"). 640x480 nokta ve 16 bit renk derinliğinde bir resmi hafızada tutabilmek için 614.400 byte yere ihtiyaç duyulur. Bu sayıyı nasıl hesapladık; bir nokta için 2 byte (yani 16 bit) yere ihtiyaç duyarız. Ekranımızda 640x480 tane nokta olacaktır yani 640x480x2 bize gerekli hafıza yerini verir. Tabi her seferinde (çünkü ekranı tazeleyebilmek için bir döngü kuracağız ve bu döngü içerisinde her seferde ekran kartına çizim yapılacak) 614.400 byte lık veriyi hafızadan alıp ekran kartına yazmak işlemciyi çok meşgul edecektir. Bu durumda ekran kartı üzerindeki hafıza alanlarını kullanmak işlemi hızlandırır çünkü ekran kartları çizim işlemini yaparken kendi hafızasından veriyi alıp kendi işlemcisinde işleyecektir ama eğer sistemdeki hafıza kullanılsaydı veri önce hafızadan işlemciye oradan ekran kartına gönderilecekti bu işlem bir önceki işleme göre oldukça yavaş çalışmaktadır. Aşağıdaki tabloda farklı çözünürlükler ve gereken hafıza alanları gösterilmiştir.

cozunurluk.gif


Tabloda görülebileceği gibi renk derinliği ve çözünürlük arttıkça gereken hafıza alanı da ciddi bir biçimde artıyor.

Birazda page flipping hakkında konuşalım. Çoğu grafik uygulaması (tam ekran kullanan) page flipping denilen bir yöntem kullanırlar. Ekranda grafikleri bize gösteren elektron tabancası sol üst köşeden başlamak suretiyle satır satır her noktayı çizer ve işlemini bitirdiği noktada sağ alt köşeye ulaşmış olur. Bir sonraki çizimi yapabilmek için tekrardan sol üst köşeye dönecektir (refresh rate, bu elektron tabancasının hızını belirler ve ne kadar hızlı çalışırsa o kadar az titreşimli ve net bir görüntü elde edilir). Tam bu dönüş esnasında eğer yeni bir çizim emri gönderilirse görüntü parçalanır.
 
flip2.jpe


kaymış görüntü

flip1.jpe


Bu işlemi önlemek için page flipping denilen yöntem kullanılır. Yani aslında bir tane olması gereken ana diziye bir ikinci eklenir (double buffering). Yapılacak çizimlerin hepsi bu ikinci diziye yapılır. Sonra çizim aşamasında yapılacak çizimler bu ikinci diziye ( ileride yüzey yani surface olarak kullanacağımız alanlar ) yapılır. Böylelikle olmasını istemediğimiz olaylar engellenmiş olur.

Renkler hakkında konuşalım birazda. Bilgisayarımızda 8bit, 16bit, 32 bit renkleri çizebiliriz. Her renk sistemi sırasıyla 256, 65536, 16M farklı renk çizilebilir. (32 bit renk derinliklerinde 1 byte alfa kanalı olarak saklanır). Bu renk sistemleri içerisinde en hızlı işlem yapılacak olan 8 bit renktir. Çünkü hafızada en az yer tutan renk sistemi budur. Bu renk sistemi renk paleti içerir (CLUT). Yani RGB(kırmızı, yeşil, mavi) renkler farklı bir tabloda tutulur ve bu tablonun indisi ekran kartına yazılır. Bu renk sisteminde maksimum 256 renk depolayabiliriz.

Clut.gif


Mesela tablonun 0.elemanında bulunan rengin değeri 255,0,0 (kırmızı) olsun. Ekran kartının herhangi bir noktasını kırmızıya boyayabilmek için 0 rengini koymamız gerekli olacaktır. Çalışma aşamasında ekran kartı 0 numaralı rengi çizerken bu tabloya bakacaktır ve karşılığındaki renk değerini ekrana yazacaktır. Bu renk tablosu çalışma aşamasında da değişebileceği için oyun programcıları tarafından oldukça sık kullanılmaktadır. Bu tablodaki renk değerleri ile oynanılarak farklı animasyonlar oluşturulabilir.

32 bit sistemlerde her byte bir rengin değerini tutar. Yani elimizde 4 byte var bunlar sırasıyla Alfa, Kırmızı, Yeşil ve Mavi değerlerini tutarlar. Bu sistemde her rengin 28 farklı tonu olacaktır.

16 bit sistemleri iki farklı şekilde inceleriz (555,565). Ekran kartlarının bir kısmı 555 sistemini, bir kısmı ise 565 sistemini kullanır. Yazacağımız programların farklı bilgisayarlarda doğru çalışabilmesini sağlayabilmek için bu her iki renk sisteminin destekleyecek türden kodlar yazmamız gerekmektedir. Dilerseniz daha ayrıntılı inceleyelim. 16 bit sistemlerde elimizde 2 byte vardır ve elimizdeki üç rengi bu byte ın içine sığdırmamız gereklidir. Bunu iki farklı şekilde yapabiliriz. Birincisi ilk 5 bite kırmızı, sonraki 5 bite yeşil, sonraki 5 bite mavi değerlerini yazarak. İkincisi ilk 5 bite kırmızı, sonraki 6 bite yeşil ve sonraki 5 bite mavi değerleri yazarak. Farklı biçimlerde yapılabilir ama ancak yukarıdaki 555,565 sistemleri ekran kartları tarafından desteklenmektedir. 565 sisteminde ekstra bir bit yeşil rengi için ayrılmıştır çünkü insan gözü yeşil renginin tonlarına daha duyarlıdır. Aşağıdaki resimde renk değerlerinin yerleştiriliş şekli gösteriliyor

bitorder.gif
 
Birazda şeffaflık üzerine konuşalım dilerseniz. Grafik uygulamaları (özellikle oyunlar) yazılırken sinemada mavi perde denilen sistemin temelini oluşturan teknik kullanılır. İki boyutlu ekran kartları sadece dikdörtgen şeklindeki grafikler üzerinde işlem yapabilir.

oyun1.bmp


ekran kartı bu resmi sol, üst köşeden başlayarak çizecektir

oyun2.bmp


aslında çizeceğimiz grafik yukarıdaki şekilde kenarları kıvrımlı olabilir ve oyunlarda kullanılacak karakterlerin hemen hepsinin kenarları böyle detaylıdır.

Fakat oyunlarda kullanılacak grafikler dikdörtgenlerden oluşmayabilir. Kenarları yuvarlak farklı şekilde grafikler olabilir bu tip durumlarda şeffaflık devreye girer. Belli bir kısmını şeffaf yapmak istediğimiz grafiklerin belirli bölümlerini sabit bir renge boyarız. Bu sabit renk (mesela r:255, g:50, b:255) resim ekran kartına gönderilirken çizilmez. Yani ekran kartının o noktasında daha önceden hangi renk değeri varsa bu değer korunmuş olur. Böylelikle resmin belli bir kısmını şeffaf yapmış oluruz. Bu durum aşağıdaki resimlerde daha net incelenebilir.


alien.jpe

izometrik.jpe


Bu yazıda en son olarak bmp dosyalarının yapısını inceleyeceğiz. Böylelikle aslında bmp olan resim dosyasını daha sonraları kendi formatımıza çevirebilen fonksiyonlar yazabiliriz.

BMP resim dosyaları ham resmi içerir ve herhangi bir sıkıştırma işlemi uygulanmamıştır. Her noktanın renk değeri dosyaya yazılır. BMP dosyaları 1,4,8,24 bit renk derinliğinde olabilir.

1,4, ve 8 bit renk derinliğine sahip dosyaların renk paleti bulunur. 24 bit renk derinliğine sahip resimler ise doğrudan renk değerini tutarlar (yani her pixel için 3byte ve her byteta sırasıyla kırmızı, mavi, yeşil renkleri bulunur). Her dosyada dosya başlığı bulunur. Dosya başlığındaki her elemanın uzunluğu ve açıklaması aşağıdaki tabloda verilmiştir.
 
ofset1.gif


Bu başlıktan sonra BITMAPINFOHEADER başlığı gelir

ofset2.gif


Bu tabloda en önemli eleman bmiColors elemanıdır. Bu eleman renk paletini tutar ve renk paletinin uzunluğuda kullanılan renklerin sayısı kadardır. Bu tablonun açıklaması aşağıdaki şekildedir.

ofset3.gif


24-bit renkler renk paleti kullanmazlar. Erkan Varel ve Ekrem Alptekin arkadaşlarımla beraber hazırladığımız bir programda bu ve benzeri teknikleri kullanmıştık. İsteyenler projenin web sitesinden (http://www.ctp.bilkent.edu.tr/~alien) kaynak kodlarını ve programı bulabilirler.
 
Oyun Programlamaya Giriş..!!

Oyun Programlamaya Giriş..!!
Selam, oyun programlama hakkındaki yazı dizimize geçmeden önce bazı konulara açıklık getirmek gerektiğini düşünüyorum. Neden oyun programlama konusunda kendinizi geliştirmek istiyorsunuz ? Bu bir hobi mi ? Yoksa ileride gerçekten büyük bir oyun firmasına mı girmek istiyorsunuz ? Belki de kendi başınıza oyun çıkarmak, hatta kendi oyun şirketinizi kurmak istiyorsunuz.

Aslına bakarsanız yukarıda bahsedilen sorular bir oyun programcısının adımlarıdır. İlk başta hobi olarak başlayan bu serüven az buçuk öğrendiği programlama diliyle ve onun sağlamış olduğu grafik kütüphanesi ile oyun yazmaya çalışırak başlar ve basamakları teker teker çıkarak yoluna devam eder. Şu anda üzerinde duracağım konunun ne hobi, ne de oyun firması kurmak ile ilgisi yok. Bu yazı dizisindeki yazılar daha çok bir oyun firmasında çalışmak isteyen oyun programcısının kendisini geliştirebilmesi için yazılmıştır.

İlkin gelin piyasadaki oyun firmalarının işe alacakları programcıların hangi niteliklere sahip kişiler olması gerektiğini inceleyelim.

PROGRAMMERS, THIEF 3 & DEUS EX 2 JOB DESCRIPTION:
Must have demonstrable experience in some or all of the following:

A degree in Computer Science or Software Engineering or equivalent industry experience
The ability to meet or exceed established milestones
Game UI
Gameplay mechanics
Game AI or Physics
Console programming experience is a plus
Programmer/Senior Programmer
We have several exciting positions open for programmers with at least 2 years of professional game coding experience. You must be an expert in designing and writing optimized C/C++ game code, and must have the coding talent and experience to produce fun gameplay with that extra polish that makes a game great. We're especially interested in people who have experience in:

Character implementation
Next-gen special effects
Split-screen multiplayer gameplay
Physics
Gameplay for assorted mini-games and bosses
GAME PROGRAMMER
We're looking for candidates who are passionate about developing high-quality games, and who have a strong desire to work in a team environment. If you have the requirements listed above and are longing to be part of an extremely talented and synergistic game development team, send us your resume and code samples today!

İndividuals will be responsible for a variety of programming tasks on the project including AI, engine, tools, visual special effects, character and camera control, and Python scripting. The ideal candidate will have at least 3-4 years of game industry experience and be proficient in C++. Prior PS 1 or 2, Gamecube, or Xbox experience helpful, but PC programming is acceptable. Strong math background a plus, along with someone who can blend the visual creative aspects with the programming. Prior experience in any of the following is also helpful: Physics, AI, Collisions system, engine programming, PS2 Microcode, Maya plugins, miscellaneous tools, special effects, character and camera control, Python scripting language, and real time cut scene generation.

Programmers/Senior Programmers
We have a number of exciting opportunities for experienced programmers. We're especially interested in people with complex/advanced animation experience, (rendering/processing/sequencing).

The ideal candidate will have:

2+ years of game programming experience, or a distinguished college course list in relevant fields.
A minimum of 1 completed game, (or graphical/interactive related), project.
Proficient in C/C++.
Good oral communication.
Able to work with a bare minimum of supervision or management.
Must be able to work in a team atmosphere with schedules and reliable milestone delivery.
Bonus Skills:

Experience with cross-platform development.
Low level assembly experience, (80x86, MIPs or VU code).
DirectX 8.0 experience.
Advanced animation, processing, rendering or sequencing.
Proven technical expertise on either Xbox or PS2.
Yukarıda incelediğimiz iş ilanları, şirketten şirkete ve yapılacak oyuna göre değişsede ortak olan çekirdek konuları çıkartabiliriz. Bunları aşağıda listeledim.

Oyunları ve oyun oynamayı sevmek
C/C++ Programlama Dili (İleri düzeyde)
İyi derecede Matematik bilmesi
Oyun Mekanizması, Bilgisayar Grafikleri, Yapay Zeka ve Müzik Programlama
OpenGL veya DirectX gibi Apileri kullanabilme
Yazılım Mühendisliği ve Proje Yönetimi hakkında bilgi sahibi olma.
Bunlardan ilk üçü ile hiç ilgilenmiyeceğiz. Çünkü oyun oynamayı sevmek, zaten kişinin doğuşundan gelen bir özellik, ikinci ve üçüncü konular ise lise, üniversite eğitimi veya özel ilgi ile elde edilebilecek özelliklerin olması. Bu açıklamalarıda yaptıktan sonra artık yazı dizimizin hangi başlıklar altında ve hangi formatta verileceği hakkında bilgi verebiliriz.

Oyun Programlama -1 (2D Oyun Programlama)
Oyun Mekanizması: Bu yazı bölümümüzde basit bir oyun programı yazarak oyun mekanizmasını ve alt parçalarının nasıl çalıştığını yakından izleyebilme imkanı bulacağız. Geliştireceğimiz oyun Tetris.

tetris.jpe


Input ve Windowing İşlemleri: Bu kısımda ne kadar win32 Apisi kullanım gereksinimi gözüksede başlangıç için ben bu apinin ağır olduğunu düşünüyorum. Bu kısımda kısaca Glut (OpenGL Library Utility Toolkit) Api'sinin kullanımını aktaracağım. Pencere oluşturumu, keyboard ve mouse girişlerini dinleme, oyun döngüsü oluşturma hakkında ayrıntılı örnekler sunacağım.

Bilgisayar Grafikleri-1: Bu yazımızda bilgisayar grafikleri nedir? OpenGL nedir ? OpenGL terimler sözlüğü, OpenGL'de 2D Çizim Yapabilmek için kamera ve projeksiyon ortamının hazırlanması, 2D Primitiflerin çizimi, 2D Kaplamaların çizimi, 2D Dönüşümler, 2D Animasyon(Sprite), 2D Oyunlarda Arkaplan Programlama, 2D Font gibi konular örnekler ile açıklanacaktır.

Bilgisayar Müzikleri-1: Bu yazımızda Fmod müzik apisinin nasıl kullanıldığı ve oyun içerisinde nasıl kullanılacağı üzerinde duracağız.

Yapay Zeka: Pacman veya Bomberman gibi basit oyunlarda kullanılan yapay zeka programlarının mantığı ve oyun içerisinde nasıl kullanımı anlatılacaktır.

Kaynakların Oluşturulması: Bu yazımızda oyun için gerekli olan resim, animasyon, ses ve müzik dosyalarının nasıl oluşturulacağı üzerinde duracağız. Alt düzeyde Lightwave, Photoshop kullanımı aktarılacaktır.

Örnek Oyunların Programlanması: Snake, Breakout, Pacman, Bomberman, ve SpaceCombat oyunları programlanacaktır.

Daha sonraki bölümlerde real-time strateji, 3D oyunlar ve 3D oyun motoru hakkında bilgiler verilecek ama şimdiden bu bölümlerin ayrıntılandırmasını yapmadım. Zaten basamakları teker teker çıkmalıyız değimli.

gene dayana madm bunu da atimde bu günlüq son :p gece görüşürüz..
 
ya adamlar gerçek ötesi oyunlar yapıyo biz de pusu yaptık diye seviniyoruz. 2005 olmasına rağmen pusuda ağızlar oynamıyo
 
yaw bende c++ vbasic 3 senedir kullanıyom ama bu konu aştı beni walla süper yazıyon da biraz daha anlaşılır olsa seviye insen neyse yazmışsın çok saol
 
Geri
Üst