Selamlar, tekrar bir eğitim dosyasına hoş geldiniz! Bu eğitim yazısı YoYo Games’in resmi sitesinde yer alan Game Maker resmî eğitim dosyalarınde yer alan “GM Tutorial – Scrolling Shooter” eğitim dosyasının Türkçe’ye çevrilmiş hâlidir. Yazıya bazı yerlerde eklemeler yapılmıştır ve görülen eksik noktalar ve hatalar da düzeltilmeye çalışılmıştır.

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

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

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

Bir Scrolling Shooter Oyunu

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

Seviye: Başlangıç

Scrolling shooter oyunları çok popüler arcade oyunlarıdır, and Game Maker gibi bir programla oluşturması da nispeten kolaydır. Bu eğitimde böyle bir oyun oluşturacağız, bu aşamada da Game Maker’ın önemli bileşenlerinden bazılarını göreceğiz, özellikle de değişken kullanımını göreceğiz. Bir scrolling shooter’da oyuncu bir objeyi kontrol eder, bir uçak, uzay aracı ya da araba gibi; ve bu obje kayan bir zeminin üzerinde ilerler. Kaçınılması gereken engeller ve vurulması gereken düşmanlarla karşılaşırız. Genelde bonus objeler de çıkar ve alınınca ekstra özellikler sağlarlar. Oyun boyunca çıkan düşmanların sayısı, tipi, ve gücü giderek artar ve oyuncu için o mekanda hayatta kalmayı zorlaştırır.

Bu eğitimde 1945 adında, oyuncunun denizin üzerinde uçtuğu ve düşman uçaklarının oyuncuyu yok etmeye çalıştığı bir scrolling shooter oyunu yapacağız. Nasıl arkaplanın hareket ediyormuş gibi hissettireceği, nasıl uçağın kontrol edileceği, nasıl düşmanların oluşturulacağı, nasıl mermilerin yapılacağı, nasıl skorla, canlarla ve uçağın hasarıyla uğraşılacağı gibi özellikler öğreneceğiz. Ama önce Game Maker’ın çok önemli bir parçasının içine dalıyoruz, değişkenler.

Değişkenler ve Özellikleri

Oyunumuzu yapmadan önce Game Maker’ın önemli bir özelliğini inceleyeceğiz, değişkenlerin kullanımı. Bu basit özellik çok güçlü bir mekanizma sağlayacak ve çok daha ilgi çekici oyunlar yapabilmemizi sağlayacak. Peki, nedir bir değişken? Bu en iyi bir objenin kopyasının bir özelliği olarak tanımlanabilir. Bildiğiniz gibi bir obje tanımlarken verebileceğimiz çeşitli özellikler vardır. Mesela görünürlüğü veya duvar gibi sert olup olmadığı. Ayrıca bazı özellikleri değiştirmeye yarayan aksiyonlar da vardır. Mesela kopyanın konumunu ve hızını değiştiren bir aksiyon vardır. Her kopyanın kendine has özellikleri olduğu gibi ayrıca evrensel özellikler de söz konusudur, mesela skor. Sadece tek bir kopyaya has olmayan özellikler yani. Bu tüm özellikler değişkenler adında ve her biri bir isme sahip şeylerin içinde depolanır. Mesela alın size her kopyaya has olan ve kopyadan kopyaya değişen değişkenler:

x değişkenin x koordinatı

y değişkenin y koordinatı

hspeed yatay hız (her adımda pixel sayısı olarak)

vspeed dikey hız (her adımda pixel sayısı olarak)

direction hareketin o anki derece cinsinden yönü (0-360; 0 tam yatay olarak sağ yönü belirtir.)

speed hareketin o anki hızı

visible objenin görünür (1) veya görünmez (0) olması

solid Objenin sert olması (1) veya olmaması (0)

Ve işte birkaç tane de evrensel değişken:

score skorun o anki değeri

lives o anki hakların sayısı

mouse_x farenin x koordinatı

mouse_y farenin y koordinatı

room_speed odanın o anki hızı (her saniye için adım olarak)

room_caption oyunun çalıştığı ekranın başlığında gözükecek yazı

room_width odanın pixel olarak genişliği

room_height odanın pixel olarak yüksekliği

Bunların haricinde daha çoook değişken vardır, yerel veya evrensel olan. Hepsi de Game Maker dökümanının içinde yer alır. (Help-Contents veya klavyeden F1 tuşu ile erişilebilir.) Bir takım değişkenleri değiştirmeye yarayan aksiyonlar vardır, ama sonradan göreceğimiz gibi, değişkenleri direk olarak da değiştirmek mümkündür. Ayrıca kendi değişkenlerinizi de tanımlayıp kullanabilirsiniz! Mesela aşağıda da göreceğimiz gibi, uçağımızın sadece her 5 adımda ateş edebilmesini istiyoruz. Yani uçağımızın ateş edip edemeyeceğimizi belirten bir değişkeni olacak. Bunun için de can_shoot adında bir değişken kullanacağız. (Türkçe karşılığı ates_edebilir)(Bir değişken ismi sadece harflerden ve uzun çizgi (_) sembolünden oluşabilir. Değişken isimleri çok hassastır, yani Can_Shoot ile can_shoot farklı değişkenlerdir.) Uçağın oluşum olayında (Create) bu değişkeni 1 yapacağız. (1 rakamını daima doğru değeri için kullanırız.) Oyuncu ne zaman ateş etmek isterse bu değeri kontrol edip ateş edip edemeyeceğini belirleyeceğiz. Bir ateş edildiğinde değişkenin değerini 0 yapacağız (o anda ateş edilmenin mümkün olmadığını belirtecek). Ardından bir alarm olayı kullanarak 5 step (adım) sonra değişkenin değerini tekrar 1 yapacağız. Aşağıda bunu daha detaylı bir şekilde anlattık. Aynı şekilde değişkenleri uzay aracımızın kalkanı var mı yok mu diye, özel silahı aktif mi diye vb. şeyler için de kullanabiliriz.

Değişkenlerle direk olarak etkileşimi sağlayan 2 önemli aksiyon vardır, ikisi de Control sekmesinde bulunur.

Set the value of a variable (Bir değişkenin değerini belirle). Bu aksiyon ile girilen değişkenin değerini değiştirebilirsiniz. Bu hazır bir değişken ya da sizin tanımladığınız bir değişken olabilir. Değişkenin adını girersiniz ardından da yeni değerini. Eğer alttan Relative kutucuğunu işaretlerseniz girilen değer değişkenin o anki değerinin üzerine eklenir. Ancak unutmayın ki bu sadece değişkenin zaten önceden belirlenmiş olan bir değeri varsa olabilir! Basit bir değer girmek yerine değişkene bir expression (ifade) de atayabilirsiniz. Mesela skoru ikiye katlamak için score değişkeninin değerini  2*score olarak değiştirirsiniz.

If a variable has a value (Eğer bir değişkenin değeri şuysa). Bu aksiyon ile bir değişkenin değerini kontrol edersiniz. Eğer değişkenin değeri girilen değere eşitse, soru true (doğru) cevabını döndürür ve sonraki aksiyon veya aksiyonlar bloğu gerçekleştirilir. Eğer eşit değilse ise, sonraki aksiyon veya aksiyonlar bloğu gerçekleştirilmez. Ayrıca girilen değerin değişkenin değerinden büyük ya da küçük olup olmadığını da test edebilirsiniz. Aslında sadece değişkenleri test etmekle sınırlı değilsiniz ayrıca bu aksiyonla istediğiniz ifadeyi de (expression) test edebilirsiniz.

Aşağıda bu aksiyonların kullanımıyla ilgili birkaç örnek göreceksiniz.

Burada değişkenlerle ilgili bilmeniz gereken bir şey daha var. Yukarıda da belirttiğim gibi bir kopyaya ait olan yerel değişkenler vardır, bunların haricinde de evrensel değişkenler vardır. Eğer kendi değişkeninizi kullanırsanız onların daima yerel değişkenler olacağını bilin. Yani sadece aksiyonlarında kullanacağınız kopya içinde geçerlidirler. Eğer kendi evrensel değişkenlerinizi tanımlamak isterseniz isimlerinin başına global takısı ve bir de nokta koymalısınız. Yani örneğin global.bonus adında bir değişken kullanarak oyuncunun topladığı bonus puanları bunun içinde saklayabilirsiniz. Değişken isimleri kullanırken daima dikkatli olun, daha önce tanımlanmış bir şey olmamalı ve herhangi sprite, ses, vb. isminin de aynısı olmamalı. Bunu aşmanın bir yolu değişkenlerin başında her zaman bir takı kullanmaktır, var_ gibi.

1945

Şimdi gelin oluşturacağımız oyunu inceleyelim. Bir oyun oluşturmadan önce daima bir dizayn belgesi yazmalıyız. 1945 oyunu için tam bir dizayn belgesi yazsak birkaç sayfa tutabilirdi. Bundan kaçınmak için ve eğitimi çok uzatmamak için burada sadece kısa bir açıklama ile yapacaklarımızı anlatacağız. Oyunumuz şunun gibi bir şey olacak:

1945 Dizayn Belgesi

Açıklama

Bu oyunda denizin üzerinde uçan bir uçağı kontrol ediyoruz. Bizi yok etmeye çalışacak olan düşmanlarla karşılaşacağız Onlardan kaçınacak ya da onları vuracağız. Hedefimiz elimizden geldiği kadar hayatta kalıp yok edebildiğimiz kadar düşman uçağı yok etmek.

Oyun Objeleri

Arkaplan denizden ve birkaç adadan oluşacak. Oyuncunun uçağı denizin üzerinde uçacak. Düşmanı yok etmeye yarayan kurşunlar ateş edilebilecek. 4 çeşit düşman uçağı olacak: Yüz yüze geldiğiniz ve yok etmeniz gereken bir uçak, aşağı yönde ateş eden bir uçak, oyuncunun uçağına doğru ateş eden bir uçak, ve oyuncunun uçağının arkasından oyuna dâhil olan hızlı bir uçak.

Sesler

Oyunda birkaç patlama sesi ve bir de arkaplan müziği olacak.

Kontroller

Oyuncu ok tuşlarıyla hareket edecek. Space (Boşluk) tuşu ile kurşun atacak. Her beş stepte (adım) bir kurşun ateşlenebilecek.

Oyun Akışı

Oyuncu derhal oyuna başlayacak. Oyuncunun üç yaşam hakkı olacak. Tüm haklar bittiğinde yüksek skor tablosu gözükecek. <F1> tuşuna basmak oyunla ilgili bir yardım metni açacak. <ESC> tuşuna basmak ise oyunu bitirecek.

Bölümler

Sadece bir bölüm olacak, ama gitgide daha fazla düşman gelecek: önce sadece kolay olan, ama ilerledikçe daha zor olanlar gelecek.

Oyuncu yukarı doğru uçan sarı uçağı kontrol edecek. İki düşman uçağı türü yukarıda gözüküyor. Altta skor, hak aysısı ve hasarı (yeşil çubuklu form) gösteren bir panel olacak.

Ö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.

Hareket İlüzyonu (Kandırmacası)

Bir scrolling shooter oyunu ismini oyunda dünyanın ekranda hareket etmesine borçludur, normalde yukarıdan aşağı veya sağdan sola bir hareket. Bu bir hareket ilüzyonudur. 1945 oyununda dünya dikey olarak hareket etmektedir. Oyuncunun kontrol ettiği uçak olduğu yerde dursa bile uçağın hareket halindeki bir dünyada ilerlediği hissi oyuncuya verilir. Uçağın pozisyonunu ekranda dolanarak değiştirebilirsiniz. Bu uçağın ileri gittiğinde hızlandığı, geri gittiğinde ise yavaşladığı hissini verir. Ancak uçağın arkaplanın hızından daha hızlı bir şekilde geriye gidememesi çok önemlidir. Bu uçağın geriye doğru uçtuğu hissini verir ve bu da henüz gerçekte mümkün değildir.

Peki nasıl Game Maker ile hareket eden arkaplanı olan bir scrolling shooter oyunu yapacağız? Aslında iki seçeneğimiz var. İlki ve en kolay olanı döşeli bir arkaplan resmi kullanıp ona aşağı yönde bir hız vermektir. İkinci ve daha karmaşığı ise çok büyük bir oda oluşturup bir view (görünüm) kullanarak odanın sadece bir bölümünü oyuncuya göstermektir. Bu view yavaşça odada yukarı doğru ilerler. Önce birinci şık ile başlayacağız, sonra ise ikinci seçeneği de gözden geçireceğiz.

Oyunumuz denizin üzerinde geçtiği için yukarıdan gözüken bir deniz hissi uyandıran arkaplana ihtiyacımız var. Alttaki resmi arkaplan kaynak dosyası türü olarak kullanıp ona isim vereceğiz. (Bu resmi Kaynak Dosyaları içinde water ismi altında bulabilirsiniz.)

back_water:

Odayı bunla doldurmak güzel bir deniz oluşmasını sağlayacak. Bir hızla ilerleyen arkaplana sahip oda oluşturmak için basit bir yol kullanacağız. Sol tarafta backgrounds(arkaplanlar) sekmesine tıklayın. Burada üç seçeneği değiştirmeliyiz. Öncelikle tüm odayı arkaplan resmiyle dolduracağımız için arkaplanın bir renkle doldurulmasına ihtiyacımız yok, bu yüzden Draw background color(Arkaplan rengi çiz) ifadesindeki tiki kaldırıyoruz. İkinci olarak, ortadaki menüden arkaplan olarak back_water arkaplanını seçiyoruz. Normal olarak tüm odanın kaplanması seçeneği seçili olacak ki biz de bunu istiyoruz. Son olarak da arkaplanın hareket etmesini istiyoruz. Bunun için alttan Vert. speed(Dikey Hız) değerini 2 giriyoruz. Şimdi bu ekran şöyle durmalı:

Oyunu çalıştırın ve arkaplanda hareket eden bir dünya hissini uyandıran hareketli arkaplanınızı görün. Hareket hissini güçlendirmek için birkaç tane de ada ekleyeceğiz. Bunun için kolay bir yol büyük bir arkaplan oluşturup ona birkaç ada eklemek olabilirdi.

Bunun dezavantajı ise adalar hep düzenli bir sıraya göre gelecek ve oyuncu sonunda bunu çakacak. (Bunu çizgi filmlerde görmüşsünüzdür, koşan bir karakterin arkasındaki arkaplan sürekli kendini tekrar eder.) Bu yüzden birazcık daha karmaşık bir yol kullanacağız ve adaları birer obje olarak tanımlayacağız. Yani öncelikle üç tane sprite oluşturacağız. Spriteler arkaplanda gözükmektedir (Spriteleri eklerken Remove Background(Arkaplanı Sil) seçeneğini işaretleyerek arkaplandaki siyah kalıptan kurtulun.) (Adaları Kaynak Dosyaları içinde island1, island2 ve island3 adları altında bulabilirsiniz.)

Bu adaları hiçbir zaman temas olayları için kullanmayacağımız için en iyisi Precise collision checking(Kesin Temas Kontrolü) işaretini kaldırın. Adaların her biri için obje oluşturun. Create (Oluşum) eventinde objeye arkaplanın hızıyla aynı dikey hızı veriyoruz. Bu sayede adalar arkaplanın parçasıymış gibi gözükecekler. Çünkü denizde konumları hep aynı duracak. Diğer tüm objelerin adaların üzerinde gözükmesi için adalara Depth(Derinlik) değeri olarak 10000 girin. (Bunu yapmak için Game Maker’ı advanced modda çalıştırmalısınız!) Objelerin kopyaları derinlik esas alınarak çizilir. Yüksek derinliğe sahip objeler önce çizilir. Daha düşük derinliğe sahip objeler ise onların üzerine çizilir. Yani adalara yüksek bir derinlik girerek her zaman önce onların çizilmesini sağlayıp diğer tüm objelerin altında yer almasını sağladık.

Bir başka şeyin daha yapılması lazım. Ekranın altında kaybolan adaların tekrar ekranın tepesinden belirmesi lazım. Bunun için Step(Adım) olaylarında adanın ekranın altından kaybolup kaybolmadığını test edeceğiz, eğer kaybolmuşsa da tepeden tekrar belirmesini sağlayacağız. Değişken y’nin dikey pozisyonu ifade ettiğini unutmayın. (0 değeri odanın tepesini ifade eder!) room_height değişkeni odanın yüksekliğini belirtir. Yani adalar eğer y değişkenleri room_height’denbüyük ise ekranın altından kaybolurlar. Yani bir aksiyon yardımıyla adanın altta kaybolup kaybolmadığını test edebiliriz:

Göreceğiniz gibi değer olarak farklı bir değişken adını girebilirsiniz. Ayrıca buraya tamamen expressionlar da (ifade) girebilirsiniz.

Odanın tepesinde tekrar belirme için Jump to a position(Bir noktaya zıpla) aksiyonu kullanacağız. Biz eğer ada alttan kaybolursa tepeden rasgele bir konumda yeniden belirmesini istiyoruz, belli bir konumdan değil. Rasgele bir pozisyonda yeniden oluşturunca adaların tekrar belirdiği yerler arasında az bir benzerlik olacak. Yani oyuncu aynı adanın belirdiği hissine kapılmayacak. Ama nasıl rasgele bir değer verebiliriz? Bunun için random() adında bir fonksiyon bulunur. Bir fonksiyon nedir diye sorabilirsiniz. Bir fonksiyon çeşitli argümanların değerlerine bakarak bir değeri hesaplar (veya bir aksiyonu gerçekleştirir). Argüman(lar) fonksiyon isminden sonraki parantezlerin arasına yazılır. Değer girebildiğiniz her yerde ayrıca fonksiyonlar ya da değişkenler de kullanabilirsiniz (veya bunların hepsini kapsayan expressionlar(ifade)). Game Maker’da pek çok fonksiyon bulunur. Ama şu an için sadece random() fonksiyonuna ihtiyacımız var. Bir konuma zıplama aksiyonunda x koordinatı olarak random(room_width) girin. Bu 0 ile odanın genişliği olan değer arasında rasgele bir değer döndürür, yani istediğimiz gibi. Yani zıplama aksiyonu aşağıdaki gibi durmalıdır:

Y pozisyonu için -65 kullanarak adaların odanın tamamen dışında başlamasını sağlıyoruz. Dikey hızı sayesinde kısa sürede odada belirecektir.

Bunu tüm üç ada objesi için de yapmalıyız. Geriye kalan şey ise odada farklı yüksekliklere üç oda objesinden koymak; ve artık hareketli arkaplanı bitirmiş oluyoruz. Adalar düzenli bir sıklıkta belirmesine rağmen pozisyonlarından dolayı oyuncu adaların aynı olduğunu fark edemeyecek. Ayrıca isterseniz adaların zıplama aksiyonlarındaki y değerini negatif bir rasgele değer olarak girerek (random(-100) gibi) adaların oluşmasında bir farklılık yapabilirsiniz.

Ana Uçak

Artık hareketli arkaplan hazır olduğuna göre oyuncunun kontrol ettiği uçağı oluşturmanın sırası geldi. Bu aslında biraz kolay olacak. Her şeyden önce uçak için bir spriteye ihtiyacımız olacak. Bir pervaneli uçak kullanacağız. Pervanenin hareketinin hissedilmesi için üç resim parçasında pervane hariç uçağın gerisi aynı kalacak şekilde çizilmiştir: (myplane_strip3 adı altında Kaynak Dosyaları içinde bulabilirsiniz.)

Bu gibi animasyonlu spriteler sonu _stripXX ile biten dosyalarda bulunur, XX değeri ise subimage (alt resim) sayısını belirtir. Örneğin uçak myplane_strip3.png adı altında Kaynak Dosyaları klasöründe bulunur. Bu spriteyi oluştururken önemli bir şeyi yapıyoruz. Origin (Orjin) noktasının X ve Y koordinatlarını 32 olarak belirliyoruz. Bunun anlamı spritenin orjin noktası uçağın tam merkezi olacak. Yani ne zaman uçağın pozisyonunu ayarlasak veya test etsek, uçağın merkezinin pozisyonunu kastetmiş olacağız, sol üst köşesini değil yani; ki normalde sol üst köşesi orjin olarak belirlenir. Kurşunların uçağın merkezinden çıkması için bu önemlidir, uçağın sol üstünden çıkmaması için de 🙂

Sırada obj_myplane adında objemizi oluşturuyoruz. Sprite olarak az önce oluşturduğumuz uçak spritesini seçiyoruz. Depth(Derinlik) değerini ise –100 yaparak uçağın sonradan oluşturacağımız kurşunların vs. üzerinde yer almasını sağlıyoruz. (Derinlik mevzusu çoğu oyun için çok önemli bir şeydir. Bunu nasıl kullanacağınızı bilseniz iyi olur.)

Hız için sadece uçağın hareketini ayarlamamız yeterli olacak. Oyuncu hiçbir şey yapmadığında uçak hareket etmeyecek. (Hatırlayın, arkaplan hareket ediyor, uçak değil.) Eğer oyuncu dört ok tuşundan birine basarsa uçak o yönde hareket etmelidir. Bizim burada asıl kriterimiz ise uçağın odanın dışına çıkamaması olmalı. Bunun için de hareketi kendimiz kontrol edeceğiz, yani uçağa bir hız verip bitirmeyeceğiz. Şimdi bunu yapacağız.

Önce sol ok tuşu için hareketi tanımlayalım. <Left> (Sol) ok tuşu için Keyboard eventi ekleyin. Öncelikle sol tarafa çok yakın olup olmadığımızı kontrol etmeliyiz. Bunun için değişken x’in 40’dan büyük olup olmadığını, aynı adalarda y koordinatını test ettiğimiz gibi test edin. Eğer true (doğru) değeri dönerse uçağın küçük bir miktar sola gitmesini istiyoruz. Bunun için “Jump to a position(Bir noktaya zıpla)” aksiyonunu kullanacağız. Burada x koordinatını -4 girip y’yi 0 yapacak ve Relative kutucuğunu işaretleyeceğiz. Sakın Relative’yi işaretlemeyi unutmayın. Sağ ok tuşu için de benzer bir şey yapacağız. X’in  room_width-40’dan küçük olup olmadığını kontrol edeceğiz, eğer öyleyse x için 4, y için 0 olan Relative koordinatları gireceğiz. Dikey hareket için de aynını yapacağız, ama bu sefer -2 ve 2 olan y hızlarını kullanacağız. (Hatırlayın, asla arkaplanın hızından daha hızlı geriye gidememeliyiz.) Ayrıca pozitif y değerinin aşağı yönde olduğunu unutmayın. Yani yukarı yönde hareket için mevcut y pozisyonundan 2 çıkarmalıyız. Ekranın altında hareket sınırı olarak 120 pixel belirliyoruz. Burası daha sonra bazı oyun bilgilerini sunacağımız panel için kullanılacak.

Artık uçağımız uçabilir. Odaya uçağın bir kopyasını yerleştirip oyunu çalıştırın. Denizin üzerinde uçtuğunuz hissini hissedeceksiniz. Eğer bu aşamaya kadar kendiniz yapmak istemiyorsanız şimdiye kadarki aşamaları 1945_1.gmk adı altında Örnekler klasöründe bulabilirsiniz.

Düşman ve Silah

Bir scrolling shooter ateş edemiyorsak ve düşman yoksa nedir ki? Yani şimdi oyuna birkaç düşman uçağı ve bir de uçağın ateşleyeceği kurşunu ekleyeceğiz. Bu versiyonu 1945_2.gmk içinde bulabilirsiniz.

Önce silahımızla başlayalım. Bir kurşun spritesine ihtiyacımız var. (Alttaki kurşun spritesini Kaynak Dosyaları içinde bullet adı altında bulabilirsiniz.) Bunun da orjin noktasını tıpkı uçağınki gibi merkez yapıyoruz. Kurşunumuzu biraz gösterişli kılmak için büyük bir kurşun kullanıyoruz. Olayları biraz abartmak çoğu oyunda önemlidir.

Bu sprite ile bir kurşun objesi oluşturuyoruz. Bunda normal olarak derinlik değerini 0 bırakıyoruz ki uçağın arkasında, adaların üstünde gözüksün. Objenin davranışları biraz kolay olacak. Create (Oluşum) eventinde buna -8 vertical speed(dikey hız) verip yukarı yönde hareketini sağlayacağız. (Bunu Speed Vertical aksiyonuyla yapabilirsiniz.) Bir kurşunun sürekli oyunda kalıp oyunu yavaşlatmasını engellemek için odanın dışına çıkınca onu yok edeceğiz. Bunu yapmak çok kolay. Step (Adım) eventinde y değişkeninin -16’dan küçük olup olmadığını test edeceğiz. Artık bunun nasıl yapılacağını biliyor olmalısınız. Eğer değeri -16’dan küçükse de Destroy Instance ile onu yok edeceğiz. (Ayrıca Outside room eventi ile de aynı işlemi test edebiliriz. (Eventler içinde Other sekmesinde bulunur.))

Kurşun oyuncu Space tuşuna basınca ateşlenmeli. Çoğu shooter oyununda olduğu gibi uçağımız bu tuşa basılı tutulduğu sürece ateş etmeli. Ama aynı anda çok fazla kurşun da istemiyoruz. Bu oyunu çok kolay yapabilir. Oyuncunun her saniyede 2 kurşun ateşleyebilmesini, yani her 15 stepte (adım) bir kurşun atabilmesini istiyoruz. Bunun için önceden belirttiğimiz can_shoot değişkenini kullanacağız. Uçağın oluşum olayında bu değişkenin değerini 1 yaparak ateş edilebileceğini belirtiyoruz. Space tuşu eventinde de bu değişkenin 1 olup olmadığını test ediyoruz. Eğer öyleyse tam uçağın ortasında, yani relative olarak (0,-16) koordinatlarında kurşun objesinin bir kopyasını oluşturuyoruz. Ayrıca can_shoot değişkenini tekrar 0 yaparak artık ateş edilemeyeceğini bildiriyoruz ve alarm0’ı 15 adıma kuruyoruz. Hatırlayın alarmlar 0 olana kadar her stepte 1 değer kaybederler. Bir alarm 0 olduğunda ise alarm eventi gerçekleşir. Bu eventte can_shoot değişkenini tekrar 1 yapıyoruz, bu sayede tekrar ateş edebileceğiz. Yani artık Space tuşu için event aşağıdaki gibi olmalıdır:

Ateş etme hızını alarm saatinin değeriyle oynayarak değiştirebilirsiniz. (Bazı oyunlarda Space tuşuna sürekli basıp çekerseniz daha hızlı ateş edersiniz. Bu benzer bir aksiyon seti kullanarak Space Key Pressed eventi sayesinde olabilir, ama bu sefer değişkenin değerini kontrol etmeyerek.)

Hadi şimdi ilk düşmanı yapalım. Bu aşağı doğru uçan basit bir uçak olacak. Ateş etmeyecek, ama bizim uçağımıza çarpınca oyunu bitirecek. Şimdi düşman uçağı için bir sprite ve bir obje oluşturun. (Spriteyi Kaynak Dosyaları içinde enemy1_strip3 adı altında bulabilirsiniz.) Oluşum olayında dikey hızı 4 yaparak aşağı doğru uçmasını sağlıyoruz. Uçak odanın dibine ulaştığında odanın tepesinde rasgele bir konumda tekrar oluşmasını sağlıyoruz, aynı adalarda yaptığımız gibi. Artık bunu nasıl yapacağınızı biliyor olmalısınız.

Düşman uçağı için iki önemli temas (collision) olayı belirtmeliyiz: kurşunla temas, ki bu temas o düşman uçağı kopyasını yok edecek; ve bir de ana uçakla temas k, bu da ana uçağı yok edip oyunu bitirecek.

Önce kurşunla temas olayından başlıyoruz. Birkaç aksiyon gerekli burada. Ama her şeyden önce patlamayı belirten bir sese ve bir de bir patlama spritesine ihtiyacımız var. Sesi oluşturmak için Add Sound (Ses Ekle) butonuna basıp güzel bir patlama sesi kullanın. (Örnekle gelen Kaynak Dosyaları içinde snd_explosion1 sesini kullanabilirsiniz.) Patlama için küçük bir spriteye ihtiyacımız olacak. (Bunu da Kaynak Dosyaları içinde explosion1_strip6 adı altında bulabilirsiniz.) Aynı düşman uçağındaki gibi orjini (16,16) yapıyoruz. Ayrıca bir patlama objesi oluşturup buna şimdi oluşturduğumuz patlama spritesini ekliyoruz. Bu obje bir şey hariç hiçbir şey yapmayacak ki o şey de patlama animasyonu bitince kendini yok etmesidir. Bunun için Animation End (Animasyon Sonu) isimli bir event Other events sekmesinde bulunur.

Ses ve patlama objesi hazır olduğuna göre düşman uçağının kurşunla temas olayını doldurabiliriz. Şimdi bize şu aksiyonlar gerekli. Öncelikle patlama sesini duyuracağız. Sonra kurşunu yok edeceğiz. Bunun için Destroy Instance aksiyonunu kullanabilirsiniz ama tepeden Other (Diğeri) seçeneğini seçmeyi unutmayın, bu durumda o aksiyon kurşuna uygulanacaktır. Sonra patlama objesini relative olarak (0,0) koordinatlarında oluşturuyoruz, yani tam düşman uçağının üstünde. Düşman uçağını yok etmiyoruz! Sadece onu alıp odanın tepesinde rasgele bir konumda tekrar odaya sokuyoruz, yani yeni bir uçak geliyormuş gibi yapacağız. Son olarak da skoru relative olarak 5 artırıyoruz. Burada relative’ye ihtiyacımız var çünkü skora 5 eklemek istiyoruz, skoru 5 yapmak değil. Yani şimdi event şöyle gözükmelidir:

Şimdi de ana uçakla temas olayını yapmalıyız. Tekrar bir patlama spritesine (Bu sefer birazcık daha büyük) ve bir patlama sesine (Biraz daha yüksek) ihtiyacımız var. (Patlama spritesini explosion2_strip7 adı altında, patlama sesini de snd_explosion2 adı altında Kaynak Dosyaları klasöründe bulabilirsiniz.) Sesi ve patlama spritesini oyuna ekliyoruz. Tekrar bir patlama objesi yapıyoruz, ama bu seferki obje biraz daha özenle hazırlanmış olacak, çünkü aynı zamanda oyunun sonunu da getirmeye yarayacak. Bu patlama objesinin Animation End (Animasyon Sonu) eventinde birkaç şey yapacağız. Önce patlama objesini yok ederek görünmez kılacağız. Ardından patlama sesi bitene kadar sleep (uyuma) aksiyonu kullanacağız. Sonra yüksek skoru göstereceğiz, bu ekranda oyuncu adını ve soyadını girip yüksek skorunu görebilir. Bunların hepsi Game Maker’da otomatik olarak işler. Aynı zamanda yüksek skor tablosunun görünüşünü de değiştirebilirsiniz, güzel bir arkaplan resmi, font vs. kullanabilirsiniz. Bununla biraz uğraşıp deneyimlemelisiniz. Son olarak da oyuna restart atıyoruz. Yani event şöyle gözükmelidir:

Düşman uçağıyla ana uçağın temas olayında ise ana uçağı Change Instance (Kopyayı Değiştir) ile patlama objesine değiştiriyoruz. Ayrıca patlama sesini oynatıyoruz ve düşman uçağını da yok ediyoruz.

Son kalan şey ise odaya bir düşman uçağı koymak ama biz bunu biraz farklı bir şekilde yapacağız. Güzel bir oyun gitgide zorlaşır. Yani önce tek bir düşmanla başlayıp ardından zamanla daha çok düşmanla kapışmalıyız. Bunun için bir obje daha yapıyoruz, ismini de controller_enemy koyuyoruz. Bu obje düşman uçaklarının oluşumunu kontrol edecek. Objeyi görünmez yapıyoruz, bunun için Visible (Görünür) tikini kaldırıyoruz. Bu objeye sprite gerekmiyor. Objenin oluşum olayında (event) odanın tepesinde rasgele bir konumda bir düşman oluşturuyoruz. Bu ilk düşman olacak. Ayrıca alarm saatini de 200’e kuruyoruz. Bu alarm saatinin eventinde tekrar bir düşman uçağı oluşturuyoruz ve tekrar alarm saatini kuruyoruz, ama bu sefer 500 adıma. Hepsi bu. Yaptığımız şey şu: oyunun başında sadece bir düşman uçağı olacak. 200 adım (step) sonra, yaklaşık yedi saniye sonra, ikinci bir düşman uçağı belirecek. 15 saniye kadar sonra da üçüncü uçak belirecek vs. (İkinci uçağın daha erken gelmesinin sebebi oyunun sadece bir düşman uçağıyla çok sıkıcı olmasıdır.) odaya kontrol objesinin bir kopyasını yerleştirin, ve bitti! Bu 1945’in ikinci versiyonunu bitiriyor. Bir düşmanı olan oynanabilir bir oyuna sahibiz artık 🙂

Skorlar, Canlar ve Hasar

Oyunda ne zaman düşmana çarpsak oyunun bitmesi biraz kaba duruyor. Oyunu biraz daha ilgi çekici yapmak için düşmanların hasar oluşturmasını sağlayacağız. Sadece uçak çok hasar alırsa yok olacak. Ayrıca birden çok hakkımız olacak ve bu bilgileri skorla birlikte göstermesi için güzel bir bilgi paneli oluşturacağız. Ne üzücü ki(!) bunu yapmak Game Maker ile çok kolay. Çünkü Game Maker’ın skorla, haklarla, ve canla uğraşabilen bir mekanizması zaten mevcut (hasarın tersi olacak). Yeni oyun 1945_3.gmk adı altında Örnekler klasöründe bulunabilir.

Tüm bu şeyleri yapmak için controller_life adında yeni bir obje oluşturacağız. Bunun da spriteye ihtiyacı yok, çünkü ekrana yazdıracaklarını Draw(Çizim) olayı ile yapacak. Bildiğiniz gibi her adımda kopyanın spritesi odanın doğru konumunda çizilir. Ama Draw eventine aksiyon koyarsanız bu artık meselemiz olmaktan çıkar. Bu aksiyonlar neyin çizileceğini belirlerler. Burada sadece çizim için bir sürü aksiyon bulur. Çoğu da Draw aksiyon sekmesinde yer alır. Ama ayrıca burada farklı aksiyonlar da kullanabilirsiniz. Çizim olayları sadece Draw eventinde işe yararlar. Diğer herhangi bir eventte basit bir şekilde kabul edilmezler.

İlk önce bilgi paneli olarak görev alacak olan bir sprite oluşturuyoruz. (Kaynak Dosyaları içinde bottom ismi altında bulabilirsiniz.) Sprite şekildeki gibi olmalıdır:

Bu skoru, hasarı (Soldaki siyah bölge) ve kalan uçak sayısını, yani canı gösterecek. controller_life objesinin Draw eventinde bu bilgi panelini Draw Sprite aksiyonu ile odanın doğru köşesinde çizdireceğiz. Parametreleri şekildeki gibi gireceğiz:

Bu doğru spriteyi ekranın alt tarafında gösterecek. (Subimage (Altresim) değerini -1 yapmanın anlamı o anki alt resmin çizilmesidir. Bu resimde sadece bir alt resim olduğu için bizimle alakası yok, ama eğer bir sprite birden çok altresme sahipse hangi altresmin gösterileceğini buradan belirtebilirsiniz.) Alttaki bu panelin her şeyin üstünde yer almasını sağlamak için controller_life objesine -10000 derinlik veriyoruz.

Controller_life objesinin oluşum (Create) olayında skoru(score) 0, can sayısını(lives) 3, sağlığı da(health) 100 olarak ayarlıyoruz. Bunun için Score sekmesindeki aksiyonları kullanabilirsiniz. Skoru çizmek için Score sekmesinde ilgili aksiyonu kullanacağız. (Ama önce çizim rengini(drawing color) sarı yapın.) Skoru çizme aksiyonunda(draw the score) parametreleri alttaki gibi dolduruyoruz (Başlığa(caption) gerek yok çünkü spritede zaten başlık var):

Canları çizmek için ise farklı bir mekanizma kullanacağız. Sadece sayı olarak canları belirtmek yerine canlar için uçağımızın küçük resmini kullanacağız. Bunun için uçağın küçük bir spritesine ihtiyacımız var. (Kaynak Dosyaları içinde life resmi işinizi görecektir.) Bunun için Score sekmesinde bir aksiyon mevcuttur.

Artık skoru ve can sayısını gösterdiğimize göre artık o bilgilerin oyunun ekranındaki başlıkta yazmasına gerek yok. Score sekmesinde ekranın başlığında neyin yazıp yazmayacağını belirleyebileceğimiz bir aksiyon bulunur. (Score Caption) Bunu objenin oluşum olayına koyun ve hiçbir şeyin gözükmemesini belirtin.

Ayrıca canı çizmek için de özel bir aksiyon bulunur. Can bir can çubuğu olarak gözükür. Pozisyonunu, boyutunu, ve renk seçimini değiştirebilirsiniz. Bu ekrandaki parametreleri de şöyle giriyoruz:

Artık Draw eventi şekildeki gibi durmalıdır:

Ama hâlâ sağlığı ve canları kontrol altında tutmalıyız. Öncelikle düşman uçağıyla ana uçağın temas olayında değişiklik yapmalıyız. Artık ana uçağı yok etmemeli, sadece kendisi yok olmalı(Bir patlamaya dönüşerek) ve canı azaltmalı; bu yüzden bu eventte canı relative olarak -30’a ayarlayın. (Yani 3 çarpışmaya dayanabiliriz.)

Controller_life objesi canın 0’dan küçük olup olmadığını kontrol edecek. Bunun için Other altında bir event bulunur. (No More Health, yani Hiç Sağlık Kalmadıysa) Bu eventte ana uçağı büyük bir patlamaya dönüştürerek yok ediyoruz. Ayrıca canı tekrar 100 yapıp doğru sesi oynatıyoruz. Yani event şekildeki gibi durmalıdır:

Büyük patlama objesi Animation End (Animasyon Sonu) olayında (event) kendini yok etmelidir. Ardından sesin bitimine kadar uyumalı, ve mevcut pozisyonda ana uçak kopyası oluşturmalıdır (Bu relative (0,0) pozisyonudur.) ve can sayısını azaltmalıdır, relative olarak -1 parametresiyle.

Son olarak da canların bitip bitmediğini kontrol etmeliyiz. Ne güzel ki bunun için de hazır bir event var. Controller_life objesi için No More Lives (Hiç Can Kalmadıysa) eventinde yüksek skor tablosunu gösterip oyuna restart atmalıyız. Bu oyunun üçüncü versiyonunu bitiriyor. Artık oyunu oynayabilirsiniz, şu an bile epey güzel duruyor. Ama zamanla oyun sıkıcı olacaktır. Bunun için üzerinde biraz daha uğraşıp biraz çeşitlilik katmalıyız.

Daha Çok Düşman

Bu bölümde oyuna 3 yeni düşman türü ekleyeceğiz. Biri aşağı yönde kurşun ateşleyecek. İkincisi oyuncuya doğru kurşun ateşleyecek. Üçüncüsü de ateş etmeyecek ama ekranın altından gelecek ve kaçınması veya vurması daha zor olacak. Onları oyunda zaman geçtikçe oyuna dâhil edeceğiz. Yeni versiyon 1945_4.gmk adı altında Örnekler klasöründe bulunabilir.

Yeni bir düşman için yeni bir spriteye ihtiyacımız var, ilk düşman gibi, ancak farklı renge sahip. (Kaynak Dosyaları içinde enemy2_strip3 işinize yarayacaktır.) İkinci olarak da bu düşman için de bir objeye ihtiyacımız var. Bu uçak ilk düşmanın hemen hemen aynısı olacağı için onu kopyalayacağız. (Ona sağ tıklayıp Duplicate(Klonla) demek yeterli olacaktır.) Yeni klonlanmış objeye çift tıklayarak onu açın. Yeni bir isim verin ve doğru spriteyi ayarlayın. Bu uçak daha zorlu olacağından vurulduğunda daha çok skor vermeli. Yani kurşunla temas olayında skorun değişim miktarını 10 yapın.

Bu uçağın ateş etmesi için bir kurşun spritesi ve objesi lazım. (Kaynak Dosyaları içinde enemybullet1 spritesini kullanabilirsiniz.) Bu kurşun objesinin oluşum olayında ona aşağı yönde bir dikey hız verin. Step (Adım) olayında kurşunun odanın dışına çıkınca yok olmasını sağlayın. Kurşunun ana uçakla temas olayında ise canı relative olarak -5 yapın, kurşunu yok edin, ve bir ses çalın.

Düşman uçağının belli aralıklarla ateş etmesini sağlamalıyız. Bunu o uçağın step(adım) olayında yağacağız. Zar fırlatma aksiyonu (control sekmesi altında Test Chance aksiyonu(Zar resimli olan)) kullanıp parametreyi 30 gireceğiz. Bunun anlamı sonraki aksiyon ortalama her 30 adımda bir gerçekleşecek. Sonraki aksiyonda ise düşman kurşununu oluşturun.

Son olarak da ikinci düşman uçağının oyunda biraz vakit geçince oyuna girmesini sağlayacağız. Bunun için controller_enemy objesini kullanacağız. Oluşum olayında alarm 1’i 1000 olarak girin. Bu alarm olayında ise ikinci uçağı oluşturup alarm 1’i tekrar, ama bu sefer 500 adım olarak girin ki düşman uçağı bu sefer daha erken gelsin. Yani bu uçak ilk önce yaklaşık 30 saniye sonra belirecek ve ekstra bir tanesi de ortalama her 15 saniyede oyuna eklenecek.

Sonraki düşman türü için tekrar yeni bir spriteye ve kurşun spritesine ihtiyacımız var. (Uçak spritesi enemy3_strip3 adı altında, kurşun spritesi ise enemybullet2 adı altında Kaynak Dosyaları içinde yer alır.) İkinci düşman uçağının kopyasını oluşturun ve bizim kurşunumuzla temas olayında skoru bu sefer 20 olarak artırın. Ayrıca ikinci bir düşman kurşunu objesi oluşturun. Düşman uçağı bu yeni tip kurşunu adım olayında oluşturacak. Tekrar zar aksiyonu kullanıyoruz, ama bu sefer sadece 80 adımda bir kurşun oluşturuyoruz, çünkü yeni tür kurşun kaçması daha zor bir şey olacak.

Bu yeni tip kurşun objesi ise şöyle olacak. Oluşum olayında Move Towards(Noktaya Doğru İlerle) aksiyonu ile bir konuma ilerleyeceğiz. Ama bu hangi konum olabilir? Pekâlâ, biz ana uçağın olduğu noktaya doğru ateş etmesini istiyoruz. Bunun için de objenin kopyasının x ve y koordinatlarını bilmemiz gerekli. Bu Game Maker’da kolayca bulunabilir. Bir değişkenin değerini başka bir kopyada uygulamak için değişken ismini obje ismiyle kullanacağız. Yani uçağın x koordinatı için obj_myplane.x kalıbı kullanacağız. Bu objenin birden çok kopyası varsa ilk kopyanın değerini alırız. Eğer objenin hiç kopyası yoksa da bir hata mesajı alırız. Bu ana uçağımız yok edilince bir süre ortada olmadığında sorun çıkarabilir. Bu yüzden en iyisi önce odada bizim uçağımızdan var mı yok mu kontrol edelim. Bu; bir objenin odadaki kopyalarının sayısını test eden bir aksiyonla kolayca yapılabilir. (control sekmesinde Test Instance Count (Kopya Sayısını Test Et) aksiyonunu kullanın.) Bunu ana uçağın olup olmadığı için kullanın, eğer varsa, kurşunu ana uçağa doğru ilerletin. Değilse de dikey olarak aşağı yönde atın. Yani oluşum olayı şekildeki gibi durmalıdır:

Şimdi bir noktaya hareket aksiyonu şekildeki gibi olmalıdır:

Bir başka değişiklik daha lazım. Kurşun herhangi doğrultuda uçabileceği için kurşunun odanın dışına çıkıp çıkmadığını step eventinde test etmek zor olur. Ama aslında sırf bunun için Outside(Dışarıda) adında özel bir event vardır. Bu olayda basitçe kurşunu yok edeceğiz.

Son olarak da yani düşman türünün oluşumunu ayarlamalıyız. Önceden de belirttiğimiz gibi bunun için controller_enemy objesini kullanacağız. Oluşum olayında alarm 2’yi 2000 adıma kurun. Bu alarmın olayında (event) ise bu yeni düşman türünü oluşturup alarm 2’yi bu sefer 1000 adımda kurun.

Bu üçüncü uçak tipini oluşturmamızı bitirdi. Sadece alttan gelen uçak kaldı. Bu aynı ilk uçak gibi olacak, tek farkı alttan gelip yukarı yönde ilerleyecek. Bu uçağı artık kendiniz yapabilecek düzeydesiniz. (Uçak için Kaynak Dosyaları içinde enemy4_strip3 spritesini kullanabilirsiniz.) Tekrar controller_enemy objesini kullanarak alarm 3 sayesinde bu sefer de bu uçağın oluşumunu sağlayın, unutmayın oluştururken odanın altından oluşturun. Artık bunu yapabilir seviyedesiniz, ama isterseniz oyun dosyasına bakabilirsiniz.

Bu 1945 oyununun dördüncü versiyonunu bitiriyor. Artık oyun gitgide zorlaşan daha güzel bir oyun oldu. Aslında bunu oynarken zevk alınıyor ve yüksek skor almaya çalışmak da zevksiz değil.

Oyunu Bitirmek

Artık farklı düşman türlerine sahip bir oyunumuz var. Gitgide zorlaşan oynanabilir bir oyun. Ve zevkli de bir oyun. Ama bunu gerçek bir oyun yapmak için hâlâ birkaç rötuş gerekli. Bir arkaplan müziği, yükleme resmi, güzel bir ikon vb. gerekli. Oyunun final versiyonu 1945_5.gmk dosyası içinde bulunabilir. Ayrıca uçakların tekrar oluşumunda bir gecikme sağladım, bu sayede oyuncu için uçaklardan kaçmak yerine onları vurmayı daha ön plana koydum. Ayrıca 400 puanda bir ateş bonusu ve 1000 puanda ikinci bir ateş bonusu koydum.

Aslında bu oyunu kullanıp daha da geliştirebilirsiniz. İşte size birkaç eklenebilir fikir. Genelde bu tip oyunlarda oyuncuya ekstra ateş gücü sağlayan, hasarı tamir eden, ekstra puan sağlayan, ekstra can veren vb. bonuslar bulunur. Bu gibi bonuslar genelde düşman uçağını vurunca veya basit bir şekilde uçuş sırasında rasgele bir yerde belirirler. Ayrıca yeni tip düşmanlar da oluşturabilirsiniz, örneğin odanın sağ veya sol kenarından odaya giriş yapan, veya daha güçlü silahları olan. Bunu size bırakıyorum ki kendi scrolling shooter oyununuzu yapasınız. Kaynak Dosyaları/1945_sprites.bmp dosyasında pek çok sprite bulabilirsiniz. (Ari Feldman tarafından tasarlanmışlardır.) Hepsi de bu oyuna uygundur. Onlarla oyununuzu geliştirebilirsiniz. Bu dosyadan bireysel spriteler oluşturmak için bir sprite oluşturup Edit Sprite (Sprite Düzenle) butonuna basın ve File(Dosya) menüsünden Create from Strip(Şeritten Oluştur) seçin. İstediğiniz resimleri seçin. F1 ile açılan dökümandan daha fazla bilgi alabilirsiniz.

Zaman Çizelgeleri (Time Line) Kullanmak

Bu ve sonraki aşamada Game Maker’ın iki güçlü özelliğini göreceğiz, ki bu özellikler scrolling shooter oyunları için çok önemlidir: zaman çizelgeleri ve görünümler(views).

Oluşturduğumuz oyunda düşmanların oluşması controller_enemy tarafından kontrol ediliyordu. Ayrıca düşman uçakları yok olmuyor, sadece tepeden tekrar beliriyordu. Sonuç ise gitgide artan düşman sayısı sayesinde zorlaşan bir oyundu. Bu güzel olmasına rağmen birkaç sorunu da beraberinde getirir. Öncelikle uçaklar oyun tasarımcısının kontrol edemediği random (rasgele) pozisyonlarda oluşuyorlar. Sonuç olarak iki düşman uçağı üst üste binebilir veya çok mantıklı olmayan bir şekilde birbirine çok yakın olabilir. Ayrıca oyunda birazcık sürpriz oluyor. Düşmanlar rasgele yollardan geliyorlar ve oyuncunun ateş edip kaçınmaktan başka pek bir şey yapabilmesi sağlanmıyor.

Daha ilginç bir oyun için tasarımcı, uçakların oluşumunda daha çok söz sahibi olmalıdır. Hangi zamanda uçakların oluşacağını belirleyebilmelidir. Bu formasyon halinde gelen düşman uçakları, daha zorlayıcı mücadeleler (mesela basit olarak kaçınılması ya da vurulması gereken devasa düşman topluluğu gelmesi) ve biraz değişiklik için gereklidir. Ayrıca oyuncu nasıl oynayacağını öğrenebilir çünkü önceki oynayışlarından kullanışlı şeyler hatırlayabilir. Tüm kaliteli oyunlar üstteki sebeplerden dolayı düşmanlarda daha çok söz sahibidirler. Basitçe, bu iyi bir oyun için gereklidir.

Yani çeşitli düşmanların oluşumunda söz sahibi olmak istiyoruz. Bunun için zaman çizelgesi (time line) kaynak dosyası türünü kullanacağız. Ama önce oyunda bazı küçük değişiklikler yapacağız. Tüm düşman uçakları için artık vurulunca veya odayı terk edince yeniden oluşum istemiyoruz. Basitçe sadece onları yok edin. Yani bir uçak gittiğinde temelli gitsin. Zaman çizelgesi düşmanların oluşumunu kontrol edecek. (Oyunu 1945_6.gmk adı altında Örnekler içinde bulabilirsiniz.) Bu tam bir oyun değildir. Sadece bir başlangıçtır. Bunun üzerinde epey uğraşarak ilgi çekici bir oyun yapabilirsiniz.

Bir zaman çizelgesi şöyle çalışır. İçinde belli zamanlar belirlersiniz (Oyundaki adımlara göre ölçülür.) ve her belli vakitte o vakitte hangi aksiyonların gerçekleşeceğini belirtebilirsiniz. Zaman çizelgesini düşmanlar için kullanacağımızdan sadece düşman uçakları oluşturma aksiyonları kullanacağız. Ama normalde istediğiniz aksiyonları kullanabilirsiniz.

Hadi zaman çizelgemizi oluşturalım. Resources(Kaynak Dosyaları) menüsünden Create Timeline(Zaman Çizelgesi Oluştur) seçeneğini seçin. Bir ekran gelecek, tıpkı bir obje ekranı gibi. Solda zaman çizelgesinin adını belirlersiniz ve altından da vakitleri ekler, siler, ya da zaman çizelgelerini elle oynarsınız. Ortada eklenmiş vakitler yer alır. Bu listenin sağında seçili vakit için aksiyon listesi yer alır. En sağda da sekmeler hâlinde aksiyon listesi yer alır.

0. vakitte bir düşman uçağı oluşturuyoruz. Bunun için Add(Ekle) butonuna basın. Vakit olarak 0 girin. Vakit listeye eklenecek. Şimdi ilgili aksiyonu listeye sürükleyebilirsiniz. Sadece bir aksiyonla bir düşman uçağı oluşturacağız. Bir uçağın 100 adımda odayı boydan boya geçtiği düşünülürse, ikinci vakti 100. adıma ekleyeceğiz. Burada yan yana iki düşman oluşturun. Bu şekilde devam edin. Vakitler ekleyip içlerine de düşman uçaklarının oluşum aksiyonlarını ekleyin. Uçakları farklı yüksekliklerde oluşturarak güzel formasyonlar oluşturabilirsiniz. Birkaç vakit ekledikten sonra ekran şekildeki gibi duracaktır:

400. vakitte 9 uçaklık bir sürü oluşturuyoruz, ikisi kurşun atabilen türden olacak hem de.

Artık fikri kapmış olmalısınız. Sadece vakitler eklemeye devam edip gitgide zorlaşan düşman formasyonları oluşturun, isterseniz aralardaki vakit farklarını azaltabilirsiniz. Biraz uğraş sonunda vakitler grubu yapılmış olup güzel bir oyun bölümü yapmış olacaksınız. Tam bir oyunda farklı zaman çizelgelerini farklı bölümler için kullanırsınız.

Zaman çizelgesinin sonunda oyunu veya bölümü bitiren bir aksiyon eklemelisiniz. Burada bir mesaj gösterip oyunu bitirebilir, veya en iyisi güzel bir bitiş animasyonu yapabilirsiniz. Mesela bir uçak gemisi gelir ve uçak üzerine iniş yapar.

Henüz bitirmedik. Bir zaman çizelgesi otomatikman aksiyonları gerçekleştirmeye başlamaz. Bir zaman çizelgesini bir objeye atayıp zaman çizelgesindeki aksiyonların o obje için gerçekleşmesini sağlamalısınız. Bunun için iki önemli aksiyon bulunur; biri bir obje için zaman çizelgesi atamaya, diğeri de zaman çizelgesinin pozisyonunun değiştirilmesine yarar. Tekrar controller_enemy objesini kullanıyoruz. Bu sefer bu obje oluşum olayındaki zaman çizelgesini atama aksiyonu hariç aksiyona ihtiyaç duymayacak, o aksiyonlardan kurtulabilirsiniz. (Bu aksiyonu main2 sekmesinde Set Time Line(Zaman Çizelgesi Ata) adı altında bulabilirsiniz.) Zaman çizelgesinin 0. pozisyondan derhal başlamasını ve tekrar etmemesini istiyoruz, yani şekildeki gibi durmalıdır:

Hepsi bu. Fark edeceğiniz gibi, zaman çizelgelerini kullanmak daha çok iş ister, çünkü tüm düşmanları elle yönetirsiniz, ama çok daha esneklik ve ilginç oyun yapımı için temel sağlarlar.

Zaman çizelgeleriyle çok şey yapabilirsiniz. Biz sadece en genelini kullandık, ama ayrıca onları oyun objelerinin gidişatını kontrol için de kullanabilirsiniz. Ayrıca pek çok kurnazlık yapabilirsiniz. Mesela, vakiti bir süre bekletmek için bir durumu test eden bir vakit eklersiniz, ve eğer cevap doğru dönerse zaman çizelgesi konumunu relative olarak -1 yaparsınız, yani sonraki adımda tekrar aynı vakit oynatılır ve durum tekrar test edilir. Yani zaman çizelgesi durum yanlış dönene kadar ilerlemez. (Ayrıca zaman çizelgesini durdurmak için de bir aksiyon vardır.) Kopyalar ayrıca zaman çizelgelerini çeşitli faktörlerle değiştirebilirler vb. Ayrıca zaman çizelgesinin hızını kontrol edebilirsiniz. Yani bunlar çok güçlü kaynak dosyası türüdürler.

Görünüme (View) Sahip Bir Oda

Şimdilik oyuncuya gerçekten uçmadığımızı, ama arkaplanın hareket ettiğini belli etmedik ve ona bunu yutturduk. Ama bunun dezavantajları da vardır. En belirgini arkaplan kolayca değişemez (Mesela uçuş rotasını yarılamak işlemi zor olur. Hem bir de zaman çizelgeleri bile kullansanız çeşitli aksiyonların güzel bir uyumla oyuna yedirilmesi zor olabilir.)

Bu son bölümde scrolling shooter oluşturmanın farklı bir yoluna değineceğiz. Bu seçenekte, büyük bir oda olacak ve uçak gerçekten hareket edecek. Bir görünüm (view) kullanarak oyuncunun odanın sadece bir bölümünü görmesini sağlayacağız. Bunun için, oyunda epey değişiklik gerekli. Burada onlara değineceğiz.

Önce odayı oluşturalım. Odaya 640 genişlik (width) ve 4800 yükseklik (height) verin. Arkaplan resmi için artık hıza gerek yok. Adaları elle güzel bir şekilde yerleştirin.

Artık adaların hıza ihtiyacı yok ve step (adım) eventlerini de artık silebiliriz. Artık onlar tamamen statik obje oldular. Bizim uçağımızı odanın dibine koyup oluşum olayına -2 olan bir dikey hız veriyoruz ki oyuncu bir şey yapmasa bile bir hıza sahip olsun. Son olarak da bir görünüm tanımlıyoruz. Bunun için views(görünümler) sekmesine tıklayın. Enable the use of Views (Görünümlerin Kullanımını Etkinleştir) ile görünümleri etkinleştirin. İlk görünüme basıp oda başlayınca görünür kılın. (Visible when room starts(Oda başladığında görünür kıl) seçeneği iş görür.) Tepeden konumu olarak 4320 girin, bunun anlamı görünüm odanın en altında yer alacaktır. Yani artık şöyle durmalı:

Görünümün sabit hızla gittiğinden emin olmalıyız. Bunun için can kontrol objesinin step (adım) olayını kullanacağız. İçine değişken değeri belirleme aksiyonu ekleyin ve view_yview değişkenine relative olarak -2 değerini ekleyin. view_yview değişkeni odadaki ilk görünümün tepe noktasını belirtir. (Eğer birden çok görünüm varsa view_yview[0] kalıbını kullanmalısınız.) Yani her adımda görünüm 2 pixel yukarı kayacak. Görünümlerle alakalı daha çok değişken vardır ama onlara ihtiyacımız yok. Ayrıca view_yview değişkenini değerinin 0’dan büyük olup olmadığını da test etmeliyiz. Eğer 0’a gelirse en tepeye gelmişiz demektir ve oyunu bitirmeliyiz.

Ana uçak için uçağın görünümün dışına çıkabilmesini engellemeliyiz. Bunun için uçağın pozisyonunun çok yüksekte ya da çok alçakta olup olmadığını test etmeliyiz. Şimdi view_yview değişkenini kullanarak bunu test edebiliriz. Benzer bir sorunu bilgi paneli, can barı vb. yaşayacağız. Onları odanın dibine koymuştuk ama şimdi onları view_yview ile relative olarak doğru konumda çizerek (draw) görünür kılınmalarını sağlamalıyız.

Kurşun objemizin hızını biraz artırmalıyız, çünkü görünümün hızı da arttı. Ayrıca bunu görünümün dışına çıkınca da yok etmelisiniz.

Geriye düşman uçakları kaldı. Artık zaman çizelgesi veya kontrol objesi kullanmayacağız. Tüm düşman uçaklarını odaya elle yerleştireceğiz, ama onları görünür olmadıkça hareket etmeyecek şekilde programlayacağız. Yani onların hızlarını ayarlamayacağız, ama step olayında görünümün içinde olup olmadıklarını test edeceğiz. Eğer öyleyse onları hareket ettireceğiz. Sadece görünümün (view) içindelerse ateş edecekler. Mesela üçüncü düşman uçağı için step eventi şekildeki gibi durmalıdır:

Öncekinden daha küçük bir dikey hız kullanmalıyız. Ayrıca düşman uçakları ve kurşunları için yok olmaları gereken değerleri değiştirmeliyiz.

En karışık düşman 4 numaralı olandır. Arkadan gelmelidir. Burada kurnazlık şöyle olmalıdır. Bunu da odaya önceden yerleştireceğiz ama görünmez kılacağız. Ayrıca görünmezken kurşunlarla veya ana uçakla temas etmesini engelleyeceğiz. Ne zaman ki bu uçak görünümün alt kısmına kadar gelecek, o zaman onu görünür kılıp hareket ettireceğiz(Daha yüksek hızla.) Örnek oyunu inceleyip nasıl yapıldığını görün.

Şimdi sıra odayı yapmaya geldi. Çeşitli düşmanları odada stratejik konumlara yerleştirin. Artık formasyonlar ve zorlayıcı mücadeleler oluşturmak daha kolay olacak. Oyun Örnekler klasörü içinde 1945_7.gmk adı altında bulunabilir. Göreceğiniz gibi, görünümler kullanmak çok ilgi çekici scrolling shooterlar oluşturmaya yarayabilir. Açıkçası oyun için daha çok iş var. Hâlâ bitirmek çok kolay ve bitiş mesafesi de çok kısa. Ayrıca, bazı kaliteli boss’lar olsa güzel olurdu. Bu eğitimi ilk adım olarak atın ve oyununuzu oluşturmaya buradan başlayın.

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
  1. emre diyor ki:

    ateş etmiyor :C

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s