package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BlendMode;
import flash.display.PixelSnapping;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.BlurFilter;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import mx.core.BitmapAsset;
[SWF(width=640,height=480,backgroundColor=0x000000,frameRate=60)]
public class SnowApp extends Sprite {
[Embed(source="saq.jpg")]
private var imageClass:Class;
private var _canvas:BitmapData;
private var _glow:BitmapData;
private var _snow:Array;
private var _forceMap:BitmapData;
private var _emitTemplate:BitmapData;
private var _emitTemplateImage:BitmapData;
public function SnowApp() {
this._canvas = new BitmapData(640, 480, false, 0x0); this.addChild(new Bitmap(this._canvas)) as Bitmap;
this._glow = new BitmapData(640 / 4, 480 / 4, false, 0x0); var bm:Bitmap = this.addChild(new Bitmap(this._glow, PixelSnapping.NEVER, true)) as Bitmap; bm.scaleX = bm.scaleY = 4; bm.blendMode = BlendMode.ADD;
var tf:TextField = new TextField();
tf.defaultTextFormat = new TextFormat('Verdana', 30, 0xffffff, true);
tf.autoSize = TextFieldAutoSize.LEFT;
tf.text = 'TERACO';
this._emitTemplate = new BitmapData(tf.textWidth, tf.textHeight, false, 0x0);
this._emitTemplate.draw(tf);
this._emitTemplateImage = BitmapAsset(new imageClass()).bitmapData;
this._snow = [];
this._forceMap = new BitmapData(640, 480, false, 0x0);
this._forceMap.draw(tf, new Matrix(3, 0, 0, 3, 100, 200));
this._forceMap.applyFilter(this._forceMap, this._forceMap.rect, new Point(0, 0), new BlurFilter(8, 8));
this.stage.addEventListener(MouseEvent.CLICK, this.emitFromImage);
this.addEventListener(Event.ENTER_FRAME, this.update); }
public function emitFromRect(e:MouseEvent):void {
for (var ey:Number = this.mouseY - 30; ey < this.mouseY + 30; ey += 3) { for (var ex:Number = this.mouseX - 30; ex < this.mouseX + 30; ex += 3) { this.emitParticle(ex + Math.random() * 3, ey + Math.random() * 3, Math.random() + 0.5); }
}
}
public function emitFromText(e:MouseEvent):void {
var ofx:Number = this.mouseX - this._emitTemplate.width / 2;
var ofy:Number = this.mouseY - this._emitTemplate.height / 2;
for (var ey:Number = 0; ey < this._emitTemplate.height; ey += 2) { for (var ex:Number = 0; ex < this._emitTemplate.width; ex += 2) { if (this._emitTemplate.getPixel(ex, ey)) { this.emitParticle(ex + Math.random() * 2 + ofx, ey + Math.random() * 2 + ofy, Math.random() + 0.5); }
}
}
}
public function emitFromImage(e:MouseEvent):void {
var cx:Number = this._emitTemplateImage.width / 2;
var cy:Number = this._emitTemplateImage.height / 2;
var ofx:Number = this.mouseX - cx;
var ofy:Number = this.mouseY - cy;
var c:int;
var a:Number;
var v:Number;
for (var ey:Number = 0; ey < this._emitTemplateImage.height; ey += 2) { for (var ex:Number = 0; ex < this._emitTemplateImage.width; ex += 2) { a = Math.atan2(ey - cy, ex - cy) + Math.random() * Math.PI * 0.1; v = Math.random() * 2 + 0.5; this.emitParticle( ex + Math.random() * 2 + ofx, ey + Math.random() * 2 + ofy,
Math.random() + 0.5,
this._emitTemplateImage.getPixel(ex, ey), Math.cos(a) * v, Math.sin(a) * v); }
}
}
public function emitParticle(ex:Number, ey:Number, s:Number = 1, c:int = 0xffffff, vx:Number = 0, vy:Number = 0):void {
var p:SnowParticle = new SnowParticle(); p.x = ex;
p.y = ey;
p.vx = vx;
p.vy = vy;
p.s = s;
p.c = c;
this._snow.push(p); }
public function update(e:Event):void {
this._canvas.lock(); this._canvas.fillRect(this._canvas.rect, 0x0); var n:int = this._snow.length;
var d:Number;
while (n--) {
var p:SnowParticle = this._snow[n];
p.vy += 0.02 * p.s; p.vx *= 0.99; p.vy *= 0.99; d = 1 - (this._forceMap.getPixel(p.x, p.y) / 0xffffff) * 0.3; p.vx *= d; p.vy *= d; p.x += p.vx; p.y += p.vy;
this._canvas.setPixel(p.x, p.y, p.c); if (p.y > this.stage.stageHeight) { this._snow.splice(n, 1); }
}
this._canvas.unlock(); this._glow.draw(this._canvas, new Matrix(0.25, 0, 0, 0.25));
}
}
}
class SnowParticle {
public var x:Number;
public var y:Number;
public var vx:Number;
public var vy:Number;
public var s:Number;
public var c:int;
public function SnowParticle() {
this.x = 0;
this.y = 0;
this.vx = 0;
this.vy = 0;
this.s = 1;
this.c = 0xffffff;
}
}