C# GDI+ ile 2D Oyun Yapımı

Project (with Source Code) : -

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

            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.


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

Bu blogdaki popüler yayınlar

String Matching - Boyer-Moore Algorithm

String Matching - Brute Force

String Matching - Horspool's Algorithm