as3 nested array with object

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;

// Kütüphanedeki objeleri sahneye ekliyorum. 
// addChild işlemini başka bir işlemde yapıyorum.
var roof:libRoofSouth = new libRoofSouth();
roof.name = "libRoofSouth";
var ramp:libRampWest = new libRampWest();
ramp.name = "libRampWest";
var plain:libPlainBlock = new libPlainBlock();
plain.name = "libPlainBlock";
var chest:libChestClosed = new libChestClosed();
chest.name = "libChestClosed";
var ramp2:libRampSouth = new libRampSouth();
ramp2.name = "libRampSouth";

// Objeleri dizilere ekleyip daha sonra istediğim gibi ekleme çıkartma yapabiliyorum.
var array1:Array = [ramp, plain, plain, ramp2];
var array2:Array = [plain,plain,plain,plain];
var array3:Array = [chest, chest, chest, chest];

// Bütün dizilerimi bir tane array içinde tutuyorum.
var level:Array = [array1,array2,array3];

/*
	conditions
		@i = column
		@j = row
*/

// Level'ı döngüye sokuyorum...
// Bu durumda 3 kere döngü dönecektir. 0,1,2 şeklinde.
for(var i:int = 0; i < level.length; i++)
{
	trace(i);
	// Bu döngüde ise yukarıda oluşturulan dögünün içine giriyor yani şu şekilde bi işlem oluyor
	// Herşeyi içine alan dizinin içindeki array'in değerleri al.
	// array[0]
	// array[array1] = içinde değeleri alacak yani hangi objeleri eklediysek. gibi...
	for(var j:int = 0; j < level[i].length; j ++)
	{
		var ObjectClass:Class = getDefinitionByName(level[i][j].name) as Class;
		var bmd:BitmapData = new ObjectClass() as BitmapData;
		
		var imgBmp:Bitmap = new Bitmap(bmd);
		imgBmp.x = 5 + imgBmp.width * j;	// İlk olarak x koordinatını ayarlıyoruz. bu durumda 0,1,2,3,4... ile imgBmp'nin width'i çarpılacak.
		imgBmp.y = 210 - (imgBmp.height-50) * i; // Daha sonra Sütün sayısına göre ekliyoruz. 0,1,2 şeklinde olacaktır.
		addChild(imgBmp);		
	}
}
Advertisements

as3 dropTarget kullanımı

Basit olarak bir hitTestPoint gibi düşünülebilir. Seçtiğimiz objenin hangi objenin üstüne sürüklendiğini buluyoruz. İlk olarak objenin üstündeki nesne hangi türden ise (shape,textfield,sound) vs. onun türünü veriyor. Ancak biz parent seçicisiyle bir üste çıkarak bunun hangi türden olduğunu kolaylıklada bulabiliriz.

Bu arada sahnede bir adet movieclip “mcSurukle” bu tutup sürükleyip bırakacağımız movieclip, daha sonra iki tane daha movieclip objemiz var bunlarda hitleri kontrol edeceğiz. İsimlerini siz istediğiniz gibi verebilirsiniz ayrıca onlarca movieclib’i bu yöntemle bulabilirsiniz.

import flash.events.MouseEvent;

mcSurukle.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
mcSurukle.addEventListener(MouseEvent.MOUSE_UP, onUp);

function onDown(event:MouseEvent):void
{
	mcSurukle.startDrag();
}

function onUp(event:MouseEvent):void
{
	mcSurukle.stopDrag();

	if(mcSurukle.dropTarget != null)
	{
		var hangisinde:String = mcSurukle.dropTarget.parent.name;
		trace("hangisinin üstünde = " + hangisinde);
	}

}

as3 Math.min

Game development’da bi çok yerde Matematik fonksiyonlarını sık sık kullanırız. Bunlardan Math.min mantığı belirlediğimiz iki değerden minimum değere kadar saymasını sağlıyor. Yani 0,100 arasında bi değerim varsa sağ taraftaki 100 değerini alıp 0 değerinin ancak ve ancak sadece 100’e kadar gelmesini sağlıyor.

Aşağıdaki örnekte ise kullanıcı sahnede herhangi bir yere tıklıyor. Tıkladığın yerin X ve Y koordinatlarını alıp bir değişkene kaydediyor daha sonra sürtünme ve hız değerlerini hesaplayıp sahnedeki objemizi belirlediğimiz koordinat sistemine fırlatıyoruz.

var xSpeed:Number = 0;
var ySpeed:Number = 0;
var friction:Number = 0.898;
var rotationSpeed:Number = 3;
var power:Number = 0;
var isRotate:Boolean = true;

addEventListener(Event.ENTER_FRAME, update);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onStageDown);
stage.addEventListener(MouseEvent.MOUSE_UP, onStageUp);

function onStageDown(event:MouseEvent):void
{
	isRotate = false;
}

function onStageUp(event:MouseEvent):void
{
	if(!isRotate)
	{
		isRotate = true;
		trace("***** false oldugu icin girdi");
		xSpeed += power * Math.cos((mcMeter.rotation - 90) * 0.0174532925) / 10;
		ySpeed += power * Math.sin((mcMeter.rotation - 90) * 0.0174532925) / 10;

		power = 0;
		// tam tersine döndürmek için çarpıyoruz.
		rotationSpeed *= -1;
	}
}

function update(event:Event):void
{
	if(isRotate)
	{
		trace("isRotate true");
		mcMeter.rotation += rotationSpeed;
	}
	else
	{
		trace("isRotate false and power plus");
		power++;
		power = Math.min(power,100);
		mcBall.txt.text = ""+power;
	}

	mcBall.x += xSpeed;
	mcBall.y += ySpeed;
	xSpeed *= friction;
	ySpeed *= friction;
}

Grad değerini Dereceye çevirme

1 grad‘ın değeri bir çemberdeki 400 eşit parça demektir. Derece ise 360 eşit parçadır.

Soru : 15 grad kaç derecedir ?

Bu soruda dikkate edilmesi gereken “grad değerini dereceye çevirme” dir. Yani iki farklı mantığı tek bir mantığa çevirmektir.

Cevap : Sorunun cevabı ise bize verilen “15” değerini toplam grad değerine (400)’e bölmektir. “0,0375” değerini alırız. Artık değerimiz 0-1 arasında orantılanmış durumda. 400’e bölmemizin sebebi ölçeğin en büyük değerine böldük yani 400 değerine. Şimdi grad’ı nasıl çarparak 0 ile 1 arasında orantıladıysak, çarparakta başka bir ölçek değerini bulmuş oluruz. Derecenin en büyük değeri 360 olduğunu biliyoruz. aldığımız “0,0375 değerini 360 ile çarparsak, (15 grad kaç derecedir ?) sorusunun cevabını buluruz. Yani 13,5 değerini bulmuş oluruz.”

Soru Formülü : 15 grad = (15 / 400) * 360 = 13.5
15 grad = (grad değeri / ölçeğin en büyük değeri) * derecenin en büyük değeri

Actionscript’deki karşılığı ise şu şekilde olmalıdır;

var derece:Number = 360;
var grad:Number = 400;
var gradDegeri:int;
var dereceSonuc:Number;

btnHesapla.addEventListener(MouseEvent.CLICK, onClick);

function onClick(event:MouseEvent):void
{
	gradDegeri = int(txtGrad.text);
	dereceSonuc = (gradDegeri / grad) * 360;
	txtSonuc.text = dereceSonuc.toString() + " ° C" ;
}

as3 toggle

var isToggle:Boolean;
var ballonState:String = "default";
stage.addEventListener(MouseEvent.CLICK, onClick);
stage.addEventListener(Event.ENTER_FRAME, onEnter);

function onClick(e:MouseEvent):void
{
    if(!isToggle)
        ballonState = "inflate";
    else
        ballonState = "defalte";

    isToggle = !isToggle;
}

function onEnter(e:Event):void
{
    if(ballonState == "inflate")
    {
        //mc_ballon is Ellipse Shape MovieClip like Ballon Shape.
        mc_ballon.scaleX += 0.01;
        mc_ballon.scaleY += 0.01;
    }
    else if(ballonState == "defalte")
    {
        mc_ballon.scaleX -= 0.01;
        mc_ballon.scaleY -= 0.01;
    }
}

x and y axis 3d rotation

Bunun türkçe karşılığı olarak “x ve y koordinatlarına göre yön değiştirme” diyebiliriz sanırım. Biraz uzun oldu ama idare edin artık 🙂 Aşağıdaki uygulamada sahneye bir movieclip çiziyoruz, daha sonra registration point noktasını orta nokta olarak ayarladıktan sonra sahneye bir adet EnterFrame dinleyicisi atıyoruz bu sürekli mouseX ve mouseY koordinatlarını ayrıca rotationX ve rotationY koordinat değerlerini güncelleyecek ve bizi bilgilendirecek.

Aşağıdaki kodları kısaca açıklayacak olursak; İlk olarak enterFrame ile koordinatları dinliyoruz. Daha sonra anim isimli movieclibimizin değerini mouseX değerine göre yönlendiriyoruz. Bunu yaparken mouseX & mouseY ile sahnemizin yükseklik & genişlik arasındaki farkı alıyoruz bu farklı yarıya bölüyoruz. Daha sonra çıkan değeri objemizin o an ki rotationX & rotationY değerlerine göre hareket almasını istediğimiz değerleri giriyoruz. Fazla hareket sağlanmaması içinde objemizi 0.009 gibi binlik rakamlarla çarparak sayımızı düşürüyoruz. Yani;

1000 * 0.005 = 5 gibi bir sonuç oluyor.


addEventListener(Event.ENTER_FRAME, update);

function update(event:Event):void
{
	anim.rotationX += ((stage.mouseY - stage.stageHeight / 2) - anim.rotationX*20)*0.009;
	anim.rotationY += ((stage.mouseX - stage.stageWidth / 4) - anim.rotationY*30)*0.009;
}

as3 galaksi efekti

Açıklamaları çok yakında ekleyeceğim. Kodu deneyebilmek için ilk olarak sahneye bir adet yıldız çizin daha sonra onu movieclibe çevirip Export for Actionscript dedikten sonra ismini Star olarak vererek uygulamayı deneyebilirsiniz.


root.transform.perspectiveProjection.fieldOfView = 150;

var mcHolder:Sprite = new Sprite();
addChild(mcHolder);

stage.addEventListener(Event.ENTER_FRAME, loopEf);

function loopEf(event:Event):void
{
	var star:Star = new Star();
	addChild(star);

	star.x = stage.stageWidth >> 1;
	star.y = stage.stageHeight >> 1;
	star.z = 0;
	star.xVel = Math.random() * 4 - 2;
	star.yVel = Math.random() * 4 - 2;
	star.zVel = Math.random() * 4 - 2;
	star.count = 0;
	mcHolder.addChild(star);
	star.addEventListener(Event.ENTER_FRAME, moveStar);
}

function moveStar(event:Event):void
{
	event.currentTarget.x += event.currentTarget.xVel;
	event.currentTarget.y += event.currentTarget.yVel;
	event.currentTarget.z += event.currentTarget.zVel;
	event.currentTarget.count++;

	if(event.currentTarget.count > 100)
	{
		var s:Sprite = event.currentTarget as Sprite;
		s.removeEventListener(Event.ENTER_FRAME, moveStar);
		mcHolder.removeChild(s);
		if(s) s = null;
	}
}