Forked from: s26's ポップコーン diff:5 forked from: ポップコーン drapon forked:0favorite:0lines:103license : All rights reserved modified : 2010-03-07 17:04:53 Embed Tweet // forked from s26'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 = 100; private var gravity:Number = 1.6; private var friction:Number = 0.99 private var bounce:Number = -0.7 private var left:Number = 1; 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 = 0xdddddd; 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(); } } Code Fullscreen Preview Fullscreen addChild MouseEvent.ENTER_FRAME MouseEvent.CLICK addEventListener push Array Math.random uint Sprite int Number sort new page view favorite forked pv112 forked from: forked from: ポップコ.. mikako forked:0 favorite:0lines:103 (diff:2) tag: icu-cg2010