flash on 2009-5-17

by kohie_yamashima
♥0 | Line 65 | Modified 2009-05-17 18:15:03 | MIT License
play

ActionScript3 source code

/**
 * Copyright kohie_yamashima ( http://wonderfl.net/user/kohie_yamashima )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/8u6r
 */

package {
      
   import flash.display.*;
   import flash.events.EventDispatcher;
   import flash.events.MouseEvent;
   import flash.events.TimerEvent;
   import flash.text.*
   import flash.utils.*;


   public class FireFlower extends Sprite {

  
  var drawmc:MovieClip=new MovieClip();//花火の粒子を線(点)描するためのMCの作成
  var viewmc:MovieClip=new MovieClip();//全てのBM、MCを表示するMCを作成
  addChild(viewmc);

  //描画の基盤となるBMの作成
  var bm:BitmapData=new BitmapData(540,400,true,0x00000000);
  var bitmap:Bitmap=new Bitmap(bm);
  viewmc.addChild(bitmap);


  var bm2:BitmapData=new BitmapData(540,400,true,0x0B000000);//余韻を表現するための、半透明の黒いBMの作成

  viewmc.addChild(mask_mc);

  var bmp:Number=0.95;//エネルギーの減少に使用する定数を設定
  var count:uint=600;//一つの花火にを形作る粒子の数を設定
  
  var particleList:Array=new Array;//粒子データを保管する配列の作成

//------マウスダウンしたら花火用の粒子データを生成----------------
function mouseDownHandler(event:MouseEvent):void{
        
	//花火を真ん中ぐらいに生成するために、X、Yの値を作成
	var setX:Number=140+Math.random()*(stage.stageWidth-280);
	var setY:Number=40+Math.random()*(stage.stageHeight-200);
	
	//粒子データを作成
	for (var i:uint=0; i<count; i++) {
		var particle:Object=new Object;
		particle.x=setX;
		particle.y=setY;
		particle.energy=5*Math.random();
		var angle:Number = Math.random()*360;
		var velocity = 8*Math.random();
		particle.vx=Math.cos(angle)*velocity;
		particle.vy=Math.sin(angle)*velocity;
		particleList.push(particle);
	}
}

//------粒子データにあわせて、描画を行い、BMに反映させる----------
function EnterFrameHandler(event:Event):void {
	drawmc.graphics.clear();
	drawmc.graphics.lineStyle(3,0xFFFFFF);
	var n:uint=particleList.length;
	for (var i:uint=0; i<n; i++) {
		var particle:Object=particleList[i];
		if (particle) {
			//各粒子のエネルギー量が一定以下になった場合削除する
			if (particle.energy<0.1) {
				particle=null;
				particleList.splice(i,1);
				continue;
			}
			with (particle) {
				x+=vx;
				y+=vy;
				//時間が経つごとに粒子のエネルギーを減少させる
				energy*=bmp;
				vx*=bmp;
				vy*=bmp;
				//仮想重力の入力
				vy+=0.05;
			}
			//各粒子データを線(点)描する
			drawmc.graphics.moveTo(particle.x,particle.y);
			drawmc.graphics.lineTo(particle.x+0.5,particle.y+0.5);
		}
	}
	//半透明の黒いBMを覆いかぶせる
	bm.draw(drawmc);
	//BMに描画したデータを反映
	bm.draw(bm2);
}

stage.addEventListener(MouseEvent.CLICK,MouseDownHandler);
stage.addEventListener(Event.ENTER_FRAME,EnterFrameHandler);

}
}