Resources Menüsü ve En Kuvvetli Parçaları
Merhabalar, bu konuya belki başlığa bakıp merak ederek dalmışsınızdır, belki de canınız sıkılmış ve rastgele bir konuyu açma ihtiyacı duymuşsunuzdur. Ama ne olursa olsun bu derste bir şeyler öğrenebileceğinizi düşünüyorum.
Ders tek bir konuyu değil, 4 konuyu birden hızlı ve pratik bir şekilde kafanıza sokmak için hazırlandı :D. Bu 4 konu ise Game Maker’da tepedeki Resources menüsünde yer alan 4 kuvvetli özellik: *Timeline oluşturma ve bunu oyunda kullanma, Define Constants ile oyunumuz için sabitler oluşturmak, *Define Triggers ile kendi eventlerimizi oluşturmak, ve son olarak da Included Files ile oyunumuza dışarıdan içerik yüklemek.
Bun konuların özellikle başında “*” olanları baba konular olup iyi bir oyunda iyi bir şekilde kullanılırsa çok güzel şeyler ortaya çıkabilir. Bunların hepsini karışık bir sırayla(Kolaydan zora) işliyoruz.
1) Define Constants
En kolayları da bu olsa gerek, zaten başında yıldız da yoktu 🙂 Define Constants oyununuzda sabit değerler oluşturmanızı sağlar. Peki bu sabitler mesela neler olabilir? Pek çok şey bir sabit olabilir. Mesela bir renk, yazı, ya da bir değer. Hepsi bir sabit olabilir. Peki nasıl işler ve ne işe yarar?
Bir sabit değer oluşturunca o sabit değeri oyundaki her yerde kullanabilirsiniz. Mesela bir renk diyelim. Bu rengin değerini önce sabit olarak atayıp ardından herhangi bir yazıda renk olarak kullanabilirsiniz. Bu Constants’lar asıl olarak bir değeri oyununuzda birden çok yerde kullanıyorsanız işe yararlar. O bir değeri sabit olarak tanımladıktan sonra sanki global bir variable’ye ulaşıyor gibi direk o sabitin adını kullanarak o sabitin değerini istediğiniz objede kullanabilirsiniz. Ya da bir sabiti kullanmak şöyle faydalı olabilir, eğer bir değerin ne olacağı konusunda kararsızsanız onu bir sabit olarak belirleyip böylece hem dilediğinizde o değeri kolayca bulup değiştirebilir, hem de o değeri bir sürü obje içinde arayıp bulma zahmetinden kurtulursunuz. Şahsen kullanım alanı çoktur, ama ihtiyaç derseniz bence çok gerekli bir şey değildirler.
Bir sabit değer belirtmek için önce Define Constants’a tıklayıp ardından da Name kısmına sabitin adını yazıp (Bir variable ismi gibi kullanacaksınız bu ismi) Value kısmına ise o sabitin değerini yazabilirsiniz. Bu iki tırnak işareti içinde bir yazı, direk bir sayısal değer, ya da cl_red gibi bir renk tanımı olabilir. Altta yeni bir sabit girmek için Add butonuna basmanız yeterli.
2) Included Files
Bu çok faydalı özelliği zamanla çok sık kullanır olacaksınız. Bu özellik sayesinde oyunumuza dışarıdan içerik ekleyebiliriz, mesela bir video (Genelde de videolar için kullanılıyor), ya da resim, veya bir metin belgesi. Her şey bu komut sayesinde oyununuza eklenebilir. Örneğin oyununuzun başında oyun stüdyonuzun bir videosunu göstereceksiniz. Bu videonun oyunun oynandığı herhangi bir bilgisayarda açılmasını en pratik şekilde sadece bu komutla ayarlayabilirsiniz. Bu videoyu öncelikle Included Files seçeneğinden Add butonu ile seçersiniz ve OK’a basarsınız. Ardından bu videonun ismini uzantısıyla beraber (.wmv, .avi gibi) kopyalarsınız. Videonun gösterileceği zaman gelince ise videoyu gösterecek objeden main2 sekmesindeki Splash Video aksiyonu ile videonun kopyaladığınız ismini yapıştırır ve videonun sorunsuz bir şekilde her bilgisayarda gösterilmesini sağlarsınız. Bunun gibi pek çok işte bu seçenek kullanılır. Burada birkaç husus var. Add butonuna basınca gelen kutucukta birkaç ayarlama yapmanız mümkün. Bunlar mesela oyuna ekleyeceğiniz dosyanın oyunun GMK proje dosyasında da yer almasını sağlamak, bu sayede de oyununuzu başka bir yerde yapmaya devam ederken de aynı videoya erişebilmek; ya da o dosyanın oyun sonunda silinebilmesini sağlamak olabilir. İlk dediğimi Add butonuna basınca gelen kutucuktan “Store in the editable gmk file” seçeneğiyle yaparsınız. İkinci dediğim özellik ise zaten otomatikman seçilidir, ama istemezseniz bu özelliği “Remove at game end” seçeneğindeki tiki kaldırarak kapatabilirsiniz. Ayrıca bu dosyanın çıkarılacağı konumu da Export seçeneği altında elle ayarlayabilirsiniz. Mesela dosyayı Temp klasöründe oluşturmak için Export altında 2. seçeneği seçebilirsiniz.
*3) Define Triggers
Çok baba konudur. Bu özellik çok güçlü olup kendi eventlerimizi oluşturmaya yarar. Mesela nedir, oyunda A,S,D,F,L tuşlarının (Okulumun kısaltması bu harflerden oluşuyor :D) hepsine aynı anda basılı ise karakterin ölmesini(Bence başka bir şey yaptırmak istersiniz ama ben bunu uydurdum :)) sağlayabilir ya da bir hile çalışmasını sağlayabilirsiniz. Bunu tek bir tuşun Key Press eventinde yapmaya kalkarsanız çok zorlanabilirsiniz. Aynı anda bunu kontrol eden bir olay olsa nasıl olurdu peki? Yok canım olmaz demeyin çünkü Define Triggers ile bunu yapmak gerçekten bebek oyuncağı. Ancak bunu yapmak için GML’yi az da olsa bilmek gerekir. Eğer biliyorsanız Define Triggers seçeneğinden Add seçeneği ile yeni bir trigger oluşturup Name ile isim verirsiniz ve Condition kısmına ise GML kodu olan şu kodu eklersiniz.
{
return keyboard_check_pressed(ord(‘A’)) && keyboard_check_pressed(ord(‘S’)) && keyboard_check_pressed(ord(‘D’)) && keyboard_check_pressed(ord(‘F’)) && keyboard_check_pressed(ord(‘L’));
}
Bu GML kodunu incelersek de kontrol edeceğimiz şeyler kesinlikle tırnaklı parantezler “{}” içinde yer almalıdır. Ardından ise sırayla kontrol edeceğimiz şeyleri return ifadesinden sonra yazıp araya “&&” (AND, yani VE işareti) koyarak hepsinin aynı anda yapılıp yapılmadığını test ederiz. Ardından return değeri 1 olarak dönerse de olay gerçekleşir, yani tüm bu istediklerimiz gerçekleşirse. Bu test edeceğimiz şeyler istediğiniz her şey olabilir. Mesela oyunda kullandığınız bir objenin sayısını test edebilirsiniz vb.
Oluşturduğumuz bu eventi oyunumuzda kullanmak için ise objemize event eklersen sağ alttaki “Trigger” vasıtasıyla menüden ismini verdiğimiz triggeri seçip kullanabilirsiniz. Bu özelliğin çok kuvvetli bir özellik olduğunu anlamış olmalısınız sanırım.
*4) Create Time Line
Evet, geldik yine çok baba bir konuya. Bu kaynak dosyası türü çok ama çok güçlü bir özelliktir, gerçekten eğer kullanmasını bilirseniz oyununuza mükemmel derecede güzel özellikler sağlayabilmenize yardımcı olur. Aslında arayüzü genel olarak tıpkı bir objenin aksiyon arayüzüne benzer. Time Lineler isim alırlar ve oyununuzda pek çok yapması zor işlemi kullanmayı kavrayınca çok daha rahat halledebilmenizi sağlar. Bu özellik o kadar önemli ki bu özelliği uygulayarak öğrenmeniz için bir örnek yaparak anlatacağım. Örneği siz de indirip Game Maker’ınızda adım adım aşağıdan izleyip inceleyerek takip edin ki daha iyi anlayasınız.
https://www.box.com/s/42dee234048da4416b42
Yapacağımız örnek bir oyunun tutorial bölümü olacak. Time Line ve birkaç objeyle bunu yapacağız.
Başlamadan önce konu boyunca yaptığımız şeylerin anlaşılır olması için önce ne yapacaklarımızı özetleyeceğim. Çünkü gerçekten Time Line’ler kolaydır ama anlaşılır şekilde anlatması biraz zor. Öncelikle oyunumuzda 3 sprite, 1 timeline, 3 tane de obje olacak. Objelerimizden birisi Egitim adında spritesiz bir obje olacak ve tek görevi de timeline’den alacağı talimatlara göre uygun eğitim yazısını ekrana yazdırmak olacak. Burada ekrana yazılacak yazılar da 3 tane olup ilki ana karaktere nasıl hareket etmesi gerektiğini, ikincisi de nasıl ateş edildiğini öğretecek ve 3. yazı da bu iki aşama tamamlanınca oyuncuya eğitimi tamamladığını söyleyen bir yazı olacak. Bu yazıları önceki konulardan sabitler konusu daha da anlaşılsın diye birer sabit olarak tanımlayacağız.
Burada timeline’ı bir kontrol objesi gibi, ama daha esnek bir yapıda olduğu için biraz farklı aksiyonlarla; eğitim sırasındaki olayları kontrol edip Egitim objesine neyi ekrana yazdıracağını belirtmek için kullanacağız. Timeline’mizin kontrol edeceği şeyler ise eğitimin ilk yazısı sırasında karakterin bir yön tuşuna basıp basmadığı, eğer bastıysa sonraki yazıya geçilmesinin sağlanması; ardından eğitimin 2. yazısında karakterin ateş edip etmediğini kontrol etmek olacak, eğer ateş edilirse sonraki yazıya geçiş yapılacak. Ancak burada timeline’nin çok esnek yapıda olmasını sağlayan bir özellik kullanacağız ve her bir step’de gerekli aksiyonun yapılıp yapılmadığını kontrol edip yapılmadıysa tekrar aynı step’i işlemesini sağlayacağız. Yani C++ dilinde goto deyiminin yaptığı işi (İşlem sırasını istenilen satıra götürmeye yarar.) yapan bir Timeline aksiyonu kullanacağız. Ayrıca Timeline sayesinde henüz ilk aşamadayken karakterin ateş etmemesi sağlanacak, kendisine ateş etmek öğretilene kadar ateş edemeyecek yani. Bunları örneği yaparken daha iyi anlayacağınızı umuyorum. Başlıyoruz!
Öncelikle bu basit örneğimiz için spriteleri oluşturuyoruz. Orijinlerini de tam merkezleri yapıyoruz. Ardından da tutorial’deki yazıların üstünde gözükeceği bir dikdörtgen spriteyi elle çiziyorum. Dikdörtgenin dış çizgisi siyah, içi ise çok açık gri. Ardından eğitimde geçecek yazıları birer sabit olarak tanımlamak için Define Constants seçeneğinden yazi_1,yazi_2 ve yazi_3 adında 3 sabit tanımlayıp her birine iki tırnak içinde içeriğini yazıyorum. Örneğimi inceleyip sabit tanımlamayı nasıl yaptığımı görün.
Ardından ana karakter ve alev topu için objeler oluşturuyorum ve “Egitim” adında bir de resimsiz obje oluşturuyorum. Ardından da “Egitimci” adında bir Timeline oluşturuyorum (Objeyle isimlerinin aynı olması gerekmez diye göstermek için ismini farklı koydum.).
Şimdi objeleri ve Timeline’yi ayarlama vakti. Önce en basit olan alev topuna oluşunca -8 değerinde dikey hız veriyorum. Ardından odanın dışına çıkınca da onu yok ediyorum. Karakterin ise her yön tuşu için hareket aksiyonlarını hazırlıyorum. Ardından Space’e basılınca karakterin tam üzerinde alev topu objesinin oluşmasını sağlıyorum.
Şimdi, oluşturduğumuz Timeline’yi açtım ve soldan Add butonu ile Step 0’ı timelineye ekledim. Bu Timeline’nin ilk adımı olacak ve Timeline’miz toplam 3 adımdan oluşacak. Her birini ayrı ayrı işlemler topluluğu olarak düşünebilirsiniz. Bu step, alarm eventlerindeki step ile aynıdır, yani 30 step bir saniyedir. Öncelikle timeline’yi kapatmadan Egitim adlı objemizi açıyorum ve Create eventine aşağıdaki kodu ekliyorum:
yazi1=0;
yazi2=0;
yazi3=0;
Bu kodun yapacağı şey tanımladığımız Constant yazıların sırasıyla ekrana yazdırılmasını sağlamak. Ama bu işlemi Timeline kontrol edecek ve eğer oyuncu gerekli işlemi yaptıysa eğitimin sonraki aşamasına geçmek için sonraki yazı değerini 1 yapacak. Egitim adlı objemiz de değeri 1 olan yazıyı ekrana yazdırmakla görevli olacak. Ayrıca Draw eventinin ilk aksiyonu olarak Draw Sprite kullanarak dikdörtgen şeklinde çizdiğim eğitim kutucuğunu 0,0 koordinatlarında bu objeyle çizdireceğim. Ardından sırayla eğer yazi3’ün değeri 1 ise control aksiyon sekmesinden Draw Variable aksiyonu ile yazi_3’ü ekrana yazdırıyorum ve eventten çıkıyorum, değilse yazi2’nin değerini kontrol edip eğer 1 ise yazi_2’yi ekrana yazdırıp eventten çıkıyorum, son olarak da yazi2’nin de değeri 0 ise yazi1’in değerini kontrol ediyorum ve eğer 1 ise yazi_1’i ekrana yazdırıyorum. Bunu örnekteki Egitim adlı objenin Draw eventine bakarak anlayabilirsiniz. Böylece Egitim objesinin tüm aksiyonlarını bitirmiş oluyorum.
Şimdi tekrar açık bıraktığımız Timeline’ye dönüyorum ve Step 0’a Egitim objesi için yazi1’in değerini 1 yapmasını söyleyen bir Set Variable aksiyonu ekliyorum. Ardından sol taraftan Add butonu ile yeni bir step ekleyip değerini 1 yapıyorum. Şimdi karakter objemizi tekrar açıyorum ve Create eventine hareket_kontrol=0; kodunu ekliyorum. Şimdi bu kodu Timeline’de kullanacağız. Şu anda olaylar şöyle gerçekleşecek. Şu sırada yazi1’in değeri 1 olduğu için oyunda karaktere hareket etmesini bildiren bir yazı beliriyor olacak. Biz de karakter hareket edene kadar bu yazıyı ekranda tutmak istiyoruz, hareket edince de yazi2’yi 1 yapıp onu ekrana yazdırmak istiyoruz. Bu yüzden karakterin her yön tuşu eventi için hareket aksiyonunun altına hareket_kontrol değerini 1 yapan bir Set Variable aksiyonu ekliyorum. Ardından Timeline’de step 1’e geçip hareket_kontrol değerini test ediyorum ve eğer değeri 0 ise anlamı oyuncu henüz hareket etmemiştir ve bu yüzden de hâla 1. eğitim yazısı ekranda yazılı kalmalıdır. Bunun için hareket_kontrol değerini test edip değeri 0 ise sağdan main2 aksiyon sekmesinden Time Line Position ile timeline’yi tekrar step 1’e yollayacağım ve bu döngü karakter hareket edip de hareket_kontrol değerini 1 yapana kadar devam edecek. Bu döngüyü tekrarlama özelliği timeline’nin en güçlü özelliklerinden biridir. Devam edelim, timeline’de step1’de hareket_kontrol’ün değerini test ediyorduk, şimdi de karakter hareket edince sonraki eğitim yazısına geçilmesini ayarlayacağız. Bu yüzden hareket_kontrol değerinin 0 olarak kontrolünün altına bir Else koyarak karakter hareket edince yapılacakları ayarlıyoruz. Else içine önce Egitim objesi için yazi2 değerini 1 yapan bir Set Variable değeri koyuyoruz ve böylece sonraki eğitim yazısının gelmesini sağlıyoruz. Şimdi olacakları açıklayayım. Eğitimin 2. yazısında oyuncuya nasıl ateş edileceği öğretiliyor, ama ben bu yazı gelmeden; yani eğitimin daha 1. aşamasında oyuncu ateş etme tuşuna bassa bile ateş edememesini istiyorum, böylece her şey adım adım gerçekleşsin. Bunun için karakter objesini açıp Space Tuşu eventinde karakter ateş etmeden önce Check Variable aksiyonu ile Egitim objesindeki yazi2 değerinin 1 olup olmadığını kontrol ediyorum ve eğer değeri 1 ise ateş ediyorum. Değilse henüz o aşamaya gelinmemiş demektir. Ardından istediğimiz bir şeyde karakter ateş edince eğitimin son yazısı olan 3. yazıya geçilmesiydi. Bunun için de bir variable kullanacağız. Karakterin Create eventindeki hareket_kontrol=0;’ın altına ates_kontrol=0; satırını ekliyoruz ve karakterin Space Tuşu eventinde ateş edilmesi aksiyonunun altına bu değeri 1 yapan bir Set Variable aksiyonu ekliyorum. Şimdi tekrar Timeline’ye dönüyorum. Soldan Add butonu ile yeni bir step ekleyip değerini 2 giriyorum. Bu son step’imizde de ilk önce ates_kontrol değerini kontrol ediyoruz ve eğer 0 ise oyuncu ateş etmemiş demektir ve hâla eğitimin 2. yazısı ekranda kalmalıdır. Bu yüzden bunu kontrol ettikten sonra eğer değeri 0 ise Time Line Position ile timeline’nin tekrar bu stepe (2. step) dönmesini sağlıyorum ve karakter ateş edip de bu değer 1 olana kadar bunu tekrar ediyorum. Ardından son olarak da ates_kontrol değerini kontrolün altında bir ELSE ekleyip eğer ateş edildiyse Egitim objesinde yazi3 değerini 1 yaparak son eğitim yazısının ekranda gösterilmesini sağlıyorum. Bu son yazıda oyuncuya eğitimi bitirdiği söylenir. Bu son yazı olduğu için artık ekstradan bir timeline aksiyonu kalmadı, timeline’nin yapması gerekenler tamamlandı. Şimdi en son yapmamız gereken şey ise Egitim objesinin Create eventinde timeline’yi çalıştırarak oyun başladığı gibi timeline’nin de çalışmasını sağlamak. Bunun için Egitim objesinin Create eventine main2 sekmesinden Set Time Line aksiyonu ile oluşturduğumuz timeline’yi 0. stepinden başlayarak derhal ve tekrar etmeden başlama aksiyonunu eklemek.
Tamamlandı! Şimdi bir oda oluşturup içine karakter objesini ve Egitim objesini ekleyip oyunu çalıştırıyorum ve çok güzel bir eğitim moduyla karşılaşıyorum. İlk yazıda ateş etmek öğretilmediği için ateş edemiyorum ve hareket edince 2. yazıya geçip ateş etme yetkisi kazanıyorum. Ateş ettikten sonra da tebrik ediliyorum. Bu eğitimi 3 yazıcıktan değilde çok daha fazla yazıdan oluşturmanız mümkün ama ben mümkün olan en kısa eğitimi yapıp sizi bunaltmamak ve çabucak anlayabilmenizi sağlamak istedim. Timeline’ler işte böyle çok kaliteli özellikler olup çok esnek yapıdadırlar ve çok faydalıdırlar.
Yazı uzun oldu ama eğer anlayamadıysanız bir kere daha tekrar ederseniz tam anlayacağınızdan eminim. Zaten okurken çok çabuk ilerliyorsunuz ve elinizdeki örnek dosyasından takip ederken de olayların gelişimine tanık oluyorsunuz.
Bu dersten umarım kendinize bir şeyler katabilmişsinizdir. Yorumlarınızı esirgemeyin. Hepinize iyi eğlenceler!