ActionScript3の重ね順は setChildIndex()のおかげでだいぶラクになりましたね。
ゲームとかいろんなとこで必要になる、Y座標による重ね順の変更です。
だいぶ以前 mixiに書いてたのを掘り起こしてリプレースしました。
/************************************** * Y座標で重ね順を変更するクラス */ class DepthSort { /*********************** * 並べ替えを行う * indexListと itemListを別に用意しているのは、同じ DisplayObjectContainerに配置されていても * 並べ替え対象でないものがある可能性があるから。 * * @param objList 並べ替えを行いたい DisplayObjectが格納された配列 * @param stage 対象 DisplayObjectの親となる DisplayObjectContainer */ public static function sortY( objList:Array, stage:DisplayObjectContainer ):void{ var length:int = objList.length; var itemList:Array = []; var indexList:Array = []; var i:int; // ソートの材料を作る for ( i = 0; i < length; i++ ) { var obj:DisplayObject = objList[i]; // indexを保存 var index:int = stage.getChildIndex( obj ); indexList.push( index ); itemList.push( {obj:obj, index:index, y:obj.y} ); } // index順ソート indexList.sort( Array.NUMERIC ); // 座標順ソート itemList.sortOn( "y", Array.NUMERIC ); // 重ね合わせ変更 for ( i = 0; i < length; i++ ) { // 現在の重ね順と違う場合のみ変更 if( itemList[i].index != indexList[i] ){ stage.setChildIndex( itemList[i].obj, indexList[i] ); } } } }
やってることは単純で、座標でソートして、index順にソートしたものと
違っていたら再配置ということをやっています。
var mcList:Array = [mc1, mc2, mc3]; this.addEventListener( Event.ENTER_FRAME, function(){ DepthSort.sortY( mcList, this ); });
みたいな感じで使います。
No comments yet.