パーティクルエフェクト1
画像文字のパーティクルエフェクト。
エフェクト終了の判断がいまいち。。
♥0 |
Line 122 |
Modified 2011-07-12 18:20:45 |
MIT License
archived:2017-03-20 05:03:09
ActionScript3 source code
/**
* Copyright hacker_tmbt9fl2 ( http://wonderfl.net/user/hacker_tmbt9fl2 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/AoD1
*/
package {
import com.flashdynamix.motion.Tweensy;
import fl.motion.easing.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.ColorTransform;
import flash.net.URLRequest;
import flash.system.Security;
import net.hires.debug.Stats;
/**
* ...
* @author ccsxw718
*/
[SWF(width="500", height="500", backgroundColor="0xFFFFFF", frameRate="30")]
public class ParticleEffect1 extends Sprite {
private var _loader:Loader;
private var _particleList:Vector.<Particle> = new Vector.<Particle>();
private var _canvas:BitmapData;
private var _initX:Number;
private var _initY:Number;
private const CTF:ColorTransform = new ColorTransform(1, 1, 1, 1, 15, 15, 15);
private var _finishList:Array = [];
private var _sourceBmd:BitmapData;
public function ParticleEffect1() {
_init();
}
private function _init():void {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.quality = StageQuality.LOW;
Security.loadPolicyFile("http://s-ebata.com/crossdomain.xml");
_loader = new Loader();
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onComplete);
_loader.load(new URLRequest("http://s-ebata.com/dummy_text.png"));
}
private function _onComplete(e:Event):void {
_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, _onComplete);
_initX = Math.floor((stage.stageWidth - _loader.content.width) / 2);
_initY = Math.floor((stage.stageHeight - _loader.content.height) / 2);
//ビットマップの情報を配列に格納
_sourceBmd = new BitmapData(_loader.content.width, _loader.content.height, true, 0xFFFFFFFF);
_sourceBmd.draw(_loader.content);
var bmp:Bitmap = new Bitmap(_sourceBmd);
var i:uint, j:uint;
for (i = 0; i < _loader.content.width; i++) {
for (j = 0; j < _loader.content.height; j++) {
var color:uint = _sourceBmd.getPixel32(i, j);
if (color == 0xFFFFFFFF) continue;
_particleList.push(new Particle(i, j, color));
}
}
//初期座標
var p:Particle;
for (i = 0; i < _particleList.length; i++) {
p = _particleList[i];
p.x = Math.round(stage.stageWidth * Math.random() + 0.5);
p.y = Math.round(stage.stageHeight * Math.random() + 0.5);
}
_canvas = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0xFFFFFFFF);
addChild(new Bitmap(_canvas));
addEventListener(Event.ENTER_FRAME, _onRender);
addChild(new Stats());
}
private function _onRender(e:Event):void {
var p:Particle;
var diffX:Number, diffY:Number, stepX:Number, stepY:Number;
var i:uint;
_canvas.lock();
for (i = 0; i < _particleList.length; i++) {
p = _particleList[i];
diffX = (_initX + p.tx) - p.x;
diffY = (_initY + p.ty) - p.y;
stepX = diffX * .2;
stepY = diffY * .2;
if (Math.abs(diffX) < 1 && Math.abs(diffY) < 1) {
p.x = (_initX + p.tx);
p.y = (_initY + p.ty);
} else {
p.x += stepX;
p.y += stepY;
}
_canvas.setPixel(p.x, p.y, p.color);
if (p.x == (_initX + p.tx) && p.y == (_initY + p.ty)) {
if (_finishList[i] == null) _finishList.push(i);
}
}
_canvas.unlock();
_canvas.colorTransform(_canvas.rect, CTF);
if (_finishList.length >= _particleList.length) _onCompleteRender();
}
private function _onCompleteRender():void {
removeEventListener(Event.ENTER_FRAME, _onRender);
var bmp:Bitmap = new Bitmap(_sourceBmd);
addChild(bmp);
bmp.x = _initX;
bmp.y = _initY;
bmp.alpha = 0;
Tweensy.to(getChildAt(0), { alpha: 0 }, 0.5, Sine.easeOut, 0, null, _onCompleteTween1 );
Tweensy.to(bmp, { alpha: 1 }, 0.5, Sine.easeOut);
Tweensy.to(bmp, { alpha: 0 }, 0.5, Sine.easeOut, 1);
}
private function _onCompleteTween1():void {
removeChildAt(0);
_canvas.dispose();
_canvas = null;
}
}
}
internal class Particle {
public var tx:Number = 0;
public var ty:Number = 0;
public var x:Number = 0;
public var y:Number = 0;
public var color:Number = 0;
public function Particle(x:Number, y:Number, color:uint) {
this.tx = x;
this.ty = y;
this.x = x;
this.y = y;
this.color = color;
}
}