レイヤーを作る (forked from: ballの重なりはどうすればよいですか?)
解決方法の一つとして、レイヤーを作る方法があります。
*
* 前面レイヤー(upperLayer)と後面レイヤー(lowerLayer)を作成して
* ボールを適切な方のレイヤーに追加(xxxxxlayer.addChild())するようにします。
* そうすることで、前面レイヤーに追加された全てのボールは、
* 後面レイヤーに追加された全てのボールより前に表示されることになります。
*
* しかしこの方法は、
* 同じレイヤーに追加されたボール同士の重なり順は全く考えられていないので、
* 例えば、隣のボールと重なってしまうような場合(ボールの個数を倍にした場合など)には、
* 重なり順がおかしくなってしまうことがあります。
*
* これはあくまで、"シンプルで(たぶん)わかりやすい"解決方法の一つということで。
*
/**
* Copyright o8que ( http://wonderfl.net/user/o8que )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/Aql3
*/
/*
* 解決方法の一つとして、レイヤーを作る方法があります。
*
* 前面レイヤー(upperLayer)と後面レイヤー(lowerLayer)を作成して
* ボールを適切な方のレイヤーに追加(xxxxxlayer.addChild())するようにします。
* そうすることで、前面レイヤーに追加された全てのボールは、
* 後面レイヤーに追加された全てのボールより前に表示されることになります。
*
* しかしこの方法は、
* 同じレイヤーに追加されたボール同士の重なり順は全く考えられていないので、
* 例えば、隣のボールと重なってしまうような場合(ボールの個数を倍にした場合など)には、
* 重なり順がおかしくなってしまうことがあります。
*
* これはあくまで、"シンプルで(たぶん)わかりやすい"解決方法の一つということで。
*
*/
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Matrix;
public class FlashTest extends Sprite {
public static const RADIUS:int = 200; // 回転する円の半径
public static const BALL_NUM:int = 12; // ボールの個数
private var _upperLayer:Sprite; // 前面のレイヤー
private var _lowerLayer:Sprite; // 後面のレイヤー
private var _balls:Array;
private var _angle:int;
public function FlashTest() {
_upperLayer = new Sprite();
_lowerLayer = new Sprite();
// _lowerLayer,_upperLayerの順にaddChild()して、
// _upperLayerが_lowerLayerの上になるようにする
addChild(_lowerLayer);
addChild(_upperLayer);
_balls = new Array();
for (var i:int = 0; i < BALL_NUM; i++) {
var ball:Ball = new Ball(0xffffff * Math.random(), 30);
_balls.push(ball);
// いったん全てのボールを後面のレイヤーに配置しておく
_lowerLayer.addChild(ball);
}
_angle = 0;
addEventListener(Event.ENTER_FRAME, update);
}
private function update(e:Event):void {
_angle += int((mouseX - 232) / 30);
for (var i:int = 0; i < BALL_NUM; i++) {
var ball:Ball = _balls[i];
var radians:Number = (_angle + (i * (360 / BALL_NUM))) * (Math.PI / 180);
// var tra:Transform = new Transform(ball);
// tra.matrix = mat;
// は、
// ball.transform.matrix = mat;
// とシンプルに書くことができます
// また、簡単な変換の組み合わせだけなら
// 以下のように全てをMatrixでまとめて、変換してしまうこともできます
ball.transform.matrix = new Matrix(
Math.sin(radians), // X軸方向の拡大率
0, // Y軸方向の傾き
-(Math.cos(radians) / 2), // X軸方向の傾き
1, // Y軸方向の拡大率
232 + RADIUS * Math.cos(radians), // X座標の値
232 + RADIUS * Math.sin(radians) / 5 // Y座標の値
);
// ボールのY座標の値から
// ボールが前面にあるべきなのか、後面にあるべきなのか判断する
if (ball.y > 232) {
// 前面にあるべきボールが後面にあったら、前面へ再配置
if(_lowerLayer.contains(ball)){
_upperLayer.addChild(ball);
}
}else {
// 後面にあるべきボールが前面にあったら、後面へ再配置
if(_upperLayer.contains(ball)){
_lowerLayer.addChild(ball);
}
}
}
}
}
}
import flash.display.Sprite;
class Ball extends Sprite {
public function Ball(color:uint, size:int) {
graphics.beginFill(color);
graphics.drawCircle(0, 0, size);
graphics.endFill();
}
}