forked from: ポップコーン
// 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();
}
}