アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

【AS3】「ActionScript3の、こんなときどうするの??」

こんにちは、橋本です。
今日は、自分が普段AS3を書いていて「こんなときどうするの??」と思ったところを中心にいくつか書いみました。
思いついたものから書いていったので、内容はバラバラですが、お役に立てる内容が一つでもあれば幸いです。

では、どうぞー。


Q. イベントリスナーに引数を渡したい。

A. 関数を返すイベントハンドラを指定することで、引数を渡すことができます。

サンプル.


// イベントリスナを登録するときに、引数を渡す
addEventListener(MouseEvent.CLICK, clickHandler("hoge"));

private function clickHandler(str:String):Function
{
	return function (event:MouseEvent):void {trace(str)};
}


Q. イベントの進行を止めたい。

A. event.stopPropagation()を使います。現在処理されている対象で、イベントの伝達をストップすることができます。

サンプル.


public class test extends Sprite
{
	public function test()
	{
		var obj:Object = {hoge: "hoge"};
		
		var sprite:Sprite = new Sprite();
		sprite.name = "parent";
		this.addChild(sprite);
		sprite.graphics.beginFill(0xFFFF00);
		sprite.graphics.drawRect(0, 0, 100, 100);
		
		sprite.addEventListener(MouseEvent.CLICK, clickHandler1);
		
		var sprite2:Sprite = new Sprite();
		sprite2.name = "child";
		sprite.addChild(sprite2);
		sprite2.graphics.beginFill(0x00FF00);
		sprite2.graphics.drawRect(0, 0, 50, 50);
		
		sprite2.addEventListener(MouseEvent.CLICK, clickHandler2);
	}
	
	private function clickHandler1(event:MouseEvent):void
	{
		trace("parent");
	}
		
	private function clickHandler2(event:MouseEvent):void
	{
		trace("child")
		
		event.stopPropagation();
	}
}


Q. イベントの、currentTargetとtargetの違いが、実はよくわかりません。

A. 大丈夫です。僕は最初はよくわかっていませんでしたw
currentTargetは、イベントを受け取ったオブジェクトで、targetはイベントを発生させたオブジェクトです。
以下のサンプルで、親のボックスをクリックしたときには、両方とも"parent"と表示されますが、子のボックスをクリックしたときには、targetが"child"となり、currentTargetが"parent"となります。これは、子のボックスをクリックしたことで発生したイベントを、親のボックスで受け取っているからです。

サンプル.


public class test extends Sprite
{
	public function test()
	{
		var obj:Object = {hoge: "hoge"};
		
		var sprite:Sprite = new Sprite();
		sprite.name = "parent";
		this.addChild(sprite);
		sprite.graphics.beginFill(0xFFFF00);
		sprite.graphics.drawRect(0, 0, 100, 100);
		
		sprite.addEventListener(MouseEvent.CLICK, clickHandler1);
		
		var sprite2:Sprite = new Sprite();
		sprite2.name = "child";
		sprite.addChild(sprite2);
		sprite2.graphics.beginFill(0x00FF00);
		sprite2.graphics.drawRect(0, 0, 50, 50);
	}
	
	private function clickHandler1(event:MouseEvent):void
	{
		trace("currentTarget:" + event.currentTarget.name + ", target:" + event.target.name);
	}
}


Q. オブジェクトのクラス名を知りたい。

A. flash.utils.getQualifiedClassNameメソッドを使うと、フルパスのクラス名を取得できます。純粋にクラス名だけを取りたいときには正規表現を使ったりしてみてくだしい。

サンプル.


var sprite:Sprite = new Sprite();

trace(getQualifiedClassName(sprite)); // flash.display::Sprite
trace(getQualifiedClassName(sprite).match(/::(.*)/)[1]); // Sprite


Q. 配列にオブジェクトが含まれているか知りたい(PHPでいうところの、in_array)。

A. indexOfメソッドを使います。配列に含まれている場合には、インデックスを返し、無い場合には"-1"を返してくれるので、そこで判定します。

サンプル.


public static function inArray(item:*, arr:Array):Boolean
{
	return arr.indexOf(item) != -1;
}


Q. 配列のコピーが欲しい。

A. Arrayの中身をfor文で回して…というのは嘘で、Array.concat()もしくは、Array.slice()を引数無しで呼び出すことで作成可能です。

サンプル.


var arr:Array = [1, 2, 3];

var arr2:Array = arr.concat();

for each (var num:Number in arr2)
{
	trace(num);
}


Q. オブジェクトディープコピーが欲しい。

A. ByteArrayクラスのインスタンスを作成することでディープコピーが可能になるようです。(参考:http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html)リンク先にもありますが、一応cloneメソッドのサンプルを載せておきます。

サンプル.


import flash.utils.ByteArray; 
 
function clone(source:Object):* 
{ 
    var myBA:ByteArray = new ByteArray(); 
    myBA.writeObject(source); 
    myBA.position = 0; 
    return(myBA.readObject()); 
}


どうでしょうか。
お役に立てることがひとつでもあれば幸いです。