In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

レイヤーを作る (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();
	}
}