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: ポップコーン

Get Adobe Flash player
by inaxo 17 Apr 2009
// forked from shun_channel's ポップコーン

package{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	[SWF(width=465, height=465, backgroundColor=0x0, frameRate=60)]
	public class BoundBall extends Sprite{
		private var balls:Array;
		private var numBall:Number = 5;
		private var gravity:Number = 0.6;
		private var friction:Number = 0.99
		private var bounce:Number = -0.7
		private var left:Number = 0;
		private var right:Number = stage.stageWidth;
		private var top:Number = 0;
		private var bottom:Number = stage.stageHeight;
		
		/*-------------------------
		最初丸をいくつか描きます。
		大きさはランダムで決めます。
		次に、丸の場所はすべて同じ場所に来るように設定をします。(場所はランダム)
		ステージに足します。セットを配列にして、ballsに突っ込みます。
		これを丸の数だけ繰り返します。
		---------------------------*/
		public function BoundBall(){
			balls = new Array();
			for (var i:int = 0; i< numBall;i++){
				var r:uint =5;
				var c:uint = 0xffffff;
				var ball0:Ball = new Ball(r,c,1);
				var ball1:Ball = new Ball(r,c,0.2)
				var ball2:Ball = new Ball(r,c,0.1);
				
				ball0.x = ball1.x = ball2.x = Math.random()*(right - left);
				ball0.y = ball1.y = ball2.y = Math.random()*(bottom - top);
				
				addChild(ball2);
				addChild(ball1);
				addChild(ball0);
				
				var _ball:Array = new Array(ball0, ball1,ball2);
				balls.push(_ball);
			}
			initialVelocity();
			stage.addEventListener(MouseEvent.CLICK,onClick);
			addEventListener(Event.ENTER_FRAME,onEnterframe);
		}
		/*------------
		最初にランダムな方向に加速度を持たせておく。
		-------------*/
		private function initialVelocity():void{
			for(var i:int = 0;i<numBall;i++){
				var ball0:Ball = balls[i][0];
				ball0.vx = Math.random()*60 - 30;
				ball0.vy = Math.random()*60-30;
			}
		}
		/*---------------------
		クリックをすると、速度を持つ。
		ball1とball2は常に付随してくるだけで
		ball0に常に、下の2つのファンクションを発動させる事で
		重力や跳ね返りを表現している。
		----------------------*/
		private function onClick( evt:Event):void{
			initialVelocity();
		}
		
		private function onEnterframe(evt:Event):void{
			for(var i:int = 0;i < numBall;i++){
				var ball0:Ball = balls[i][0];
				var ball1:Ball = balls[i][1];
				var ball2:Ball = balls[i][2];
				
				
				bound(ball0);
				move(ball0);
				var easing:Number =0.25;
				ball1.x += (ball0.x - ball1.x)*easing;
				ball1.y += (ball0.y - ball1.y)*easing;
				ball2.x += (ball1.x - ball2.x)*easing;
				ball2.y += (ball1.y - ball2.y)*easing;
			}
		}
		
		/*-------------
		下への加速をし、また、全体的に速度は減少していく。
		------------------*/
		private function move(ball:Ball):void{
			ball.vy += gravity;
			ball.vx *= friction;
			ball.vy *= friction;
			ball.x += ball.vx;
			ball.y += ball.vy;
		}
		
		/*-----------
		跳ね返るときは、枠の中に収めて、反対方向の加速へと変換をする。
		-----------*/
		private function bound(ball:Ball):void{
			if(ball.x +ball.radius > right){
				ball.x = right - ball.radius;
				ball.vx *= bounce;
			}else if(ball.x -ball.radius<left ){
				ball.x = ball.radius;
				ball.vx *= bounce;
			}
			if (ball.y + ball.radius>bottom){
				ball.y = bottom-ball.radius;
				ball.vy *= bounce;
			}else if(ball.y - ball.radius<top){
				ball.y = ball.radius;
				ball.vy *= bounce;
			}
		}
	}
}

		
import flash.display.Sprite;
class Ball extends Sprite{
		public var radius :Number;
		public var vx:Number;
		public var vy:Number;
		private var color:uint;
		private var alp:Number;
		
		public function Ball( r:Number,c:uint , a:Number){
			radius = r;
			color = c;
			alp = a;
			drawBall();
		}
		private function drawBall():void{
			graphics.beginFill( color,alp);
			graphics.drawCircle(0,0,radius);
			graphics.endFill();
		}
	}