feb19.jp

Nobuhiro Takahashi
Designer / Engineer

AS2ではMovieClipのArrayをMovieClipのプロパティでArray.sortOnできない

AS2ではMovieClipのArrayをMovieClipのプロパティでArray.sortOnできない

AS3だと、MovieClipを入れたArrayを「MovieClipのプロパティでArray.sortOn」することはできるけど、AS2だとできない。

これは、MovieClipをArrayの要素として一個一個挿入していって、array[2]とかで要素を取り出したとき、AS3ではMovieClipインスタンスとして返してくれるのだけど、AS2ではMovieClipのスコープ(_level0.mc2 と言う風な感じ)を返すためです。

つまり、Array.sortOnをしたときは、プロパティ云々は関係なくて、「_level.mc2」などのスコープを文字列としてソートするのです。

要は、こういう場合、

var a = new Array();
a.push(mc1);
a.push(mc3);
a.push(mc2);
a.sortOn("_width" | Array.NUMERIC, Array.DESCENDING);
for(var i=0; i<a.length; i++) {
	trace(a[i] + " " + a[i]._width);
}

どうやっても、おいたmc1,2,3は_widthは関係なくて、_level0.mc3,2,1という順でトレースされるのです。

ちなみに、AS2でAS3のように、MovieClipのプロパティを使ってソートをしたいときは、Array.sort()を使います。

_widthで大きい順にソートします。

var a = new Array();
a.push(mc1);
a.push(mc3);
a.push(mc2);
a.sort(order);
for(var i=0; i<a.length; i++) {
	trace(a[i] + " " + a[i]._width);
}
function order(a, b):Number {
	if(a._width > b._width) {
		return -1;
	} else if(b._width > a._width) {
		return 1;
	} else {
		return 0;
	}
}

Array.sort()の引数に、特殊な関数(というかこれはもう決まり文句みたいなものなので、まるまる覚えた方がいいと思います)orderを与えてやり、order関数の中で、aとbの._widthを比較する処理を作ってやります。aの方が大きければ、配列の要素番号を後ろに、bの方が大きければ、配列の要素番号を前に、という処理です。

AS3に慣れすぎてると、業務とかでAS2に帰ってきたときにこういう凡ミスを起こしてしまうのですよね。AS2もたまには触れておかないとね。

Tweet Share Bookmark

Navigation

prev: 数学でつまずくのはなぜか
next: Simple Youtube Viewer on AIR

Recently Entries