パーティクルを散らす-3D
昔作ったサンプル。
3D表現の勉強。きれいに4方8方に散らばってくれない。。
以下コード。
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
public class Firework extends Sprite {
private var _particles:Array;
private var _numParticles:Number = 30;
private var _fl:Number = 150;
private var _vpX:Number;
private var _vpY:Number;
private var _gravity:Number = 0.1;
private var _fade:Number = 0.01;
public function Firework() {
stage.addEventListener(MouseEvent.MOUSE_DOWN, init);
}
private function init(e:MouseEvent):void {
_vpX = mouseX;
_vpY = mouseY;
_particles = new Array();
for (var i:int = 0; i < _numParticles; i++) {
var p:Particle = new Particle(5, Math.random() * 0xFFFFFF);
_particles.push(p);
p.xpos = mouseX;
p.ypos = mouseY;
p.vx = Math.round(Math.random() * 10 - 5);
p.vy = Math.round(Math.random() * 10 - 5);
p.vz = Math.round(Math.random() * 8 - 4);
addChild(p);
p.addEventListener(Event.ENTER_FRAME, onEnterframe);
}
}
private function onEnterframe(e:Event):void {
var p:Particle = e.target as Particle;
spread(p);
sortZ();
}
//散らす
private function spread(p:Particle):void {
p.vy += _gravity;
p.xpos += p.vx;
p.ypos += p.vy;
p.zpos += p.vz;
if(p.alpha >= 0) {
var scale:Number = _fl / (_fl + p.zpos);
p.scaleX = p.scaleY = scale;
p.x = p.xpos * scale;
p.y = p.ypos * scale;
p.alpha -= _fade * p.zpos * 0.05;
} else if (p.alpha <= 0) {
var index:Number = _particles.indexOf(p);
_particles.splice(index, 1);
p.removeEventListener(Event.ENTER_FRAME, onEnterframe);
removeChild(p);
p = null;
}
}
//z軸の重なりのソート処理
private function sortZ():void {
_particles.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
for (var i:int = 0; i < _particles.length; i++) {
var p:Particle = _particles[i];
setChildIndex(p, i);
}
}
}
}
import flash.display.Sprite;
class Particle extends Sprite {
public var xpos:Number = 0;
public var ypos:Number = 0;
public var zpos:Number = 0;
public var vx:Number = 0;
public var vy:Number = 0;
public var vz:Number = 0;
public var radius:Number;
public var color:uint;
public function Particle(radius:Number = 10, color:uint = 0x000000) {
this.radius = radius;
this.color = color;
draw();
}
private function draw():void {
graphics.beginFill(color, 1.0);
graphics.drawCircle(0, 0, radius);
graphics.endFill();
}
}
2009 年 12 月 24 日 10:09 PM | category : ActionScript3.0