Y座標で重ね順を入れ替える

Posted 2010年1月20日 | Auther dada | Category PC・デジタル | Tag タグ: ,
Twitterにツイートする Facebookでシェアする はてなブックマーク

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 »

No comments yet.

Leave a comment

カテゴリー