Video Oyunu Yazarken Nelere Dikkat Edilmeli Bölüm 2

Selamlar;

Aşağıda geçen hafta bahsettiğim BoMan oyununun oynanış videosu bulunmaktadır. Umarım sizde benim kadar keyif alırsınız.

İsterseniz geçen makalede anlattığım BoMan oyununun kodlamasından bahsedelim. Öncelikle karakterimizi hareket ettirelim.

  • Hareketten önce basılan tuşlar kontrol edilir.

  • Eğer yön tuşlarından birine basılmış ise  yürüme sesi çıkarılıp ben bu uygulamada özel bir ses dosyası olan tonysound.cs kullandım ilgili hareket işlemine başlanır.

  • Hareket sırasında oyundaki tüm bölümlere ait çıkış kordinatları ile kahramanımızın kordinatları konrol edilip bir sonraki level’e ilgili özellikler ile birlikte geçilip geçilmediğine bakılır. İlgili özelliklerden kasıt toplanan taş, para, hak ve özellik sayılarıdır.

  • Nitor’ya basılıp basılmadığı yani (shift tuşu) bakılarak hareket aralığı buna göre aşağıda görüldüğü gibi belirlenir. Ayrıca Kyle özelliği alınınca da hareket hızı aynı nitrodaki gibi arttırılmaktadır.

gameover

  • Yapılan hareketin yönüne göre tüm yaratıklar tek tek gezilerek yakınlarda yartık varmı diye bakılır. Varmı() methodu Path.cs altında tanımlı başka bir method’dur. Yakınlık derecesine göre ya takip işlemine başlanır ya da yaratığa dokunulmuş ise hem oyun başa döner hem de hakkımız -1 azalır. Eğer hiç hak kalmamış ise geri sayan bir ekranla karşılaşırız. Takip işlemine Path.cs’deki TakipVarmi() function’ı ile yapılır. İlgili kod aşağıdadır. TakipVarmı()’da kasıt BoMan yaratıklardan birine belirli bir mesafe yaklaşınca yaratık tarafından kovalanır. İşte belirlenen meseafeye gelinmiş mi diye bakılan method TakipVarmi() methodudur.
  • Path.cs’deki Varmı() function’ile hareket yapılınca taşlara gelinmiş ise taş yenir ve para 10 Tl artar. Ayrıca tüm taşlar yenmiş mi diye kotrol edilir. Tüm taşlar yenmiş ise çıkış kapısı açılır. Ayrıca gazlı bir içecek içilirse nitro özelliği dolar. İlgili kod aşağıdadır.
  • Yapılan hareketin ardından tüm buttonlar gezilerek, burada buttonlar duvarlar manasına geliyor; ilgili hareketi duvarların sınırları içinde yapılıp yapılmadığına kısaca herhangi bir duvar engeli olup olmadığına bakılır.

Level2

  • Yukarıdaki örnekte de görüldüğü gibi tüm yaratıklar önceden tanımlanan Timer ile belli bir alan içinde random olarak hareket ederler. Yaratıkların duvarları geçememesi ve kendilerine bellirlenen alanı geçmiş ise mesela takip anında tekrardan eski yerlerine dönmeleri Direction.cs’deki aşırı yüklenmiş diğer bir Move() methodu ile yapılır.
  • Canavarların her timer anında kendi sınırlarında olup olmadıkları değiller ise kendi sınırlarına gitmelerini Direcition.cs’deki Boundery() Move() method’u ile birlikte sağlamaktadır. Tüm levellerdeki yaratıkların sınırları bu method içinde tanımlıdır. İlgili kodlar aşağıdadır.

  • Levellar arasında haklar, para, toplanan taşlar ve özellik sayıları constructer’a parametreler atanarak aşağıda görüldüğü gibi atılmaktadır.

  •  Yaratık ‘da takip yoksa ve sınırı aşmamış ise yani kendisine belirlenen alan içinde ise, random hareketi aşağıda görüldüğü gibi önce random yön belirlenir, daha sonra Direction’daki Move() methodu ilgili parametreler ile aşağıda görüldüğü gibi çağrılır.

  • Eğer sınırı aşmış ise nitro açık bir şekilde kendisine belirlenen alana yine Direction.cs’deki Move() methodu ile hızlıca aşağıda görüldüğü gibi döner.

  •  Eğer yaratık için takip var ise BoMan’e X veya Y ekseninde random olarak nitro olmadan yaklaşılır. Yaklaşma komutu gene Direction.cs’deki Move() komutudur.

Tüm yukarıda bahsedilen bu işlemler bütün bölümlerdeki yaratıklar için geçerlidir.

Direction.cs (Boundery()) : Tüm levellerdeki yaratıklar için kendilerinen atanan lokasyonda olup olmadıkları aşağıdaki kod ile bakılır.

Direction.cs( Move()) : BoMan için geçerli hareket komutlarının ve ilgili hareket sırasında gerekli kontrollerin yapıldığı kodlar aşağıdaki gibidir.

Direction.cs(Move()): Yaratıklar için olan bu hareket komutlarının tanımlamdığı kısm aşağıda görüldüğü gibidir.

Path.cs (TakipVarmi()): Yaratıkların BoMa’e belli bir mesefe kadar yaklaşıp  takip sınırları içine girip girmediği aşağıdaki kodlar ile check edilir.

Path.cs (Varmi()):

form3

  • Form’larda yani bölümler geçilince çıkan ara ekranlarda para ile taş ve taş ile de özellik alınmaktadır. Örnek kod aşağıda görülmektedir. Bu örnek de diğer formlar ile aynı mantıkda çalışmaktadır.

Form3.cs: Tüm tanımlamalar ve InitializeComponent içerisi kodun rahat okunması için temizlenmiştir.

level1

 Level1.cs: Öncelikle  BoMan diğer 3 yaratık, toplanması gereken mavi taşlar , kırmızı taşlar, duvarlar ve giriş çıkış kapıları nesneleri tanımlanır. 6 tane timer tanımlıdır. Timer ve Timer2 nitronun zamanla artıp azalması için tanımlanmıştır. Timer3 oyun başlarken ki geri sayım amaçlı kullanılır. Timer4,Timer5 ve Timer6  oyundaki yaratıkların random hareketleri için tanımlanmıştır. “Esc” tuşuna basılınca oyundan çıkılır. “D” tuşuna basılınca oyun ve buna bağlı tüm timer’lar stop edilir. Kısaca pause edilir. Yaratıklar takip mesafesine girince htable[“monster2”] hastable’ına değer atanır. Ekranın sol üstünde siren ve takip eden yaratığın ismi yazılır. Kısaca takip eden yaratığın ismi hastable’a eklenir. Sonra da varmı diye aşağıdaki gibi bakılır.

 Level1.cs : Tüm tanımlamalar ve InitializeComponent içerisi kodun rahat okunması için temizlenmiştir.

level3

  • Diğer bölümlerden farklı olan ekran Boss ekranıdır. Yukarıda görüldüğü gibi 2 yarışmacı arasında ençok taşı toplayan oyunu kazanır. 8 timer’dan ilk 2’si nitroyu 3. Başlangıç timer’ı 4.sü oyunun kalan süresini geri sayarak tutar. 5.Timer bölüm sonunda  kazanılan taşların efektli bir şekilde paraya dönmesini sağlar. 6.Timer 2 round arasındaki bekeleme süresini.7. Timer Boss’un hareketlerini belirler. 10.Timre gene nitronun gazlı içicek alındıktan sonra azalmasını sağlar. Boss’un yukarı, aşağı, sağ ve sol hareketlerinde randomize gene belli noktalarda sadece belli yönlere göre olmaktadır. Bu noktalar yukarıda görülen platformdaki yol ayrımlarının olduğı kritik noktalardır. Mesela aşağıda görüldüğü gibi a2.1.3 bölümünde y>568 ve x<= 240 ise yani en altta soldan 2. kıvrımda ve sola hareket ediyor ise sadece sola veya yukarı gidebilir.

Ya da  a2.3 bölümünde boss sola hareket ediyor ise ve x>928, y>568 ise sadece yukarı gidilebilir. Yani boss sağ alt köşede ise ve yatay hareket ediyor ise sadece yukarı çıkabilmektedir. İlgili kod aşağıdadır. Özet olarak bölümün kritik noktalarına göre randomize hareketler kordinatlara göre filitrelenmiş ve Boss’un hareketlerine Timer9 ile yön verilmiştir. Diğer tüm yol ayrımları için aynı algoritma işletilir.

Yukarıda gördüğünüz gibi Boss’un hareketleri için belli kordinatlara göre birçok aritmetiksel işlemler yapılmaktadır.

Boss.cs: Boss ekranına ait tüm kodlar aşağıdadır. Tüm tanımlamalar ve InitializeComponent içerisi kodun rahat okunması için temizlenmiştir.

Yukarıdaki kodlardan da anlaşılacağı gibi oyun yazmak gerçekten zahmetli bir süreçtir. Çokça algoritmanın yazılması gerektiği gibi, matematiksel işlemlerinde  bolca kullanlması özellikle oyun motoru için vazgeçilmez bir kavramdır. Oynun grafikleri, sesleri ve efektleri de en az kodlama kadar önemli ve belki de çok daha fazla zaman alan süreçlerin başındadır. Modelleme, platform ve level tasarımları önce kağıt üzerinde yapılmalıdır. Oyunda yapılacak işler ve her ihtimal adım adım çizilip modellendikten sonra kodlamaya dökülmeli ve en sonunda da bolca teste tabi tutulmalıdır. Yukarıda gördüğünüz platform oynu size feyz olması ve aynı zamanda biraz olsun oyun yazmanın nasıl bir his olduğu hakkında fikir vermesi amacı ile yapılmıştır. Kodların tamamından ziyade dikkat çekici önemli kısımlara değinilmiştir.Oyunun kodları aşağıdaki linkdedir.

Umarım sizde oyun dünyasına olan bakış açınızı değiştirir ve artık sadece oynamaktan ziyade hangi teknolojiler ile ve nasıl yapıldığı konusunda da fikir yürütebilirsiniz.

Bir sonraki makalede görüşmek üzere hoşçakalın.

Source Code : http://www.borakasmer.com/projects/BoMan.rar

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.