Tem.20

ActionScript 3.0 AIR SDK ile Karakter ve Nesne Temas Kontrolleri, Altın Toplamak, Skor Yazdırmak

Oyunların vazgeçilmez parçası; altınlar, kristaller, boncuklar… Oyuncunun puanını belirleyecek olan veya ek özellikler kazandıran bu nesneler her oyunda mutlaka yer alır. Karakter ile altınlar toplanır ve skor artırımı yapılır. Şimdi biz de karakterimiz ile nasıl altın toplayacağımızı kodlayacağız…

Altın Toplayarak Puan Kazanma

GamePad uygulaması yapmıştık daha önce, o uygulamayı (https://ugurgelisken.com/actionscript-3-0-air-sdk-ile-sanal-joystick-ile-karakteri-360-yonlendirme-ve-hareket-ettirme/) açarak onun üzerinden devam edelim. Sağ ve Sol kontrol butonları ile karakterimizi yönlendirebiliyorduk. Ken karakterimiz ile bu sefer kavga etmek yerine, Sonic gibi altınlar toplayacağız.

Altın Modeli Oluşturmak

Uygulamayı açtıktan sonra, kök katmanda en Kodlar katmanının hemen altında yeni bir katman daha açın. Açtığınız katmana Altınlar adını verin. Diğer katmanları da kilitleyin.

Altın modeli oluşturabilmek için aşağıdaki gibi bir Sprite Sheet (DVD > Konu Örnekleri > Altın Toplama > Altın.png) kullanacağız.

Daha önce öğrenmiş olduğunuz tekniklerle, altin nesne ismi ile MovieClip’i oluşturun. Dikkat edin, Instance Name, yani durum ismi girmiyoruz.

Modelimizi oluşturduk. Sahnede herhangi bir yere altını taşıyın.

Karakter ile Altın Teması Kontrolü

Oyunlarda en çok kullanılan tekniklerden biri de iki nesnenin birbiri ile teması kontrolüdür. Bu temas, örneğimizdeki gibi ya altın toplama, ya karakterin hareketini engelleyen bir duvar, ya düşman ya da karakterin hızını yavaşlatacak olan bir çamur birikintisi olabilir.

Temas kontrollerinde de yine iki yaklaşım modeli uygulanır. Ya ana karakterin bir nesneye teması kontrol edilir, ya da nesnelerin ana karaktere teması. Lafta ikisi aynı gibi görünse de farklıdır. Mesela karakterimiz bir labirent içindeyse ve labirentin duvarlarına da çarpmadan ilerlemek zorundaysa, bu modelde karakter, sürekli olarak duvara çarpıp çarpmadığını kontrol edebilir. Duvarı da tek bir nesne olarak düşünürsek tabi. Diğer bir örnekle de, yine altın toplamada oyun alanında yüzlerce altın olabilir. Karakterin tek tek hangi altına temas edip etmediği kontrol edilemez. Bunun yerine, tek bir kopyadan türetilen altının karaktere temas edil etmediği kontrol edilir.

Hemen örneğimize geçelim…

“DVD > Konu Örnekleri > Altın Toplama > Altın Toplama – Altın” dosyasını açın, bu dosya üzerinden devam edeceğiz.

Daha önce oluşturduğumuz altin isimli MovieClip’e girin. Yeni bir katman oluşturun. Layer 2’nin birinci keyframe’ine ActionScript 3.0 kodlarımızı yazacağız. Hatırlayın, bir keyframe’den sonra gelen diğer frame bloğu, kendisinden önceki keyframe’i referans alır ve tüm özelliklerini yansıtır. Layer 2’yi oluşturduğumuzda otomatik olarak birinci alanda bir blank keyframe oluşturuluyor ve geriye kalan (Layer 1’deki dolu kare sayısı kadar) kareler de frame olarak dolduruluyor.

Aşağıdaki kodları girin ve CTRL+ENTER ile test edin. Test esnasında karakter ile altına yürüyüp almayı unutmayın.

import flash.events.Event;

this.addEventListener(Event.ENTER_FRAME, altinTemasKontrolu);
function altinTemasKontrolu(e:Event):void{
if(this.hitTestObject(MovieClip(root).ken)){

trace(“temas var”);

this.visible=false;
stop();
this.removeEventListener(Event.ENTER_FRAME, altinTemasKontrolu);
}
}

Burada yine birkaç tane yeni komutumuz var, inceleyelim.

this. tnımı; bu anlamına gelmektedir. Timeline’de kodu nereye yazdıysanız, o MovieClip hedef alınır. Buradaki this, altin MovieClip’idir.

trace() komutu ise Output panelinde (Timeline paneli ile bitişiktir) String olarak aldığı (“” işaretleri arasında yazan temas var yazısı) metni gösterir. Örneğimizde karakterimiz ile bu nesne, yani altın nesnesi temas ediyorsa temas var şeklinde bize bilgi ver dedik. Bu bilgi, sadece geliştirme ortamı sırasında test amaçlı verileri görmek için gösterilir.
.visible = false; ile de nesneyi görünmez yaptık. Çünkü altını alınca altının yok olması lazım.

stop(); komutunu da kullanarak altının dönmesini durdurduk. Çünkü altın animasyonu tekrar başa alınca birinci keyframe’e gelecek ve bu sefer kodlar tekrar çalışacak. Altın görünmez olacak yine ama addEventListener() ile tekrar altına aksiyon verilmiş olacak ve sürekli olarak puan artırımı yapılacak. Altının temas edildiği yerde bu döngüyü kırmamız lazım.

.hitTestObject() komutu da temas kontrolünü sağlar. İki parametre gerekiyor ama () içinde sadece hedef yer alır. Komutun başında da referans nesne yer alır. this ile bu nesnenin temasını kontrol et diyoruz. Parantez içindeki MovieClip(root) tanımı ile de kök sahneyi hedef gösteriyoruz. Nokta operatöründen sonra gelen ken ismi de bizim ana karakterimizin durum adıdır. Kök sahnedeki ken karakterine bu nesnenin teması varsa; true sonucu ver ve koşul döngüsüne gir dedik.

removeEventListener()ile de olay yöneticisini iptal ettiriyoruz. Yani altın temas kontrolü yapılmıyor daha. Her altın bir sefer puan artırımı yapacaktır.

Altınlara Puan Artırım Özelliği Kazandırmak ve Skoru Göstermek

“DVD > Konu Örnekleri > Altın Toplama > Altın Toplama – Altın Temas” üzerinden devam ediyoruz…

Önceki komumuzda altın ile karakterin temasını kontrol ettirdik, ancak puan artışı gibi bir durum yoktu. Hoş puan artsa da nerede gösterilecek bu puanlar, değil mi?

Kök sahnedeyken Kodlar katmanının altında yeni bir katman daha açın. Katmana isim olarak Skor Tablosu adını girin. Diğer tüm katmanları da kilitleyin.

Şimdi yeni bir şey öğreneceğiz…

Tools panelinden, T ikonu ile gösterilen Text (Metin) aracını seçin. Adı üstünde, bu araç ile yazılar yazabilirsiniz. Ancak bu araç ile interaktif metinler de oluşturabiliriz. Yani statik metin (değiştirilemeyen sabit metinler, Static Text olarak alınır.), dinamik metinler (Dynamic Text olarak geçer ve Instance Name’leri vardır, değer ataması yapılabilir.) ve giriş metinleri (Input Text olarak anılır ve kullanıcıdan değer almak için kullanılan form metin kutularıdır.) oluşturulabilir.

Biz, Dynamic Text kullanacağız. Çünkü bu metin kutusunda, skor artırımı ile 1, 2, 3… şeklinde artan değerler göstereceğiz.

Text aracı seçili iken Properties panelinde bir açılır menü göreceksiniz, oradan Dynamic Text’i seçin.

Bu işlem sonucunda Mouse imleci değişecek ve + işareti haline gelecek. Bunun anlamı, bir yere metin kutusu çizmeniz gerekiyor. Sahnenin bir yerine tıkladığınızda otomatik olarak metin kutusu oluşturulur.

Metin kutusunu kenarlarından tutuş çekerek ölçülendirin, uygun bir konuma taşıyın. Metin kutusu içine bir şey yazmayın. Metin kutusu seçili ilen yine font özelliklerini ve rengini Properties panelinden yapabilirsiniz. Sonra da MovieClip’lerde olduğu gibi skor Instance Name’ini girin.

Skorumuzu gösterecek olan tabelamız artık hazır. Tekrar kod yazmaya devam edelim…

altin isimli MovieClip’in içine tekrar girin. Layer 2’de yazdığımız kodlarda şu düzenlemeyi yapın.

import flash.events.Event;

var skor:int;
if(MovieClip(root).skor.text!=””){
skor = int(MovieClip(root).skor.text);
}
this.addEventListener(Event.ENTER_FRAME, altinTemasKontrolu);
function altinTemasKontrolu(e:Event):void{
if(this.hitTestObject(MovieClip(root).ken)){

trace(“temas var”);
skor++;
MovieClip(root).skor.text = skor.toString();
this.visible=false;
stop();
this.removeEventListener(Event.ENTER_FRAME, altinTemasKontrolu);
}
}

Ne yaptığımızı inceleyelim…

skor adında Integer bir değer oluşturduk. Varsayılan değeri 0’dır. Sonrasında da bir koşul koymuşuz. Demişiz ki; kök sahnede yer alan skor isimli metin kutumuzun değeri boş değilse; (.text metodu ile değer okunur, != operatörü değil anlamındadır, “” ise boşluğu ifade eder.) daha önce demek ki buna bir değer atanmış, yani daha önce bir altın daha toplanmış. Madem toplanmışsa o değeri al ve skor değişkenimize ata. Yani daha önce altın toplanmışsa (mesela 44), bu değeri alıp değişkene ata. İlkinde varsayılan değer ile 0 yapıyoruz ama değer zaten var mı diye de baktırıp varsa atama yapıyoruz.

int() komutuyla, String olan bir veriyi nümerik veriye çevirdik. Yalnız dikkat edin, skor metin kutusunda bir rakam değil de alfabetik bir metin olsaydı burada hata verirdi. Kısacası tür dönüşümü yapıyoruz.

Fonksiyon içinde de skor değerini ++ ile 1 değer artırıyoruz. 0’dı ilk değerimiz ve 1 artınca 1 oldu. 44 olsaydı 45 olurdu.
Elde edilen yeni değeri de tekrar kök sahnedeki metin kutusuna atıyoruz. toString() kullanıyoruz çünkü metin kutuları String veri gösterir, ama bizde Integer var. Bu nedenle değeri toString() ile metne çeviriyoruz.

Altınları Klonlamak

Oyunda bir tane altın olacak değil ya, şunları biraz çoğaltalım…

“DVD > Konu Örnekleri > Altın Toplama > Altın Toplama – Altın Temas Puan” dosyasını açın, bu dosya üzerinden devam edeceğiz.

altin MovieClip’ini çoğaltmak için, Library panelinden Mouse ile tutup sürükleyebilirsiniz. Veya MovieClip’i Mouse ile seçip, CTRL+D (Dublicate – Çoğalt) ile hemen yanına klonlayabilirsiniz.
Aşağıdaki şekilde görüldüğü gibi altınları çoğaltın ve konumlandırın.

CTRL+ENTER ile test edin, altınları toplayın ve skoru izleyin. Skorun 1, 2, 3 ve 4 olarak artması gerekiyor.

Bu makale, Level Yayıncılık’tan çıkmış olan Mobil Oyun Programlama ve Tasarımı kitabımdan içeriktir.
İçeriği paylaş:
  • facebook
  • twitter