C# GDI+ ile 2D Oyun Yapımı
Project (with Source Code) : -
Oyun menü ile başlar menüde oyunumuzun hikâyesinin
nasıl başladığı kayan bir animasyonla anlatılmaktadır. Herhangi bir tuşa
bastığınızda animasyon sonra erer ve menü ekranı gelir. Oyuna başla butonuna
basarak oyuna başlayabilirsiniz.
Projenin Amacı
C# GDI+ ile bir oyun
tasarlamak ve bu oyun arkaplan, arayüz, senaryo, resim, animasyon vs.
özelliklere sahip olmalıdır. Bu amaç çerçevesinde “Yanan Adamı Söndür” adlı bir
oyun geliştirilmiştir. Projede Drawing metotları ve kimi resimler karakter ve arkaplan olarak
kullanılmış ve bu karakterler anime edilmiştir.
Tasarımı, Veri Yapıları, Sınıf
ve Metotlar
Öncelikle label, picturebox, button
ve timer controlleri yardımıyla bir ana menü oluşturulmuştur.
Daha sonra aşağıdaki örnekte
görüldüğü gibi bölümlerin haritasını oluşturmak için iki boyutlu (20*13) bir
matris dizisi kullanılmıştır.
public int[,] lab10 =
{
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,7,7,7,0,0,0,1,1,0,0,0,1,0,0,1,0,0,0,1 },
{ 1,7,0,0,0,1,1,1,0,0,0,1,0,0,0,1,3,1,0,1 },
{ 1,0,0,1,1,1,1,1,0,0,0,1,0,1,0,1,1,1,0,1 },
{ 1,6,1,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1 },
{ 1,0,0,9,1,0,1,0,1,0,9,1,0,0,1,1,1,1,1,1 },
{ 1,1,0,0,1,6,1,0,0,1,0,1,1,0,0,0,0,0,0,1 },
{ 1,5,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1,1,1,1,1 },
{ 1,0,1,0,0,1,0,1,0,0,0,1,1,1,1,3,0,0,0,1 },
{ 1,0,1,0,0,0,0,1,1,1,0,1,5,8,1,1,1,9,0,1 },
{ 1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }
};
Bu matris oyunun 10. Bölümünü temsil
etmektedir. Matris içindeki sayıların anlamı aşağıdaki gibidir:
1: Duvarlar (İçinden geçilemez)
2: Dış arka plan görüntüsü ( Oyunun
oynandığı kısım haricini oluşturmaktadır.)
3: Anahtar ( Kapıların açılmasını
sağlar)
4: Can İksiri ( Canımızı 10 sn
arttırır.)
5: Elmas ( 300 Altın kazandırır.)
6: Kapı ( Anahtar olmadan açılmaz.)
7: Su ( Karakterimizi ulaştırmaya
çalıştırdığımız hedef, karakterimiz söner ve bölüm sona erer.)
8: Kasa ( 500 Altın kazandırır.)
9: Yaratık ( Canımızı azaltır fakat
300 Altın kazanmamızı sağlar.)
Matris dolaşılır ve koordinatın sahip olduğu değere
göre form üzerine bloklar çizilir.
Veri Yapıları:
public int[,] lab
Tüm çizim işlemleri LabirentData
classında yer alan bu iki boyutlu matrisin sahip olduğu değerlere göre
yapılmaktadır. Etkileşimler sonucunda bu değerler değişebilmektedir.
Classlar:
LabirentData1: Bölüm bilgilerinin
yer aldığı sınıf
Oyuncu: Oyuncunun koordinatlarının tutulduğu sınıf
Wizard: Büyücünün koordinatlarının tutulduğu sınıf
Menu (Form Class) : Oyunun açılış ekranı
Form1 (Form Class) : Oyunun bulunduğu form
Metotlar:
public void Move(int deger):
Karakterimizin hareketlerinin gerçekleştirilmesini
sağlayan metot karakterin adım atacaı her konumda karşılaştığı degree gore
yapılması gereken işlem bu metot ile belirlenmektedir.
Paint: Haritanın çizildiği metot
KeyPress: Bölümün başlaması için
gereken ‘S’ tuşuna basılıp basılmadığını kontrol eden metot
Timer1_Tick: Karakterimizin canının
azalmasını sağlayan metot. ProgressBarın değerinin azaltılmasını sağlar.
ProgressBar sıfır değerine sahip olduğunda karakterimiz ölür.
KeyDown: Karakterimizin hareketini
sağlayan yön tuşlarını kontrol eden metot.
Timer2_Tick: Büyücünün uzaklaşmasını
sağlayan metot.
Timer3_Tick: Yaratıkların rastgele
hareket etmesini sağlayan algoritmayı barındıran metot.
İşletimi ve Ekran Görüntüleri
Resimde de görüldüğü gibi karakterimiz bir büyücünün
saldırına uğrar. Karakterimiz yanmaya başlar fakat sorun şudur ki bu büyü karakterimizi
öldürmez sadece acı çekmesine neden olur. Bu da yetmezmiş gibi bizi yer altının
en zorlu zindanlarından birine yollar. Bizim amacımızda bir yandan karşımıza
çıkan ganimetleri toplamak ve bir yandan da anahtarları elde ederek kilitli
kapılar ardındaki suyun içine ulaşmaktır. Suya ulaştığımızda karakterimiz söner
ve bir sonraki bölüme geçme şansını elde ederiz. Her bölümde kullanıcıya
dinlenme şansı tanımak için ‘S’ tuşuna basmadan oyun başlamamaktadır.
Oyuna başla butonuna bastığınızda oyunun içinde
bulunduğu forma geçiş yaparsınız. İlk bölüm direk karışınıza gelir. Oyun
levelleri üst kısımda çizilir ve karakterimizin özellikleri formun alt kısmında
gösterilmektedir. Health barı karakterimizin canını temsil etmektedir,
karakterimiz yandığı için canı sürekli azalmaktadır. Amacımız canı bitmeden
önce suya ulaşmak ve karakterimizi söndürmektir. Oyunda kaşımıza iksirler de
çıkabilmektedir bu iksirler sayesinde bir miktar da olsa canının artmasını
sağlamaktadır. Fakat büyücü bu kadar kolay vazgeçmez karakterimiz tam
kurtulduğunu sanarken karşısına tekrar çıkar ve bir daha saldırır. Oyun sonuna
kadar bu böyle devam eder. Alt menüdeki bir diğer değer de anahtar’dır
haritadaki anahtarlara ulaşarak bu değeri arttırabiliriz. Anahtarlar bizim
kilitli kapıları açmamızı sağlar. Anahtarımız olmadan kapılardan geçemeyiz. Son
değerimiz de altın değeridir. Oyun boyunca karşımıza çıkan elmaslardan ve
kasalardan altın kazanmaktayız. Bir diğer altın kaynağı da bizim ölümümüzü
hızlandırmak isteyen büyücünün yollarımızın üzerine yerleştirdiği
canavarlardır. Bu canavarlar canımızı azaltırlar fakat onları yaktıktan sonra
bir miktar ganimet toplama şansı bulabliririz.
Karakterimizi suya ulaştıramadan canı biterse karakterimiz ölür. Fakat karakterimizin bu hazin sona acıyan Tanrı’lar onu tekrar canlandırırlar ve canını kurtarabilmesi için bir şans daha tanırlar.
5000 Altına karşılığında yolda karşımıza çıkan iyi kalpli başka bir büyücü canımızı arttırma talebinde bulunur. Canın paradan önemli olduğunu düşünüyorsanız bu teklifi kabul etmeniz sizin yararınıza olacaktır.
Oyun 10 bölümden oluşmaktadır. 10 bölüm sonunda artık büyücü şövalyemizle uğraşmaktan vazgeçer ve şövalyemiz de kazandığı altınlarla mutlu bir yaşam sürmeye devam eder.
CAPS
Yorumlar
Yorum Gönder