本題に戻って,
function compare(a:EllipticMotion, b:EllipticMotion):Number {
// 各インスタンスの仮想3次元の奥行きを調べる
var nA:Number = a.getIndexZ();
var nB:Number = b.getIndexZ();
// 各インスタンスの奥行きに応じて並べ順を返す
if (nA < nB) {
return -1;
} else if (nA > nB) {
return 1;
} else {
return 0;
}
}
仮想3次元の奥行きの順に配列
表示リスト内におけるインスタンスのインデックスの位置を変えるのは,
親インスタンス.setChildIndex(子インスタンス:DisplayObject, インデックス:int):void
ここでメインタイムラインのフレームアクションに,
function setOrder():void {
instances_array.sort(compare); // 前掲比較関数で並べ替え
var nLength:uint = instances_array.length;
for (var i:int = 0; i<nLength; i++) { // 並べ替えた配列内のインスタンスを順に取出し
var _mc:EllipticMotion = instances_array[i];
setChildIndex(_mc, i); // 表示リスト内のインデックスを設定
}
}
以上,
スクリプト2 インスタンスを仮想3次元の奥行きの順に並べ替える
// タイムライン: メイン
var myCenter:Point = new Point(stage.stageWidth / 2,stage.stageHeight / 2);
var myRadius:Point = new Point(100,50);
var nCount:uint = 6;
var nDegree:Number = 360 / nCount;
var instances_array:Array = new Array();
var deceleration:Number = 0.1;
for (var i:int = 0; i < nCount; i++) {
var _mc:EllipticMotion = new EllipticMotion(nDegree * i,myCenter,myRadius);
addChild(_mc);
instances_array.push(_mc);
}
addEventListener(Event.ENTER_FRAME, rotate);
function rotate(EventObject:Event):void {
var nSpeed:Number = (stage.mouseX - myCenter.x) * deceleration;
var nLength:uint = instances_array.length;
for (var i:int = 0; i < nLength; i++) {
var _mc:EllipticMotion = instances_array[i];
_mc.rotate(nSpeed);
}
setOrder(); // 追加: 関数呼出し
}
function setOrder():void { // 追加定義
instances_array.sort(compare);
var nLength:uint = instances_array.length;
for (var i:int = 0; i<nLength; i++) {
var _mc:EllipticMotion = instances_array[i];
setChildIndex(_mc, i);
}
}
function compare(a:EllipticMotion, b:EllipticMotion):Number { // 追加定義
var nA:Number = a.getIndexZ();
var nB:Number = b.getIndexZ();
if (nA < nB) {
return -1;
} else if (nA < nB) {
return 1;
} else {
return 0;
}
}
このまま[ムービープレビュー]を確かめると, EllipticMotionクラスのgetIndexZ()が
function compare(a:EllipticMotion, b:EllipticMotion):Number {
var nA:Number = a.getIndexZ();
var nB:Number = b.getIndexZ();
これは前掲スクリプト2でEllipticMotionクラスのrotate()メソッドについて,
// private function getIndexZ(nMin:Number=-1, nMax:Number=1):Number {
public function getIndexZ(nMin:Number=-1, nMax:Number=1):Number {
var nIndexZ:Number = (nMax-nMin)*(sin+1)/2+nMin;
return nIndexZ;
}
スクリプト2に追加する修正はこの点のみなので, EllipticMotionクラスの定義全体を再掲することは控えよう。サンプルファイルをダウンロードして確かめてほしい。今度は[ムービープレビュー]がエラーなく行え,
今回解説した次のサンプルファイルがダウンロードできます。