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

BallFollowingMouse

Get Adobe Flash player
by lzjnsn 21 Jan 2010
    Embed
/**
 * Copyright lzjnsn ( http://wonderfl.net/user/lzjnsn )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/njDh
 */

package {
	import flash.display.Sprite;
	import flash.events.Event;
	
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	
	public class BallFollowingMouse extends Sprite {
		private var ballCount:uint = 50;
		private var speed:Number = 0.2;
		
		//コンストラクタ
		public function BallFollowingMouse() {
			for( var i:uint = 0; i < ballCount; i++ ) {
				addChild( new Ball( this, 200 ) );
			}
			
			addEventListener( Event.ENTER_FRAME, followMouse );
			
			//テスト用
			var _txt:TextField = new TextField();
			addChild( _txt );
			_txt.autoSize = TextFieldAutoSize.LEFT;
			//toString()メソッドの呼び出し
			_txt.text = new BallEvent( BallEvent.FOLLOW, 0, 1, 2 ).toString();
		}
		
		private function followMouse( eventObject:Event ):void {
			//カスタムイベントを配信する
			//
			//先にイベントを登録しておく
			//addEventListener("イベント名" target);
			//イベントを発生させたいタイミングで使う
			//dispatchEvent(new Event("イベント名"));
			dispatchEvent( new BallEvent( BallEvent.FOLLOW, mouseX, mouseY, speed ) );
		}
	}
}


import flash.display.Sprite;
import flash.display.Graphics;
import flash.events.Event;

class Ball extends Sprite {
	
	private var angle:Number;
	private var radius:Number;
	private var sizeRate:Number = 0.1;
	private const deceleration:Number = 0.2;
	
	public function Ball( timeline:Sprite, maxRadius:Number ) {
		var randamRate:Number = Math.random();
		angle = 2 * Math.PI * Math.random();
		radius = maxRadius * randamRate;
		createBall( randamRate );
		
		timeline.addEventListener( BallEvent.FOLLOW, follow );
	}
	
	private function createBall( randamRate:Number ):void {
		var myGraphics:Graphics = graphics;
		myGraphics.beginFill( Math.floor( 0xFFFFFF * randamRate ) + 1 );
		myGraphics.drawCircle( 0, 0, radius * sizeRate );
		alpha = 1 - randamRate;	
	}
	
	private function follow( eventObject:BallEvent ):void {
		var randomRate:Number = Math.random();
		angle += eventObject.speed;
		angle %= Math.PI * 2;
		var nX:Number = eventObject.targetX + radius * Math.cos( angle ) * randomRate;
		var nY:Number = eventObject.targetY + radius * Math.sin( angle ) * randomRate;
		x += ( nX - x ) * deceleration * randomRate;
		y += ( nY - y ) * deceleration * randomRate;
	}
	
}

class BallEvent extends Event {
	public static const FOLLOW:String = "follow";
	private var _targetX:Number;
	private var _targetY:Number;
	private var _speed:Number;
	
	public function get targetX():Number {
		return _targetX;
	}
	public function get targetY():Number {
		return _targetY;
	}
	public function get speed():Number {
		return _speed;
	}
	
	public function BallEvent( event_str:String, myTargetX:Number, myTargetY:Number, mySpeed:Number ) {
		super( event_str );
		_targetX = myTargetX;
		_targetY = myTargetY;
		_speed = mySpeed;
	}
	
	public override function toString():String {
		//メソッドのオーバーライド
		return formatToString( "BallEvent", "type", "bubbles", "cancelable", "eventPhase", "targetX", "targetY", "speed" );
	}
}