念を送ると顔が浮き出ます。
[swf]/blog/wp-content/uploads/2008/11/ColorSprayPaint.swf, 550, 400[/swf]
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class ColorSprayPaint extends Sprite {
private var baseCanvas:BitmapData;
private var splashCanvas:BitmapData;
private var color:uint;
private var sprayArea:Number = 300; //スプレーするエリア半径
private var spraySize:Number = 80; //スプレーのサイズ
private var sprayDensity:Number = 80; //スプレー密度
private var sprayNum:Number = 800; //スプレー回数
public function ColorSprayPaint() {
init();
}
private function init():void {
baseCanvas = new BitmapData(stage.stageWidth, stage.stageHeight, true);
splashCanvas = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0x00FFFFFF);
var baseBmp:Bitmap = new Bitmap(baseCanvas); //顔の描画用キャンバス
var splashBmp:Bitmap = new Bitmap(splashCanvas); //まわりに飛び散らす用のキャンバス
addChild(baseBmp);
addChild(splashBmp);
var face:Face = new Face();
face.x = stage.stageWidth / 2;
face.y = stage.stageHeight / 2;
addChild(face);
baseBmp.mask = face; //マスクの設定
var timer:Timer = new Timer(10, sprayNum);
timer.addEventListener(TimerEvent.TIMER, onInterval, false, 0, true);
timer.start();
}
private function onInterval(e:TimerEvent):void {
color = Math.random() * 0xFFFFFF + 0xFF000000;
var angle = Math.random() * Math.PI * 2;
var radius:Number = Math.random() * sprayArea;
spray(stage.stageWidth / 2 + Math.cos(angle) * radius, stage.stageHeight / 2 + Math.sin(angle) * radius);
}
private function spray(spX:Number,spY:Number):void {
for (var i:int = 0; i < sprayDensity; i++ ) {
var angle:Number = Math.random() * Math.PI * 2;
var radius:Number = Math.random() * spraySize;
var xpos:Number = spX + Math.cos(angle) * radius;
var ypos:Number = spY + Math.sin(angle) * radius;
baseCanvas.setPixel32(xpos, ypos, color);
if (i % 10 == 0) {
splashCanvas.setPixel32(xpos, ypos, color);
}
}
}
}
}