Bu sayfadaki yazılar
Sayfanın metni
Sayfa 34
Oyun Öğelerini Tasarlamak ğince fazla öğeyi eleyip sadece oyunu en zevkli kılacak birkaç öğeyi geride bırakmalısınız. Yoksa oyunu bitirebilmeniz çok zorlaşır. Az oyun öğesi içeren bitmiş bir oyun, çok öğe içeren bitmemiş bir oyundan, hem sizin için, hem dünya için daha iyidir.
Bu eleme süreci şu şekilde işler. Listenizdeki her bir oyun öğesine bakıp şu soruları sorarsınız.
Bu öğe oyunun kapalılığını bozuyor mu? Cevap evetse çoğu zaman bu öğe elenmelidir. Eğer bu öğenin mutlaka oyunda olmasını istiyorsanız, o zaman ya oyunun tekrar kapalı hale getirecek şekilde öğeyi değiştirmeli ya da açık noktaları kapayacak yeni öğeler eklemelisiniz. Bundan kaçının, burada öğe azaltmaya çalışıyoruz.
Bu öğenin oyunda oyuncuya etkisi var mı? Oyuncu bu öğede başarılı olunca ödüllendiriliyor mu? Veya başarısız olunca cezalandırılıyor mu? Örneğin bir FPS'ye ticaret eklediğinizde oyuncu daha iyi silahlar ve zırhlar ile ödüllendirilmiş oluyor. Çoğu zaman bir öğenin oyunda kalması için ya ödül, ya ceza ya da her ikisi birden oyunda var olmalı. Eğer yoksa eleyin.
Bu öğeden gelen ödül veya ceza başka öğelerden gelebiliyor mu? Eğer gelebiliyorsa belki de bu öğeye gerek yok. Oyuncu buradan gelecek fayda veya zararı zaten başka yollardan elde edebiliyor. Bu durumda ya bu öğe biraz değişmeli ya da atılmalı.
Bu öğe oyunun genel dünyasıyla uyumlu mu? Mesela FPS yapmışsınız ve karakteriniz bir insan, mekan bir yabancı gezegen ve karşımıza çıkan herkes uzaylı düşmanlar. Şimdi bu dünyada ticaret eklemek gerçekten mümkün mü? Yani az önce birinci levelda bir uzay üssündeki bütün uzaylıları kesmişsiniz. Sonra üsten çıkıp yakındaki kasabanın tavernasına gidip oradaki bir elemandan silah almanız mantıklı mı? Belki bunu mantıklı kılmak için senaryo değiştireceksiniz. Belki de o uzaylılar arasında size destek olan bir beşinci grup var. Bu soruların cevapları siz ne derseniz o. Ancak önemli olan bu soruları sormak.
Son olarak oyununuzdaki öğe sayısını azaltmanın en güzel yollarından biri öğeleri gruplar olarak değerlendirmektir. Öğeler genelde savaşla ilgili öğeler, ticaret ile ilgili öğeler, bilmece çözme ile ilgili öğeler gibi gruplar halinde olurlar. Bu grupları komple eklemek ve çıkarmak genelde oyunun kapalılığını korur. Örneğin FPS'nizden bütün ticaret öğelerini bir kalemde keserseniz geride kalan öğeleri kapalı kılmak kolaylaşır. Oysa ticaret ile ilgili bir öğeyi kesip birini bırakırsanız, ihtimalen kapalılığı bozarsınız.
Tekrar söylemekte fayda görüyorum. Özellikle küçük kişisel oyun projelerinizde benim tavsiyem, her zaman mümkün olduğunca az oyun öğesi bulundurmanız ve bu öğeler grubunu yukarıda anlattığım metotlardan birini kullanarak, mümkün olduğunca özgünleştirmenizdir.
Yazıyı burada kesiyorum. Oyun öğeleri ile senaryo ve oyun dünyası arasındaki ilişkilerden de gelecek yazıda bahsedeceğim. Böylece oyun yapımında bana göre en zevkli konulardan olan oyun dünyası tasarımına geçeceğiz.
Yazarın notu: Bu yazıdaki grafikler "İstanbul Kıyamet Vakti" oyunundan alınmıştır.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 35
Geçen sayıda gördüğümüz while döngüsüne çok benzeyen bir yapı ile karşı karşıyayız.
do Komut1; Komut2; Komut 3; ) while ( kosul );
Bu döngü de tıpkı while döngüsünde olduğu gibi koşul doğru olduğu müddetçe verilen kod bloğunu çalıştıracaktır. While döngüsünden tek farkı ise kod bloğunun en az bir kere çalışacak olması. Bunun sebebi, while döngüsünde koşul kontrolü en başta yapılırken, do-while döngüsünde kontrolün sonda yapılıyor olması.
For Döngüsü
Anlatım sırası olarak önce while ve do-while yapılarını anlatmamızın sebebi onların if ile olan benzerlikleri idi. Aslında en sık kullanılan döngü tipi belki de for döngüsüdür. Gelin bir göz atalım. i=0; i<5; i++
for( int iİ — Ü; t*ti)
1 Komut1; Komut2; Komut 3; )
Burada for satırı önemli. Bu satırda parantez içinde kalan bölüm döngünün nasıl çalışacağını tanımlıyor. Bu bölüm kendi içinde aslında üç parçaya bölünmüştür. Bu üç parçayı iki adet noktalı virgül (;) ayırıyor.
1. i=0: başlangıç bölümü. Burada i adında bir döngü sayacı tanımlanmış. 2. döngüye devam koşulu.
3. döngü. Burada döngü sayacı 1 artırılmış. ++ operatörü böyle kullanılarak, tamsayı cinsinden bir değişkenin değerini bir artırabilir. Burada ++i yazmak yerine i = i + 1 da yazabilirdik, aynı şey olurdu.
Döngüler konusunda hatırlamamız gereken son şey her üç döngü yapısından da break komutu ile çıkabileceğimiz.
if bloklarına alternatif:
Switch - case
Eğer bir değişkeni alıp bu değişkenin değerine göre çok sayıda kod bloğundan birini çalıştırmak istiyorsak (örneğin menü komutu işleme vs. gibi senaryolarda), bunu geçen bölümde gördüğümüz gibi if-else if blokları ile yapabiliyoruz. Ancak bunu yapmanın (belki) biraz daha kolay bir yolu da switch case yapısını kullanmaktır.
switch( degisken (
case 1: komut1; komut2; break; case 2: komut 3; break; case 3: komut4; break; default: komut 6; break;
Burada değişkenin değeri 1 ise komut1 ve komut2 çağırılır. Değer 3 ise komut4 ve komut5 çağırılır. Eğer değer 1, 2 veya 3'ten farklı bir değer ise de komut6 çağırılır. Burada dikkat edeceğiniz bir diğer şey break komutları. Eğer break komutları konulmazsa program akışı bir alttaki case bloğundaki komutlardan çalışmaya devam eder. Bu da genellikle istenmeyen bir durumdur. Eğer bu istenen bir durum ise bile genelde kodu okumayı ve anlamayı zorlaştıracağı için tavsiye etmiyorum.
Döngü Örneği
Döngüleri kullanarak bir örneğe bakalım:
#include <iostream> int main()
// kac sinav oldugunu al << “Kac sinav oldu? "; int kacSinav; >> kaeSinav;
// dongu ile notlari al ve topla int toplam - O;
forlint is0O; i<kacSinav; hi) ( int not; stdı:cout << “sinav notu:
sStdi;cin >> not; toplam - toplam * not; )
// sonucu hesapla ve goster int ortalama toplam / kacSinav; std::cout << “Yapilan ” << kacSinav << “ sinavin ortalamasi: ” << ortalama << std::endi; )
Şu ana kadar öğrendiklerimizi kullanarak nispeten faydalı küçük programcıklar yazabilmeye başladık.