GM Eğitimi – Labirent Oyunu

Yayınlandı: 08 Ocak 2011 yasirkula tarafından Çeviri Dersler, Game Maker, Oyun Tasarımı içinde

Merhabalar, uzun zaman sonra bir çeviri eğitim dosyasıyla daha karşınızdayım. Aslına bakarsanız bu eğitim dosyasının çevirisine 22 Ağustos 2010 tarihinde başlamıştım ama nedense sonradan hevesim yok oldu ve çeviriyi sonlara doğru bıraktım. Ama birkaç gün önce çeviriyi öyle bırakmak yerine en azından tamamlayıp paylaşayım ve sonra ne yapacaksam yapayım dedim ve çeviriyi tamamladım.

Ancak sizi uyarıyorum, bu eğitim dosyası ne yazık ki bir “GM Eğitimi-Scrolling Shooter” kadar güzel değil. Bunun sebebi ne yazık ki bu eğitim dosyasının orijinalinin yazılırken sanki oldu bittiye getirilmek için çaba sarfedilmiş gibi çabucak yazılma gayretine girilmiş şekilde yazılmasıdır, ve ben ne kadar eksikleri hafiften kapatmaya da çalışsam çeviri de orijinal eğitim dosyasından dolayı çok açık değildir.

Yani kısaca bu eğitim dosyasında çoğu şeyi gerçekten kendiniz yapacaksınız, eğitim dosyası ne yazık ki sadece size basit ipuçları vermekle yetinecek. Ancak bunu bir sorun değil de kendinizi daha iyi geliştirmek için bir etken olarak görürseniz daha rahat edersiniz.

Bu eğitim dosyası MS Word’de 12 sayfa tutmuştur. Bu eğitim dosyasında geçen GMK dosyalarını, kaynak dosyalarını ve yazının PDF hâlini içeren Winrar arşivini indirmek için alttaki linke tıklayabilirsiniz.

Link: https://www.box.com/s/d3e6ac832ef479b88c55

Eğitim dosyasını görmek için yazının devamını okuyabilirsiniz…

Labirent (Maze) Oyunları Yapmak

Gerekenler:Game Maker 8.0, Lite veya Pro Sürümü, Advanced Modu

Seviye:Başlangıç

 

Labirent oyunları çok popüler bir oyun türüdür ve Game Maker’da bu tip oyunları oluşturmak da kolaydır. Bu eğitim nasıl böyle bir oyun oluşturulabileceğini anlaması kolay bir şekilde adım adım anlatacak. İşin güzel yanı daha ilk adımda oynanabilir bir oyunumuz olacak ve ilerleyen adımlarda daha da gelişmiş ve güzel bir oyuna dönüşecek. Bu yazıda geçen tüm oyunlar “Örnekler” klasöründe yer almaktadır ve hepsi de Game Maker’a yüklenebilir. Örneğe başlamadan bilmeniz gereken şeyler GM’nin temel konularıdır ve onları bilmeden bu derste takılmalar yaşarsınız. Bu temel konuları bir oyun yaparken kavramak için sitemden “GM Eğitimi – Scrolling Shooter” dersine bakabilirsiniz.

 

***ÖNEMLİ NOT (ÇEVİRMEN NOTU): Bu eğitim dosyasına başladığınızda daha ilk aşamalarda çok fazla tanınmadık şeyle karşılaşabilirsiniz. Çeviri eğitim dosyasından takıldığınız bu konuda çok az bilgi bulma olasılığınız yüksektir. Bunun sebebi çevirisinin yapıldığı eğitim dosyasının bir önceki eğitim dosyasına nazaran hemen hemen hiçbir şeyi doğru düzgün anlatmamasıdır ve her noktada kişinin kafasında bir soru işareti bırakmasıdır. Eğitim dosyası büyük ihtimal takıldığınız yerleri örnek oyun dosyalarını inceleyerek gidermenizi istemektedir, ancak bu İngilizce bilmeyenler için epey zor olabilir. Ben çevirmen olarak çeviri yapmadan önce oyunu bizzat sıfırdan İngilizce anlatımı takip ederek kendim de tasarladım ve bu az bilgi sorunuyla her ne kadar GM’yi fena bilmesem de çok aşırı derecede karşılaştım. Bu yüzden bazı yerlerde çaktırmadan, bazı yerlerde ise açık bir şekilde kendi notlarımı da yazıya ekledim ve bir adım daha anlaşılır bir yazı oluşmasını sağlamaya çalıştım. Ama dediğim gibi, illaki bir noktada takılacaksınız ve oyun dosyalarını incelemek isteyeceksiniz. O bir noktada çok takılırsanız ve sorununuza bir türlü çözüm bulamazsanız da bana mail atın, sorununuzu açıkça belirtin; ben de sorununuza derman bulayım.(yasirkula@yahoo.com). Şimdiden kolay gelsin!***

 

Oyun Fikri

Bir oyuna başlamadan önce o oyunun nasıl bir şey olacağıyla ilgili bir fikre sahip olmalıyız. Bu bir oyun tasarlarken en önemli (Bazı durumlarda da en zor) adımdır. Güzel bir oyun heyecanlandıran, sürprizli ve alışkanlık yapan bir oyundur. Oyunda oyuncu için belli hedefler vardır ve kullanıcı arayüzü de kullanışlı ve şıktır.

Bizim yapacağımız oyun bir labirent oyunudur. Her oda bir labirentten oluşur. Labirentten kaçmak için oyuncu tüm elmasları toplamalı ve ardından çıkışa ulaşmalıdır. Bunu yapmak için oyuncu bulmacaları çözmeli ve yaratıklardan kaçınmalıdır. Pek çok bulmaca oluşturulabilir: engeller boşluklara itilmeli, odalardaki yerler bombalar kullanılarak patlatılabilmeli, vb. Bütün bu şeyleri daha ilk odadayken göstermemek çok önemlidir. Oyuna ilerledikçe yeni eşyalar ve yaratıklar eklenerek oyun ilginç kılınmalıdır.

Oyunumuzdaki ana obje oyuncu tarafından kontrol edilen karakterdir. Duvarlar da olacaktır (Oyunu daha çekici yapmak için farklı farklı duvarlar da kullanılabilir.). Toplamak için elmaslar olacaktır. Oyuncu tarafından alındığında yada oyuncu üzerine geldiğinde bir şeyler yapan eşyalar da olacaktır. En belirgin eşya odanın çıkışı olacaktır. Ayrıca oyunumuzda kendi başlarına dolanan yaratıklar da olacaktır. Ama gelin bütün bunları oyunu yaparken tek tek görelim.

ÖNEMLİ : Yazıda geçen tüm spriteler, arkaplan ve sesler yazıyla gelen Kaynak Dosyaları adlı klasörün içinde yer almaktadır, oradan kolaylıkla hepsine erişebilirsiniz.

 

 

Basit Bir Başlangıç

İlk başlangıç olarak elmasları unutalım. Oyuncunun sadece çıkışa ulaşmaya çalıştığı basit bir oyun yapalım. Oyunumuzda üç kritik öğe vardır: oyuncu, duvar ve çıkış. Her biri için spriteye ihtiyacımız olacak ve her biri için obje oluşturacağız. Bu ilk, çok basit labirent oyunumuzu “Örnekler” klasörü içinde maze_1.gmk adı altında bulabilirsiniz. Başlamadan önce bu dosyayı yükleyebilir ve inceleyebilirsiniz.

 

Objeler

Öncelikle  objeleri oluşturalım. Üç objenin her biri için 32×32 boyutlarında basit spriteler kullanacağız.


 

Bu üç spriteyi normal yolla oluşturup karakter için spr_person, duvar için spr_wall, çıkış için de spr_goal adını verin. Önce duvar objesini yapalım. Buna spr_wall spritesini resim olarak verin ve adını da obj_wall olarak değiştirin. Ayrıca duvarı sert cisim olarak tanımlamak için Solid seçeneğini işaretleyin. Böylece duvar içinden geçilemez yapıya sahip olacak. Duvar objesi başka bir şey yapmayacak, bunun için hiçbir olay (Event) tanımlamamıza gerek yok duvar için.

İkinci olarak çıkış (Hedef) objesini oluşturalım. Bu, oyuncunun ulaşması gereken objedir. Solid olmayan bir objedir. Buna bir bitiş çizgisi bayrağı resmi koymak güzel olur. Bu, hedefin o olduğunu oyuncunun kolayca anlamasını sağlar. Oyuncu bununla temasa geçince ise (Collision) sonraki odaya geçmeliyiz. Bu yüzden bu aksiyonu collision (Temas) olayının içine yerleştireceğiz (Main1 aksiyon sekmesinde yer alır.). Yalnız bu aksiyon eğer oyuncu son odayı bitirdiyse ileriki oda diye bir şey kalmayacağı için o zaman hata verir. Bu yüzden önce ileriki oda var mı diye kontrol edeceğiz, eğer varsa o odaya geçeceğiz. Yoksa da oyuna restart atacağız. Yani olay(Event) aşağıdaki gibi durmalıdır.


 

 

Aslına bakarsanız oyunumuzda oyuncu oyunu bitirince daha farklı bir şey yapmalıyız. Birkaç güzel resim göstermek ya da oyuncuya en iyi oyuncular listesinde pozisyon ayarlamak gibi. Bunu daha sonra halledeceğiz.

Son olarak da oyuncunun kontrol ettiği karakteri oluşturmalıyız. Biraz daha fazla iş lazım şimdi. Oyuncunun kontrollerine duyarlı olmalı ve duvarla temasa geçmemelidir. Kontrol için klavyedeki ok tuşlarını kullanacağız. (Bu doğal olduğu için oyuncuya sıkıntı yaşatmamış oluruz.) Bir karakteri hareket ettirmek için birden çok yol kullanabiliriz. Ama en kolayı oyuncunun bastığı tuşa göre oyunda karakterin bir cell (hücre) boyu kadar ilerlemesidir. İkinci bir yol ise, bizim de kullanacağımız bir yol, karakterin oyuncu yön tuşuna basılı tuttuğu süre boyunca gitmesidir. Başka bir yol ise oyuncu başka bir tuşa basmadıkça karakterin durmadan hareket etmesidir. (PacMan’deki gibi.)

Dört yön tuşu için de aksiyonlara ihtiyacımız var. Aksiyonlarımız ise biraz sıradan. Basitçe karakterin gideceği yönü belirleyecekler (Kullanacağımız hız olan 4 ile.). Bunun için 4 yön tuşu için de hareket aksiyonlarını tanımlayın. Durmak için de oyuncu tuşu bıraktığında <no key> (Tuş yok) keyboard olayını (Event) kullanacağız. O noktada hareketi durduracağız. Bu noktada bir karmaşıklık var. Biz karakterin gerçekten tam olarak bir cell’in (Hücre) içinde durmasını istiyoruz. İki hücrenin ortasında felan değil yani. Aksi halde hareket zorlaşır. Mesela bir koridora girmek için tam olarak belli bir noktada durmak için hücrenin tam içinde durmalıyız. Bunu şu şekilde ayarlayabiliriz. Control aksiyon sekmesinde bir objenin hücrenin içinde olup olmadığını test eden bir aksiyon bulunur. Eğer içindeyse sonraki aksiyon(lar) gerçekleşir. Biz bu aksiyonu tüm dört ok tuşuna ve hiçbir tuşa basılı olmayınca çalışan evente uygulayacağız ve değer olarak da 32 gireceğiz ki bu bizim labirentimizin hücre boyutudur:


 

 

Ayrıca duvara çarpınca da hareketin durmasını istiyoruz. Bu yüzden karakter ile duvarın collision (Temas) olayına hareketi durduran bir aksiyon yerleştireceğiz. Bu noktada dikkat etmemiz gereken bir şey var. Eğer karakterimizin spritesi bir hücreyi tamamen kaplamıyorsa, sorun da buradadır, karakteriniz duvarla temasa geçtiğinde bir hücreye tam geçiş yapamamış olabilir. Bu durumda karakter sıkışır kalır, çünkü yön tuşlarına cevap vermez(Çünkü henüz hücreye tam geçmemiştir.), ayrıca hücreye doğru hareket de edemiyordur, çünkü duvarla temas halindedir. Bu sorunun çözümü ise spriteyi daha büyük yapmak, ya da precise collision checking’i (Hassas temas kontrolü) devre dışı bırakıp tüm resmi bounding box içine almaktır.

Odaları Oluşturmak

Artık aksiyonlarla yapacak işimiz kalmadı. Şimdi birkaç oda oluşturalım. Bir iki tane oda oluşturup labirente benzetin. Tüm odalarda bitiş objesini hedefe koyun ve karakteri de başlama noktasına koyun.

Tamamlandı

Ve işte hepsi bu. İlk oyun hazır. Bunun üzerinde biraz oynayın. Mesela oyuncunun hızını değiştirin, daha çok oda koyun, resimleri değiştirin vb.

Elmasları Toplamak

Oyunumuzun amacı elmasları toplamaktı. Elmaslar kolay iş. Ama biz nasıl oyuncunun tüm elmasları toplamadan çıkışa ulaşamayacağından emin olacağız? Bunun için bir kapı objesi yapacağız. Kapı olduğu yerde sabit kalacaktır, tabi elmasların hepsi toplanmadıysa. Ve tüm elmaslar toplanınca da kapı yok olacak. İkinci oyunumuzu “maze_2.gmk” adı altında bulabilirsiniz. Projeyi yükleyip inceleyebilirsiniz.

 

Duvar, çıkış ve karakterin haricinde iki yeni obje daha lazım bize: Elmas ve kapı. Ayrıca spriteleri de lazım. Elmas çok kolay bir obje. Tek yapması gereken oyuncuyla temasa geçince yok olması. Bu yüzden temas olayına bunu yok etmek için Destroy Instance (Kopyayı yok et) aksiyonu kullanın. Kapı objesi ise çıkışa giden yolu kesmek için kritik bir noktada duracak. Solid olacak(Oyuncunun üzerinden geçememesi için.).  Karakterin kapıyla temas olayına hareketi durduracak bir aksiyon koymalıyız. Kapının step (adım) olayına da elmasların sayısının 0 olup olmadığını kontrol ettireceğiz, eğer öyleyse tüm elmaslar toplanmıştır ve kapıyı da yok edeceğiz. Bunun için yine Destroy Instance yeterli. Ayrıca oyuncuya kapının açıldığını belli eden bir de ses dinleteceğiz. Yani step (adım) olayı şekildeki gibi durmalıdır:


 

 

Biraz Daha Güzel Yapmak

Şimdi oyunun temelleri atıldığına göre, oyunumuzu daha da güzel yapalım.

Duvar biraz çirkin duruyor. Bu yüzden üç tane duvar yapalım, biri köşeler için, biri dikey duvarlar için, biri de yatay duvarlar için. Onlara doğru spriteleri verin ve onları solid yapın. Şimdi odaların biraz oynanmasıyla daha güzel duracaklar. Odalara arkaplan resmi eklemek de yardımcı olabilir.

Oyuncunun tüm bu duvarlarla (Ve ileride yaratıklarla) temas olayını tek tek yapmaktan kaçınmak için Game Maker’ın önemli bir tekniğini kullanacağız. Köşe duvarını diğer duvar objelerinin Parent objesi (Ebeveyn objesi) yapacağız. Bunun anlamı duvar objeleri köşe duvarının özel değişikliklerine göre davranacaklar. Yani tam olarak aynı davranışları sergileyecekler (Her biri için farklı davranışlar tanımlamazsak tabi..). Ayrıca diğer kopyalar için de onlar aynı. Yani sadece köşeyle temasları ayarlamalıyız. Bu otomatikman diğer duvar objeleri tarafından da kullanılacak.

Skor

Oyuncuya durumunu görebileceği bir skor verelim. Bu biraz önemsiz durabilir, ama normalde gereklidir. Her yok edilen elmas için 5 puan vereceğiz. Yani elmasların Destroy (Yok Olma) eventine 5 puan ekleme aksiyonu ekleyeceğiz. Bir bölümü bitirmek 40 puan olacak, yani çıkış objesiyle karakterin temas olayına 40 puan ekleme aksiyonu koyacağız.

Oyuncu son odayı da geçtiğinde bir yüksek skor tablosu gözükmeli. Bu Game Maker’da kolay bir şeydir çünkü bunun için tasarlanmış aksiyon bulunur. Bu, çıkış objesini biraz daha karmaşık yapacak. Çıkış objesinin karakterle temas olayı aşağıdaki gibi olmalıdır:


 

 

Skora ekleme yapılır, ses oynatılır, bir süre beklenir, ardından sonraki oda var mı kontrol edilir, eğer bu son odaysa bir mesaj gösterilir, yüksek skor tablosu gösterilir ve oyun tekrar başlatılır.

Skorun otomatikman başlıkta gösterildiğini unutmayın. Bu biraz çirkin olabilir. Bunun için bir kontrol objesi oluşturacağız. Bunun spriteye ihtiyacı yok. Bu obje tüm odalarda yer alacak. Neler olduğuyla ilgili biraz kontrol sahibi olacak. Şu an için bunu sadece skoru göstermek için kullanacağız. Bunun Draw (Çizim) eventine fontu ve rengi belirlenen bir skoru yazma aksiyonu koyun. Bu obje için maze_2.gmk dosyası içindeki game_controller objesini inceleyin.

 

Başlama Ekranı

Oyunun isminin olduğu bir ekranla oyuna başlamak hoş olur. Bunun için ilk odayı kullanacağız. Bir arkaplan kaynak dosyası oluşturup güzel bir resim atayacağız. (Belki bu arkaplan sadece ilk odada olacağı için buna hafıza harcamak istemeye de bilirsiniz.) Bu arkaplan ilk odada kullanılacaktır. (En iyisi arkaplan rengi çizmeyi kapatın ve arkaplanı non-tiled(Döşenmeyen) yapın.) Bir başlangıç kontrol objesi(start_controller) yapın (Tabi ki görünmez) ki ilk odada oyuncunun bir tuşa basıp basmadığı kontrol edilip eğer basılıyorsa diğer odaya geçilsin. (Başlangıç kontrol objesi ayrıca skoru 0 yapar ve skorun başlıkta gözükmediğinden emin olur.)

Sesler

Sessiz bir oyun epey sıkıcıdır. Bu yüzden birkaç sese ihtiyacımız var. Öncelikle bir arkaplan müziği oluşturun. Bunun için güzel bir midi dosyası kullanacağız. Bu müziği oyunun başlangıç kontrol objesinde başlatıp sonsuza dek çaldırın (start_controller objesini inceleyin.). Ardından birkaç ses efekti de lazım, elmas toplamak, kapıyı açmak ve hedefe ulaşmak için. Bu sesler yukarıda adı geçen objelerin ilgili eventlerinde çalacaklar. Hedefe ulaşınca çalacak olan başarı sesinin ardından bir uyku objesi ekleyip diğer odaya geçmeden biraz beklemek iyi olur.

Odaları Oluşturmak

Şimdi elmaslı odalar yapabiliriz. İlk bölümü aynen bırakın, elmassız kalsın ilk bölüm. Çünkü oyuncuya önce bayrağa ulaşmasını öğretmiş oluruz, ikinci bölüme geçince de elmas toplayacağını anlatmış oluruz. İkinci odaya elmaslar koyun ve güzel bir isim verin, oyuncu odada ne yapması gerektiğini de anlasın.

Yaratıklar ve Başka Mücadeleler

Oyun artık güzel olmaya başladı, ama hâlâ çok sıradan ve sıkıcı. Bu yüzden yaratıklara aksiyon ekleme vakti geldi. Ayrıca birkaç bomba ekleyeceğiz ve hareket edebilen bloklarla çukurları doldurmayı yapacağız. Bu aşama maze_3.gmk adı altında “Örnekler” klasöründe bulunur.

 

 

 

 

Yaratıklar

Üç farklı yaratık oluşturacağız: biri sola sağa gider, biri yukarı aşağı gider, biri de dört yönde de gider. Bir yaratık eklemek çok kolaydır. Oluştuğunda harekete başlar ve duvara vurunca yönünü değiştirir. Karakterimiz yaratıkların birine dokununca bölüm restartlanır, oyuncu hak kaybeder. Oyuncuya başlarken 3 hak verin. (Başlama kontrol objesi ile yapabilirsiniz.)

Öncelikle ilk yaratığı oluşturalım. Bu sağa sola gidecek olan. Bunun için basit bir sprite oluşturun ve sonra da bir obje oluşturup bu canavarın spritesini atayın. Oluşum olayında Move Fixed aksiyonuyla sağa veya sola gitmesini sağlayın ve hız olarak da karakter hızından biraz daha büyük bir değer girin. Duvarla temasa geçince de yatay olarak ters döndürün. (Reverse Horizantal)

İkinci yaratık da aynı şekilde işleyecek ama bu sefer yukarı veya aşağı yönde harekete başlayacak ve temas olunca dikey olarak ters dönecek.

Üçüncü yaratık biraz daha karışık. Dört yönden birinden de harekete başlayabilir yapın. Duvara çarpınca sola veya sağa dönüp dönemeyeceğine baksın. Eğer iki yöne de dönemezse, yani solid bir obje varsa ters yöne dönsün. (Bunu örnekteki monster_all yaratığının aşağıdaki resminde yer alan eventini inceleyerek kısa sürede kavrayacaksınız.) Şekildeki gibi:


 

Yaratıklarla ilgili herhangi bir problem yaşamamak için spritelerinden precise collision checking özelliğini kaldırıp Modify Mask seçeneğinden Full Image seçeneğini seçin.

Oyuncu yaratıkla temas edince bunu belli eden bir ses çalın, bir süre uyuyun, canı bir azaltın ve odaya restart atın. (Bu aksiyon çok kritiktir, restart atınca diğer aksiyonlar çalıştırılmaz.) Skoru yazan kontrol objesinde “no more lives” (hiç can kalmazsa) eventinde yüksek skor tablosunu gösterip oyuna restart atın.

Canlar

Game Maker’ın can mekanizmasını kullanarak oyuncuya başta üç can verdik. Canın kaç tane kaldığını görmek de güzel olurdu. Bunu skoru yazdıran kontrol objesinde yapalım. Ancak aslında canları küçük resimler olarak göstersek daha güzel durabilir. Bunun için score sekmesinde Draw Life Images adındaki aksiyonu kullanın. Ardından da canların gözükeceği yerin soluna isterseniz “Canlar” yazarak orada canların sayısının olduğunu belirtebilirsiniz. Eventiniz şekildeki gibi durmalıdır:


 

Skoru göstermek için bir font kaynak dosyası kullandığımıza dikkat edin.

Bombalar

Şimdi de bombaları ve tetikleyicilerini oluşturalım. Buradaki fikir şu; oyuncu tetikleyiciye ulaşınca tüm bombalar patlar ve etrafındaki her şeyi yok ederler. Bu duvarlarda delikler açmak ve yaratıkları yok etmek için kullanılabilir. Üç yeni objeye ihtiyacımız var: tetikleyici, bomba ve patlama. Hepsi için de uygun spriteye ihtiyacınız olacak.

Bomba çok kolay. Sadece orada burada bekleyip bir şey yapmayacak. Yaratıkların üzerinden geçip gitmesi için (Altından geçmesinden daha iyidir.) derinliğini (Depth) 10 yapın. Obje kopyaları derinliğe göre çizilirler. Yüksek derinliğe sahip olanlar önce çizilir. Böylece daha küçük derinliğe sahip objelerin arkaplanında kalırlar. Derinliği 10 yaparak normal olarak derinliği 0 olan objelerin bu objenin kopyalarının üzerinde yer almasını sağladık.

Tetikleyici objesi de epey kolay. Karakterle temasa geçince tüm bomba objelerini patlama objelerine dönüştürecek. Bu main1 sekmesinde Change Instance (Kopya Değiştir) aksiyonuyla yapılabilir. Tepeden, uygulanacak obje olarak bomba objesini seçmeyi unutmayın.


 

Patlama objesi sadece animasyonu gösterir. Animasyon bitince de kendini yok eder. (Patlama objesinin orjininin bombayla tam uyuşmasından emin olun.) Ayrıca bu obje dokunduğu her şeyi yok etmelidir. Bu biraz uğraştıracak. Öncelikle patlama objesinin patlamanın olduğu tüm alanlar test edilirken kendi kendini de yok etmemesi lazım, bu yüzden önce onu uzak bir yere ışınlıyoruz. Ardından main1 aksiyon sekmesinden Destroy at Position (Pozisyondakileri Yok Et) akiyonu ile patlamanın etkileyeceği tüm alanlarda ne var ne yok; yok edilmesini sağlıyoruz. Ardından da patlama objesini geri orijinal konumuna yerleştiriyoruz. (Burada örnekteki Destroy at Position aksiyonunun koordinatlarının (200+A veya 200-B ile başlamasının sebebi verilen örnekte patlama objesi en baştaki aksiyonda 200’e 200 pixel sol yukarı taşındığı içindir, yani orada asıl yapılan sanki patlama objesi hiç yer değiştirmemiş gibi patlamanın etki ettiği tüm koordinatlardaki objelerin elle patlatılmasıdır.)


 

Bu işlemin karakter bombaya epey yakın olunca ters işleyeceğini unutmayın! Bu yüzden tetikleyicileri bombalardan uzak noktalara koyun. Bölümleri bombalar ve tetikleyicilerle zekice kurgulamanız önemlidir, kendi başlarına mücadele belirtsinler.

***Çevirmen Eklemesi***

Arkadaşlar eğer yukarıdaki olayda patlama alanının test edilmesi size de abartılı uzun geldiyse size 2 alternatif sunacağım burada. Yukarıdaki aksiyonlar aslında çok zekicedir, ama bu oyun için çok uzundur. Yukarıdaki aksiyonların faydası büyük projelerde çok obje oluşunca ortaya çıkar ki bu projelerde pek çok yaratık için patlama objesiyle ayrı ayrı temas olayı yapmak yerine üstteki aksiyonlar dizisi daha rahattır. Ancak dezavantajları ise yok edilmemesi gereken objelerin de yok edileceğidir. Mesela siz tetikleyiciyle bombayı yakın koyarsanız yukarıdaki aksiyonlarda tetikleyiciye giden karakter de silinebilir, ayrıca eğer çıkış objesi bir bombaya yakınsa aynı sorun tekrar ortaya çıkar. Bunun için size 2 alternatif sunuyorum, bu alternatiflerin herhangi biriyle çok karmaşık olmayan oyunlarda çok daha hakimiyet sahibi olabilirsiniz, ayrıca daha sade bir obje arayüzünüz olur.

İlk alternatif en kolayı ve gerçekçisi, patlama objesinin Create (Oluşum) eventini toptan silin ve bombanın patlamasının yok etmesini istediğiniz her obje için ayrı ayrı Collision (Temas) olayı oluşturup temasa geçilen diğer objenin yok edilmesini sağlayın. (Destroy Instance aksiyonundan Other seçeneğini seçin.)

İkinci alternatif ise orijinal örneğe sadık kalınarak hazırlandı. İlk alternatifte patlamada temas olayları kullanacağınız için patlama spritesinin bir altspritesi temas olayındaki objeyle temasa geçmeden temas olayı gerçekleşmeyecektir. Yani daha gerçekçi ama ender de olsa kusur yaşayabileceğiniz basit bir yöntemdir o. Bu ikinci alternatifte ise yapacağınız şu: Patlamanın boyutu ne kadar olacaksa (Sizin kararınız) o boyutlarda bir içi dolgulu sprite oluşturun. Spritenin rengi önemli değil, önemli olan boyutu ve orjin noktasının merkez olarak ayarlanması. Sonrasında ise bu sprite için bir obje oluşturun ve Visible (Görünür) seçeneğini kaldırın, objenin gözükmemesi lazım. Bu objede ise bombanın etki etmesini istediğiniz tüm objelerle temas eventi oluşturun ve ilk alternatifteki gibi temasa geçilen ilgili objenin yok edilmesini sağlayın. Sonra da objenin Create olayında bir alarm aksiyonu kullanıp değeri 1 adım olarak girin ve alarm olayında da bu objeyi yok edin. Son olarak patlama objesinin Create eventinde az önce oluşturduğumuz objeyi relative koordinatlarda oluşturarak işlemi sonlandırın.

Bu alternatifte yaptığımız şey ise patlama tam başladığı anda patlamanın olduğu yerde patlama şiddeti boyutunda bir objenin oluşması ve o oluşan objenin patlamanın yok etmesini istediğimiz herhangi bir objeyle teması varsa o objenin yok edilmesi. 1 step sonra da bu kontrol objesi kendi kendini yok edip zorluk çıkarmayacaktır. Aslında zor gibi anlattım ama çok basit bu şey. Denerseniz görürsünüz, iki alternatif de hem basitler, hem de güçlüler ve size daha çok hakimiyet sağlıyorlar.

***Çevirmen Eklemesi Sonu***

 

Bloklar ve Delikler

Şimdi daha karışık bulmacalar oluşturmamıza yarayan bir şeyler oluşturalım. Oyuncu tarafından itilebilen bloklar yapalım. Ayrıca oyuncunun geçemeyeceği delikler koyalım, ama delikler bloklarla doldurulabilsin ve böylece oyuncu oradan geçebilsin. Bu iki obje pek çok zekice bulmaca oluşturmanızda yardımcı olur. Bloklar belli bir yöne doğru itilebilmeli ve yol alabilmelidir. Ayrıca bloklarla yaratık da yakalayabilirsiniz.

Blok solid bir obje olacaktır. Burada ana problem bloğun karakterin hareket yönüne göre hareket etmesidir. Bu yüzden bloğun karakterle temas olayına şu aksiyonları yerleştirin: Öncelikle relative olarak 8*other.hspeed, 8*other.vspeed boş olup olmadığını control sekmesinden Check Empty (Boşluğu Kontrol Et) ile test edin. Buradan alttan Objects seçeneğini All (Hepsi) yaparak sadece duvarların değil, yaratıkların ve solid olmayan objelerin de kontrol edilmesini sağlayın. Eğer o konum boşsa bloğu oraya ışınlayın. Ardından alta bir ELSE (Değilse) takısı koyun. ELSE’nin altına da aynı koordinatlarda delik objesi var mı diye test edip eğer varsa deliğin üzerine ışınlanmasını sağlayın (Check Object (Objeyi Kontrol Et) aksiyonunu kullanın.) Bunu yapmamızın nedeni eğer ilgili koordinatta delik olsaydı normalde bloğun deliğin üzerine gitmeyecek olmasıydı, ama ELSE ile onu ayrı olarak test edince sorunu çözmüş olduk.

***Çevirmen Eklemesi***

Yukarıdaki kodda 8*other.hspeed ve aynısının vspeed’li olanını test ettik. Bunu ilk gördüğünüzde kafanız karışmış olabilir. Bu yüzden bu iki kodu açıklamak için bu eklemeyi koydum.

Öncelikle biz karakterin hareket ederken ızgaralar şeklinde hareket etmesini sağlamıştık, bu ızgaraların boyutları da 32’ye 32 idi. Karakterimizin bir yön tuşuna basınca o yöndeki hızı ise bu örnekte 4 olarak ayarlanmış. 32’yi 4’e bölerseniz 8 elde edersiniz. Burada zekice bir test yapılmış. Örnekte bu bulduğumuz 8 sayısıyla bloğa temas eden karakterin hızı çarpılıp ızgara boyutları olan 32 tekrar bulunuyor, bu sayede bloğun test edeceği alanın bir ızgara boyutu kadar olması sağlanıyor. Ama ayrıca bir işlem daha yapılıyor. ((Koddaki “other.” kısmı temasa geçen diğer objenin söz konusu olduğunu belirtir. Yani other.hspeed ile kastettiğimiz; blokla temasa geçen karakterin(Burada temasa geçen karakter other oluyor işte) hspeed’i; yani yatay hızıdır.))

Bu test işleminin yaptığı diğer işlem de karakterin yönünü bulmak, yani eğer karakter sağa gidiyorsa vspeed’i 0 olur ve vspeed’i kullandığımız test yeri de sonuç olarak 0 olup bloğun sadece sağ tarafı boş mu diye kontrol edilir, alt taraflar kontrol edilmez. Umarım ki bu kaliteli kod kafanızda açıklığa kavuşmuştur.

***Çevirmen Eklemesi Sonu***

Yaratıkların blokların üzerinden geçmesini engellemek için bloğa köşe duvarını parent olarak ayarlıyoruz. Ama bu bir problemi de beraberinde getirir. Karakterle köşe duvarı arasında temas olayı olduğundan ve karakterle blok arasında olmadığından ilk belirttiğimiz olay gerçekleşir ve karakter hareket etmez. Bu bizim istediğimiz bir şey değildir. Çözümü ise karakterle bloğun temas olayına içine işe yaramayacak bir aksiyon konulmasıdır (Control sekmesinden Comment bu konuda oyununuza hiçbir etki etmez, onu kullanın.) Artık bu olay gerçekleşecek ve karakteri durdurmayacak. (Açıkçası yeni temas olayı parent objenin temas olayını yok saymamızı sağlayacak. Önceden de belirttiğim gibi, child(çocuk) objelere (Parent objeye sahip objeler) farklı özellikler sağlamak için bu yöntemi kullanırsınız.)

Delik solid objedir. Blokla temasa geçince kendini ve bloğu yok etmesini sağlayın. Ayrıca köşe duvarı objesini bu objenin parent objesi yaparak köşe objesinin özelliklerinin delikte de geçerli olmasını sağlayın.

Bloklar ve deliklerle pek çok ilginç oda tasarlayabilirsiniz. Ama küçük bir sorun var. Kolayca odayı kilitleyebilirsiniz, yani hiçbir hareket edemeyecek hâle gelebilirsiniz. Bunun için oyuncuya bölümü tekrar oynama hakkı tanımalıyız, ama bir canını da alacağız. Bunun için karakterde R tuşu olayını kullanın. Bu olayda canı relative olarak -1 olarak azaltın ve odaya restart atın.

Bu oyunun üçüncü versiyonunu da bitiriyor. Artık çok daha ilginç oyunlar tasarlamak için değişik objelerimiz var.

 

Birkaç Son Rötuş

Artık oyunumuzu son aşamaya sokalım. Grafiklerimizi biraz daha geliştirmeliyiz. Ayrıca daha fazla ve ilginç odalar yapalım. Bunun için birkaç bonus ve biraz da özellik ekleyeceğiz. Son oyunu maze_4.gmk adı altında bulabilirsiniz.

 

 

ÇOK ÖNEMLİ NOT: Bu son bölümde anlatılanların hepsini siz yapacaksınız, bunun için herhangi bir şeyde sadece ne yapılacağı söylenecek, ama nasıl yapılacağını şimdiye kadar öğrendiklerinizle siz keşfedeceksiniz. Yine de kargaşa içinde kalırsanız maze_4.gmk dosyasını iyice irdeleyin. Takıldığınız yerin hangi olaylar ve aksiyonlarla yapıldığına bakın. Böylece çok daha az takılacaksınız.

 

Daha İyi Grafikler

Oyunumuzun şu anki grafikleri biraz zayıf. Bunu gelin biraz daha geliştirelim. Asıl yapmamız gereken karakterimizin gittiği yöne doğru bakmasıdır. Bunu yapmanın en kolay yolu her biri farklı yöne bakan 4 alt resme sahip olan yeni bir sprite oluşturmaktır, tıpkı şekildeki gibi:


 

Normalde Game Maker bu alt resimler arasında sürekli geçiş yapar ve tekrar başa sarar. Bunu bu spriteyi atadığımız karakter objesinin Create eventinde image_speed(Sprite Hızı) değişkenini 0 yaparak ayarlayabiliriz. Karakterin yönünü her değiştirdiğimizde uygun alt resmi de alttaki gibi bir aksiyon yardımıyla objeye atayabiliriz(Unutmayın, altresimler 0 sayısından başlar, yani subimage kısmı 3 olan altresim sola bakan karakter altresmini ifade eder, 0 ise aşağı yönde bakanı…):


 

Benzer bir şeyi tüm yaratıklar için de yapabiliriz ama burada hareket yönünü değiştirmek için tam uygun bir event yoktur. Burada yapılabilecek en basit şeyse End Step(Adım Sonu) eventinde yaratığın ne yönde ilerlediğini test etmek ve ona göre uygun spriteyi yaratığa adamaktır. (maze_4.gmk’yı incelerseniz olayların işleyişini daha rahat kavrayabilirsiniz.)

 

Bonuslar

İki bonus ekleyelim: biri 100 puan, diğeri de ekstra bir can versin. Her ikisi de epey kolay. Bunlar karakterle temas ettiklerinde bir ses çalıp, kendilerini yok edip, ardından da skora 100 eklemeli ya da cana 1 eklemeli. Hepsi bu!

 

 

Tek Yön Sokaklar

Bölümleri daha karmaşık yapmak için sadece tek yönde ilerlememize olanak sağlayan tek yön yollar yapalım. Bunun için her biri ilerleyebileceğimiz yolda bir ok şeklinde gözüken 4 objeye ihtiyacımız var. Karakter objenin tamamen üstüne geldiğinde karakteri ilgili yönde otomatik olarak ilerletmeliyiz. Bunu karakterin step eventinde yapacağız. Karakterin okun üzerinde olup olmadığını test edecek ve okun yönünün uygun olup olmadığına bakacağız. Eğer uygunsa hareketi doğru yönde ayarlayacağız. (Bu hareketin hızını 8 yaparak işi daha ilginç kılabiliriz.)

 

Korkak Yaratıklar

PacMan vâri bölümler oluşturmak için yaratıklara afraid(Korku) adında bir değişken vereceğiz. Oluşum olayında bunu 0 (False)(Yanlış) yapacağız. Karakter yüzük şeklinde bir objeyle temasa geçince bunu 1 (True)(Doğru) olarak ayarlayacaız ve yaratıkların spritelerini, korktuklarını belli etmek için değiştireceğiz. Karakter yaratıkla temasa geçince karakterin korku hâlinde olup olmadığını test edeceğiz. Eğer korku hâlindeyse yaratık başlangıç noktasına geri gidecek. Değilse karakter bir can kaybedecek. Oyun dosyasını inceleyerek olayları daha iyi kavrayabilirsiniz.

 

Her şey Kaliteli Bir Oyun İçin!

Artık epey objemiz oldu, ama oyunumuz hâlen iyi bir oyun değil. Oyunlarda en önemli özelliklerden biri bölümlerdir. Kolaydan zora doğru gitmelidirler. Başlangıçta sadece birkaç obje kullanılabilir olmalıdır. Sonradansa daha çok obje belirmelidir. Sadece ilerleyen bölümlerde beliren sürprizleri de es geçmemeliyiz. Açıkçası bölümler zeka gerektirmelidir. Çocuklar için ise bu yetişkin oyunlarından daha basit puzzle oyunları yeterlidir.

Ayrıca iyi bir oyun yardım metnine sahip olmalıdır. Bunu Game Maker’da Game Information(Oyun Bilgisi) kısmının yardımıyla halledebilirsiniz. Son olarak ise oyuna bir save-load sistemi koymalısınız. Bu GM’de çok kolay. Çünkü GM kendi save-load mekanizmasına sahiptir. F5 tuşu kayıt(save) yaparken F6 tuşu en son kaydedilen oyunu açar(load). Bunu da yardım metnine ekleseniz iyi olabilir.

Artık gerçek bir oyuna sahibiz. Lütfen maze_4.gmkdosyasını iyice inceleyerek bu karışık kısmı iyice kavrayın. Ayrıca dosyayı dilediğinizce değiştirebilirsiniz. Pek çok bölüm de ekleseniz fena olmaz :). Ayrıca çeşitli kapıları açan anahtarlar, çeşitli ışınlanma bölgeleri, yaratıkları öldürmek için silah ve kurşun sistemi, belli zaman aralıklarında açılan ve kapanan kapılar, karakterin üzerinde durmasının mümkün olmadığı buzlar, çeşitli tuzaklar vb. ekleyebileceğiniz sayısız fikirden sadece birkaçı. Gerisi size kalmış.

 

Sonuç

Umarım bu eğitim dosyası karışık da olsa Game Maker’da kendi oyunlarınızı yapmak konusunda size yardımcı olmuştur. Oyun yapmanın ilk kuralını hatırlayın. Her şey basitten başlar ve adım adım gelişir. Her zaman herhangi bir şeyi yapmak için çok değişik yollar vardır. Yani eğer bir şeyler ters giderse, başka yolla deneyin. Bol şans!

 

Okuyarak Geliştirmek

Game Maker kullanmayı okuyarak geliştirmek istiyorsanız size kitabımızı almanızı tavsiye ediyoruz:

 

Jacob Habgood and Mark Overmars, The Game Maker’s Apprentice: Game Development for Beginners, Apress, 2006, ISBN 1-59059-615-3.

 

Orijinal isminin verildiği bu kitap adım adım GM’yi öğretir ve bu esnada 9 güzel ve oynaması zevkli oyun oluşturmanızı sağlar. (Tabii ki bu kitap Türkiye’de yok ve Türkiye’de oyun yapımcıları bu kitapsız kendini geliştiriyorlar ve harika projelere imza atıyorlar. Yani kendinizi bu kitapsız yapamayacağınıza bağlamayın. Bu not kendi tarafımca eklenmiştir.)

Yorumlar kapalı.