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

円盤群舞

勝手に動き回っているように見える奴等
* 実は目標を決めてそこに向かう健気な性格
* 3D Bacic Version
Get Adobe Flash player
by Kay 17 Jun 2009
    Embed
/**
 * Copyright Kay ( http://wonderfl.net/user/Kay )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/lxrS
 */

// forked from Kay's My target
/*
 * 勝手に動き回っているように見える奴等
 * 実は目標を決めてそこに向かう健気な性格
 * 3D Bacic Version
 */
package {
	import flash.display.*;
	import flash.geom.*;
	import flash.events.*;
	[SWF(width="465",height="465",frameRate="30")]
	public class Main extends Sprite {
		private var arrows:Array = new Array();
		private var arrowsNum:uint = 32;
		public function Main():void {
			var movingTarget:Shape = new Shape();
			movingTarget.x = Math.random()*465;
			movingTarget.y = Math.random()*465;
			movingTarget.z = Math.random()*465;
			for (var i:uint = 0; i < arrowsNum; i++) {
				var Arrow:MovingObject = new MovingObject(movingTarget,			// target
														  Math.random()*465,	// x
														  Math.random()*465,	// y
														  Math.random()*465,	// z
														  Math.random()*360,	// rotationZ
														  Math.random()*360,	// rotationX
														  Math.random()*6+6		// speed
														  );
				addChild(Arrow);
				arrows.push(Arrow);
			}
			addEventListener(Event.ENTER_FRAME, sortZ);
		}
		private function sortZ(e:Event):void {
			arrows = arrows.sortOn("z",Array.DESCENDING | Array.NUMERIC);
			for (var i:uint = 0; i < arrowsNum; i++) {
				addChildAt(arrows[i] , i);
			}
		}
	}
}

import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.filters.*;
class MovingObject extends Sprite {
	private var myTarget:Shape;
	private var nSpeed:Number;
	private var curveLimit:Number = 4;
	public function MovingObject(vTarget:Shape, vX:Number, vY:Number, vZ:Number, vRotationZ:Number, vRotationX:Number, vSpeed:Number):void {
		myTarget = vTarget;
		x = vX;
		y = vY;
		z = vZ;
		rotationZ = vRotationZ;
		rotationX = vRotationX;
		nSpeed   = vSpeed;
		// Draw
		graphics.beginFill(Math.ceil(Math.random()*0xffffff));
		graphics.drawCircle(0,0,20);
		addEventListener(Event.ENTER_FRAME, xMove);
	}
	private function xMove(e:Event):void {
		// ターゲットまでの距離を求める
		var distXY:Number = Point.distance(new Point(x,y), new Point(myTarget.x, myTarget.y));
		var distYZ:Number = Point.distance(new Point(y,z), new Point(myTarget.y, myTarget.z));
		var distZX:Number = Point.distance(new Point(z,x), new Point(myTarget.z, myTarget.x));
		while(distXY < 200 && distYZ < 200 && distZX < 200) {
			myTarget.x = Math.random()*600-67.5;
			myTarget.y = Math.random()*600-67.5;
			myTarget.z = Math.random()*600-67.5;
			distXY = Point.distance(new Point(x,y), new Point(myTarget.x, myTarget.y));
			distYZ = Point.distance(new Point(y,z), new Point(myTarget.y, myTarget.z));
			distZX = Point.distance(new Point(z,x), new Point(myTarget.z, myTarget.x));
		}
		// ターゲットの方向を得る ## Z軸(x,y) ##
		var targetRadian:Number = Math.atan2(myTarget.y-y, myTarget.x-x);
		var targetAngle:Number = targetRadian/Math.PI*180;
		// 角度の差から進む方向を決め、徐々に向きを変える
		var dif:Number = angleBetween(rotationZ,targetAngle);
		if (Math.abs(dif) > curveLimit) {
			if (dif > 0) {
				rotationZ+=curveLimit;
			} else {
				rotationZ-=curveLimit;
			}
		} else {
			rotationZ+=dif;
		}
		// 移動
		var radian:Number = rotationZ / 180 * Math.PI;
		x += Math.cos(radian)*nSpeed;
		y += Math.sin(radian)*nSpeed;
		
		// ターゲットの方向を得る ## X軸(y,z) ##
		targetRadian = Math.atan2(myTarget.z-z, myTarget.y-y);
		targetAngle = targetRadian/Math.PI*180;
		// 角度の差から進む方向を決め、徐々に向きを変える
		dif = angleBetween(rotationX,targetAngle);
		if (Math.abs(dif) > curveLimit) {
			if (dif > 0) {
				rotationX+=curveLimit;
			} else {
				rotationX-=curveLimit;
			}
		} else {
			rotationX+=dif;
		}
		// 移動
		radian = rotationX / 180 * Math.PI;
		y += Math.cos(radian)*nSpeed;
		z += Math.sin(radian)*nSpeed;
		// ターゲットの方向を得る ## Y軸(z, x) ##
		targetRadian = Math.atan2(myTarget.x-x, myTarget.z-z);
		targetAngle = targetRadian/Math.PI*180;
		// 角度の差から進む方向を決め、徐々に向きを変える
		dif = angleBetween(rotationY,targetAngle);
		if (Math.abs(dif) > curveLimit) {
			if (dif > 0) {
				rotationY+=curveLimit;
			} else {
				rotationY-=curveLimit;
			}
		} else {
			rotationY+=dif;
		}
		// 移動
		radian = rotationY / 180 * Math.PI;
		z += Math.cos(radian)*nSpeed;
		x += Math.sin(radian)*nSpeed;
		if (z > 0) {
			var vBlur:uint = Math.floor(z/30);
			filters = [new BlurFilter(vBlur,vBlur)];
		}
	}
	// 進行方向と目標との角度差を得る
	// -180~180の範囲内
	private function angleBetween(myAngle:Number, targetAngle:Number):Number {
		var diffAngle:Number = targetAngle - myAngle;
		while (diffAngle < 0) diffAngle+=360;
		diffAngle %= 360;
		if (diffAngle > 180) diffAngle = diffAngle-360;
		return (diffAngle);
	}
}