flash on 2009-5-18
♥0 |
Line 73 |
Modified 2009-05-18 04:44:16 |
MIT License
archived:2017-03-20 06:39:39
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/2RCN
*/
package {
import flash.display.*;
import flash.events.EventDispatcher;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.geom.*;
[SWF(width=600, height=600, frameRate=30, backgroundColor=0x000000)]
public class FireFlower extends MovieClip {
private var drawmc:MovieClip=new MovieClip(); //花火の粒子を線(点)描するためのMCの作成
private var viewmc:MovieClip=new MovieClip(); //全てのBM、MCを表示するMCを作成
private var bm:BitmapData=new BitmapData(600,600,true,0x00000000);//描画の基盤となるBMの作成
private var bitmap:Bitmap=new Bitmap(bm);
private var bm2:BitmapData=new BitmapData(600,600,true,0x0B000000); //余韻を表現するための、半透明の黒いBMの作成
private var bmp:Number=0.95;//エネルギーの減少に使用する定数を設定
private var count:uint=600;//一つの花火にを形作る粒子の数を設定
private var particleList:Array=new Array;//粒子データを保管する配列の作成
private var setX:Number;
private var setY:Number;
private var particle:Object;
private var angle:Number;
private var velocity:Number;
private var vx:Number;
private var vy:Number;
public function FireFlower(){
addChild(viewmc);
viewmc.addChild(bitmap);
stage.addEventListener("click",MouseDownHandler);
stage.addEventListener("enterFrame", rameHandler)
}
//------マウスダウンしたら花火用の粒子データを生成----------------
private 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:Number = 8*Math.random();
particle.vx=Math.cos(angle)*velocity;
particle.vy=Math.sin(angle)*velocity;
particleList.push(particle);
}
}
//粒子データにあわせて、描画を行い、BMに反映させる
private function rameHandler():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);
}
}
}