Tem.20

ActionScript 3.0 AIR SDK ile Kilitli Kapı için Anahtar Toplama ve Kapıyı Açma

Kapılar, anahtarlar, bulmacalar… Bunlar da olmadan oyun olmaz.

Düşünün, bir kapı açmamız gerekiyor ve bu anahtara ulaşmak için de bütün binayı gezmemiz, düşmanları yok etmemiz gerekiyor. Neyse ki anahtarı bulduk, gözümüzün önünde yerde. Bir de bu kapının açacağı bir kapı var. Öncelikle anahtarı bulmalı, bu anahtarı almalı ve kapının önüne gidip herhangi bir tuşa basarak kapıyı açmalıyız. Ne kadar da basit…

Street Fighter’ı programlayanlar, Ken’in bu halini görse eminim ki çok acırdı. Anlayacağınız, yine aynı oyun dosyamız üzerinden devam edeceğiz.

Kilitli ve Açık Kapı Modeli Hazırlamak

Oyun sahnemizin ortasında bir kapı olacak. Ken, bu kapının önündeyken, diğer tarafına geçmek istiyor. Ekranın sol tarafında da bir anahtar var. Öncelikle bu anahtarı almalı ve sonra kapıyı açmalı.

Kapımızı oluşturmak için şöyle bir Sprite Sheet kullanacağız. Grafikte de görüldüğü gibi 1. karede kapı kapalı, sonraki karelerde ise kapı açılıyor.

Zemin katmanı üzerinde bir katman açıp Kapı – Anahtar adını verin. Diğer tüm katmanları kilitleyin.

Daha önce öğrenmiş olduğunuz tekniklerle kapi nesne ve durum adlı bir MovieClip hazırlayıp Sprite Sheet parçacıklarını keyframe’lere yerleştirin (Bu arada görüldüğü gibi arkaplan kapıya uygun olarak değiştirildi ve çalışma sahnesi de 450×150 pixel ölçüsüne getirildi. Biraz genişlettik, çünkü biraz yürüme mesafesi olsun). Sonra da zemine uygun olarak uygun pozisyona taşıyın. Bu aşamada test ettiğinizde kapı kendi kendine açılıp kapanır.

Kilitli Kapıyı Açacak Olan Anahtar

Şimdi de yere bir tane anahtar atacağız. Anahtar için şöyle PNG formatlı dikkat çekici bir grafik kullanabilirsiniz.

Aynı katman üzerinde, anahtar için grafiği ekleyin. Grafiği anahtar nesne ve durum adı ile MovieClip’e çevirin. MovieClip’i de uygun bir yere yerleştirin (Anahtar belli olsun diye biraz büyük ve parlak yaptım).

Anahtarın Olup Olmadığını Gösteren İşaretçiyi Modellemek

Aynı anahtar PNG dosyasını kullanacağız. Ekranın sol üst köşesine aynı anahtarı yerleştirin ve biraz küçülterek (Tools panelinde Free Transform Tool aracı ile küçültebilirsiniz.) bir işaretçi modeli yapın. Veya keyfiniz isterse başka grafik de kullanabilirsiniz. İşaretçi MovieClip’ini aynı katman üzerinde, isaretci nesne ve durum adı ile hazırlayın.

Karakter ile Anahtarı Almak ve Envantere Atmak

Artık tüm nesnelerimiz hazır. Şimdi kod yazmaya geçebiliriz.

Yazacağımız kod mantığı şöyle olacak:

Ken’i biraz ilerletiyoruz. Yerdeki anahtarın önündeyken, atak tuşuna basarsa, yerdeki anahtarı alacak ve sol üst köşedeki işaretçi anahtarımız görünür olacak (anahtarı almadan önce görünmez yapacağız) ve yerden aldığı anahtar da kaybolacak. Bir nevi cebe atmış olacak.

Anahtar elinde iken kapıya ilerleyip tekrar atağa basarsa, kapıyı açmış olacak. Anahtarı almadan kapıyı açmaya çalışırsa, bu sefer kapı açılmayacak.

Karakteri kodlarken, sürekli olarak bütün nesnelerin yanında atak butonuna basıp basmadığını kodlayamayız. Bu şekilde belki yüzlerce nesne ile etkileşime girmesi gerekebilir. Bu nedenle etkileşim kontrolünü nesnelere vereceğiz. Normalde atak tuşuna bastığında Ken yumruk atıyordu, yine atsın yumruğunu, bozmaya gerek yok. Sadece birkaç ekleme yaparız ve anahtarı da alır yumruk savururken…

Kodlar katmanında yazdığımız kodlara ek olarak en üstte bir değişken oluşturun.

var atakDurumu:String = “negatif”;
Bu değişken ile atak durumunu kontrol ettireceğiz. İlk hali ile negatif diyoruz.
atakYap fonksiyonunda kod bloğunda, yine bir ekleme yapıyoruz.
atakDurumu = “pozitif”;

Ek olarak yeni fonksiyon ekliyoruz. Bu fonksiyonla da atak işleminin bittiğini belirteceğiz. Nihayetinde kodlarımız şöyle olacak:

import flash.events.MouseEvent;
import flash.events.Event;

ken.stop();

var yurumeDurumu:String = “duruyor”;

var atakDurumu:String = “negatif”;

solBtn.addEventListener(MouseEvent.MOUSE_DOWN, solaYurut);
function solaYurut(e:MouseEvent):void{
ken.scaleX=-1;
yurumeDurumu = “solaYuruyor”;
ken.gotoAndPlay(“yuru”);
stage.addEventListener(Event.ENTER_FRAME, ilerlet);
}
sagBtn.addEventListener(MouseEvent.MOUSE_DOWN, sagYurut);
function sagYurut(e:MouseEvent):void{
ken.scaleX=1;
yurumeDurumu = “sagaYuruyor”;
ken.gotoAndPlay(“yuru”);
stage.addEventListener(Event.ENTER_FRAME, ilerlet);
}
stage.addEventListener(MouseEvent.MOUSE_UP, durdur);
function durdur(e:MouseEvent):void{
ken.gotoAndStop(“dur”);
stage.removeEventListener(Event.ENTER_FRAME, ilerlet);
}

function ilerlet(e:Event):void{
if(yurumeDurumu == “sagaYuruyor”){
ken.x+=10;
}else if(yurumeDurumu == “solaYuruyor”){
ken.x-=10;
}else{
yurumeDurumu=”duruyor”;
}
}

atakBtn.addEventListener(MouseEvent.MOUSE_DOWN, atakYap);
function atakYap(e:MouseEvent):void{
ken.gotoAndPlay(“vur”);
atakDurumu = “pozitif”;
}

atakBtn.addEventListener(MouseEvent.MOUSE_UP, atakDur);
function atakDur(e:MouseEvent):void{
atakDurumu = “negatif”;
}

Evet, artık atak yapıp yapmadığımızı nesnelere (anahtar ve kapı) içinden kontrol edebileceğiz.

anahtar MovieClip’i içine girelim ve Layer 1’de ilk kareye şu kodları yazalım.

import flash.events.MouseEvent;

MovieClip(root).isaretci.alpha = 0.2;

stage.addEventListener(MouseEvent.MOUSE_DOWN, anahtarAlKontrol);
function anahtarAlKontrol(e:MouseEvent):void{
if(MovieClip(root).atakDurumu == “pozitif”){
if(this.hitTestObject(MovieClip(root).ken) == true){
MovieClip(root).isaretci.alpha = 1;
this.visible = false;
stage.removeEventListener(MouseEvent.MOUSE_DOWN, anahtarAlKontrol);
}
}
}

Kodlarımızdaki mantıkta; .alpha metodu ile kök sahnedeki işaretçiyi %20 değeri ile transparan yapıyoruz. Böylece orada hafif bir işaretçi görünecek ama aktif olmadığı anlaşılacak.

stage tanımı da bir objedir. Kök sahneyi temsil eder. Kök sahnede parmak basılıp çekilmiş mi diye bir olay yöneticisi atıyoruz. İlgili fonksiyonla da kök sahnede atak yapılıp yapılmadığını bir == eşitlik operatörü ile kontrol ediyoruz. Aynı zamanda Ken ile anahtar temas ediyor mu diye de kontrol ediyoruz. Eğer ekrana basılıyor ve bu basma esnasında da kök sahnemizdeki atakDurumu değişken değerimiz pozitif ise; kök sahnedeki işaretçiyi görünür yapıp (1 değeri %100’dür) asıl anahtarı da görünmez yapıyoruz.

CTRL+ENTER ile test edin. Test esnasında öncelikle boş bir alanda atak yapın, sonra da anahtar üzerinde yapın (Kapı sürekli açılıp kapanacak, sorun yok, bunu sonraki aşamada halledeceğiz).

Kilitli Kapıyı Anahtar ile Açtırmak

Test esnasında kapı sürekli açılıp kapanıyordu. Şunu adam akıllı bir kilitleyelim ve anahtar olmadan açılmasın…

“DVD > Konu Örnekleri > Kapalı Kapı > Kapalı Kapı – Kapı Anahtar İşaretçi Envanter” dosyasını açın.

kapi MovieClip’i içine girin ve yeni bir katman açın. Layer 2’in ilk keyframe’ine şu kodları yazın (Niye yeni bir katman açtığımız üzerinde biraz düşünün).

import flash.events.MouseEvent;

stop();

stage.addEventListener(MouseEvent.MOUSE_DOWN, anahtarVarmi);
function anahtarVarmi(e:MouseEvent):void{
if(MovieClip(root).atakDurumu == “pozitif”){
if(this.hitTestObject(MovieClip(root).ken) == true
&& MovieClip(root).isaretci.alpha == 1
){
play();
stage.removeEventListener(MouseEvent.MOUSE_DOWN, anahtarVarmi);
}
}
}

Kodlarımızda bu sefer if(){} koşullu döngüsünde iki adet koşul kullandık. Koşullar arasında && operatörü yer alıyor. Bu operatör ile her iki koşulun da true sonucu vermesi gerekiyor ki kod bloğuna girilsin. Koşullarımız kapı önünde atak yapılması ve işaretçimizin tam görünür olması. İşaretçinin tam görünür olması için de anahtarın alınmış olması lazım.

Kodumuzun başında da stop(); ile kapi’nin Timeline’ı durdurulmuş. Böylece kapı kapalı konumda. Fonksiyon bloğu içinde de play(); ile kapı açılma animasyonu oynatılıyor.

kapi MovieClip’i içinde Layer 1’de 4. keyframe’de de bir stop(); komutu ekleyin ki; kapı açıldıktan sonra tekrar kapanmasın.

CTRL+ENTER ile test edin. Test esnasında öncelikle boş bir alanda atak yapın, sonra da anahtar üzerinde yapıp anahtarı alıp kapı önüne geçerek tekrar atak yapıp kapıyı açın. Bir test daha yapın ve hiçbir şey yapmadan kapı önünde atak yapın, kapı açılmayacak.

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