forked from: とにかく真似して勉強(forked from: Particle Sample)
大量のパーティクルを発生させてみた
マウスを押してる間でてくるよ
// forked from siny's とにかく真似して勉強(forked from: Particle Sample)
// forked from cellfusion's Particle Sample
// write as3 code here..
// 大量のパーティクルを発生させてみた
// マウスを押してる間でてくるよ
package {
import flash.display.Sprite;
import flash.display.StageQuality;
import flash.events.Event;
import flash.events.MouseEvent;
import net.hires.debug.Stats;
[SWF(width="465", height="465", backgroundColor="0x000000", frameRate="30")]
public class ParticleSample extends Sprite {
private var _particles:Array = [];
private var _emitter:Emitter;
// 1フレーム間に発生させる Particle 数
private const PARTICLE_NUM:uint = 1;
public function ParticleSample(){
stage.quality = StageQuality.BEST;
setup();
//addChild(new Stats());
}
private function setup():void {
_emitter = new Emitter();
addChild(_emitter);
for (var i:uint = 0; i < 100; i++) {
_particles.push(new Particle());
}
addEventListener(Event.ENTER_FRAME, draw);
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
}
private function draw(event:Event):void {
_emitter.update();
for each (var p:Particle in _particles) {
if (!p.destroy) {
p.vy -= 0.98;
p.update();
}
}
}
private function mouseDown(event:MouseEvent):void
{
addEventListener(Event.ENTER_FRAME, createParticle);
stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
}
private function mouseUp(event:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUp);
removeEventListener(Event.ENTER_FRAME, createParticle);
}
private function createParticle(event:Event):void
{
var count:uint = 0;
for each (var p:Particle in _particles) {
// 停止している Particle を探す
if (p.destroy) {
p.x = _emitter.x;
p.y = _emitter.y;
p.init();
addChild(p);
count++;
}
if (count > PARTICLE_NUM) break;
}
}
}
}
import flash.display.Sprite;
class Emitter extends Sprite
{
public var vx:Number = 0;
public var vy:Number = 0;
public function Emitter()
{
//graphics.beginFill(0x808080);
//graphics.drawCircle(0, 0, 10);
//graphics.endFill();
//blendMode = "add";
}
public function update():void
{
var dx:Number = root.mouseX - x;
var dy:Number = root.mouseY - y;
var d:Number = Math.sqrt(dx*dx+dy*dy) * 0.2;
var rad:Number = Math.atan2(dy, dx);
vx += Math.cos(rad)*d;
vy += Math.sin(rad)*d;
vx *= 0.7;
vy *= 0.7;
x += vx;
y += vy;
}
}
import flash.filters.BlurFilter;
class Particle extends Sprite
{
public var vx:Number;
public var vy:Number;
public var life:Number;
public var size:Number;
private var _count:uint;
private var _destroy:Boolean;
public function Particle()
{
size = Math.random() * 13 + 1;
var red:uint = Math.floor(Math.random()*100+156);
var blue:uint = Math.floor(Math.random()*100+100);
var green:uint = Math.floor(Math.random()*156);
var color:Number = (red << 16) | (green << 8) | (blue);
graphics.clear();
graphics.beginFill(color);
graphics.drawCircle(0, 0, size);
graphics.endFill();
//filters = [new BlurFilter(4,4,2)];
// 大量のオブジェクトを重ねるとおかしくなる
//blendMode = "add";
_destroy = true;
}
public function init():void
{
vx = Math.random() * 10 - 5;
vy = Math.random() * 10 - 5;
life = Math.random() * 100 + 5;
_count = 0;
_destroy = false;
}
public function update():void
{
x += vx/2;
y += vy/2;
_count++;
// 死亡フラグ
if (life < _count) {
_destroy = true;
parent.removeChild(this);
}
}
public function get destroy():Boolean
{
return _destroy;
}
}