forked from: 燃えながら出てくる文字(修正版)
// forked from matsu4512's 燃えながら出てくる文字(修正版)
package {
import __AS3__.vec.Vector;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BlendMode;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.geom.Matrix;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.utils.Timer;
[SWF(backgroundColor=0x000000, frameRate=30)]
public class String_Particle2 extends Sprite
{
//パーティクルを描写するBitmapData
public var canvas:BitmapData;
private var fire_canvas:BitmapData;
//テキストを描画するBitmapData
public var textCanvas:BitmapData;
//パーティクルクラスのインスタンスを格納する配列
private var particles:Vector.<Particle>;
private var circle_particles:Vector.<Circle_Particle>;
private var timer:Timer;
private const GRAVITY:Number = 0.1;
private var count:int = 0;
private var w:Number;
private var h:Number;
private var str:String;
private var fontSize:uint;
public function String_Particle2(str:String="Flash_Develop_Test", fontSize:uint=40, w:Number=400, h:Number=100)
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
this.w = w;
this.h = h;
this.str = str;
this.fontSize = fontSize;
canvas = new BitmapData(w, h, false, 0x000000);
var bmp:Bitmap = new Bitmap(canvas);
bmp.x = stage.stageWidth / 2 - bmp.width / 2;
bmp.y = stage.stageHeight / 2 - bmp.height / 2;
addChild(bmp);
fire_canvas = new BitmapData(w, h, true);
var f_bmp:Bitmap = new Bitmap(fire_canvas);
f_bmp.x = stage.stageWidth / 2 - f_bmp.width / 2;
f_bmp.y = stage.stageHeight / 2 - f_bmp.height / 2;
addChild(f_bmp);
start();
}
public function start():void{
init(str, fontSize);
circle_particles = new Vector.<Circle_Particle>;
timer = new Timer(33);
timer.addEventListener(TimerEvent.TIMER, loop);
timer.start();
addEventListener(Event.ENTER_FRAME, effect_loop);
}
private function init(str:String, size:uint):void{
var tf:TextField = new TextField;
tf.defaultTextFormat = new TextFormat("Swis721 BdRndBT", size, 0xFFFFFF );
tf.autoSize = TextFieldAutoSize.LEFT;
tf.text = str;
//文字の描画
textCanvas = new BitmapData(tf.textWidth+10, tf.textHeight, false, 0x000000);
textCanvas.draw(tf);
particles = new Vector.<Particle>;
createText();
}
//文字からパーティクルの生成
private function createText():void{
//ステージを中心にテキストを配置するときの左上座標
var ofx:Number = w / 2 - textCanvas.width / 2;
var ofy:Number = h / 2 - textCanvas.height / 2;
//textCanvasを1pxずつ見ていく
for(var ex:uint = 0; ex < textCanvas.width; ex++){
for(var ey:uint = 0; ey < textCanvas.height; ey++){
//textCanvasの座標(ex, ey)のRGB値の取得
var c:uint = textCanvas.getPixel(ex, ey);
if(c != 0x000000){
var p:Particle = new Particle();
p.x = ex;
p.y = ey;
p.c = c;
particles.push(p);
}
}
}
}
private function loop(event:TimerEvent):void{
//キャンパスをロック
canvas.lock();
var cp:Circle_Particle;
//パーティクルを描画
for(var i:int = 0; i < 15; i++){
if(particles.length <= count){
timer.removeEventListener(TimerEvent.TIMER, loop);
break;
}
canvas.setPixel(particles[count].x, particles[count].y, particles[count].c);
if(count % 3 < 2){
cp = new Circle_Particle(particles[count].x, particles[count].y, Math.random()*4-2, -Math.random()*5+1.5, Math.random()*2+1, Math.random()*0x00FFFF+ 0xFF0000);
circle_particles.push(cp);
}
count++;
}
//ロック解除
canvas.unlock();
}
private function func(item:Circle_Particle, index:int, vec:Vector.<Circle_Particle>):Boolean{
if(item.alpha <= 0){
return false;
}
else
return true;
}
private function effect_loop(event:Event):void{
fire_canvas.fillRect(fire_canvas.rect, 0x000000);
circle_particles = circle_particles.filter(func);
var mtx:Matrix;
for each(var p:Circle_Particle in circle_particles){
p.x += p.vx;
p.y += p.vy;
p.vy += -GRAVITY;
p.alpha -= 0.1;
mtx = new Matrix();
mtx.translate(p.x, p.y);
fire_canvas.draw(p, mtx, null, BlendMode.ADD);
}
}
}
}
import flash.display.Shape;
import flash.display.BlendMode;
import flash.filters.BlurFilter;
class Particle{
public var x:Number;
public var y:Number;
public var ex:Number;
public var ey:Number;
public var c:int;
public function Particle(){
x = 0;
y = 0;
ex = 0;
ey = 0;
c = 0;
}
}
class Circle_Particle extends Shape{
public var vx:Number;
public var vy:Number;
public var size:Number;
public var color:uint;
public function Circle_Particle(x:Number=0, y:Number=0, vx:Number=0, vy:Number=0, size:Number=5, color:uint=0xFFFFFF){
this.x = x;
this.y = y;
this.vx = vx;
this.vy = vy;
this.size = size;
this.color = color;
this.blendMode = BlendMode.ADD;
this.filters = [new BlurFilter(10, 10, 1)];
graphics.beginFill(color);
graphics.drawCircle(0, 0, size);
graphics.endFill();
}
}