forked from: text in force map
はじめてのフォースマップ
// forked from knd's text in force map
// forked from knd's forked from: forked from: forked from: forked from: My first force map
// forked from knd's forked from: forked from: forked from: My first force map
// forked from knd's forked from: forked from: My first force map
// forked from knd's forked from: My first force map
// forked from knd's My first force map
//はじめてのフォースマップ
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.filters.BlurFilter;
import flash.text.*;
[SWF(backgroundColor="0x0", frameRate="90")]
public class MyFirstForceMap extends Sprite
{
private const WH:uint = 465;
//Force map
private const fm: BitmapData = new BitmapData(WH, WH);
/**
* ピクセルのRGB値から粒子にはたらく力を決めよう。
* Rはx方向、Gはy方向に、それぞれ作用する力を
* Bはその場所における動きにくさ、のようなものを。
* (早く動くほど受ける力が大きくなる)
*/
private const VERO:Number = 1.0/150.0; //加速度に掛ける正の値
private const RESI:Number = 1.0/275.0; //抵抗の大きさ0~255に掛ける正の値
private const BIAS:int = -128;//加速度の補正値
private var ps:Vector.<Point>;//位置ベクトル
private var vs:Vector.<Point>;//速度ベクトル
private const N:uint = 20000;//粒子の数
private const dat:BitmapData = new BitmapData(WH, WH, true, 0xff000000);
private const bmp:Bitmap = new Bitmap(dat);
private var vh:Boolean;
private var ct: ColorTransform = new ColorTransform(1, 1, 1, 1, -7, -3, -2, 0);
private function updateFM():void{
var txt : TextField = new TextField;
txt.autoSize = TextFieldAutoSize.LEFT;
var tf: TextFormat = new TextFormat;
tf.color = 0x8080f0;
tf.bold = true;
tf.size = 60;
var mat :Matrix;
var rnd: uint = 100000 * Math.random();
if(vh){
fm.perlinNoise(WH>>2, WH>>2, 7, rnd, true, true, 7);
ct = new ColorTransform(1, 1, 1, 1, -8, -6, -2, 0);
txt.text = "毛\n竹";
txt.setTextFormat(tf);
mat = new Matrix(3,0,0,3, WH>>3, 0);
fm.draw(txt, mat);
}
else{
fm.perlinNoise(WH>>2, WH>>2, 7, rnd, true, true, 7);
ct = new ColorTransform(1, 1, 1, 1, -8, -6, -2, 0);
txt.text = "fm3";
txt.setTextFormat(tf);
mat = new Matrix(3,0,0,3,0, WH>>3);
fm.draw(txt, mat);
}
vh = !vh
}
public function MyFirstForceMap() {
updateFM();
ps = new Vector.<Point>();
while (ps.length != N) {
ps.push(new Point(WH*Math.random(), WH*Math.random()));
}
vs = new Vector.<Point>();
while (vs.length != N) {
vs.push(new Point());
}
addChild(bmp);
var i:int;
var c:int;
var fr:Number;
var fg:Number;
var fb:Number;
var resist:Number;
var p:Point;
var v:Point;
const p0:Point = new Point;
const blur:BlurFilter = new BlurFilter(4,4);
addEventListener(Event.ENTER_FRAME, function(e:Event):void {
dat.lock();
dat.colorTransform(dat.rect, ct);
for (i = 0; i < N; i++) {
p = ps[i];
v = vs[i];
c = fm.getPixel(p.x, p.y);
fr = VERO * Number(int((c >>> 16) & 0xff) + BIAS);
fg = VERO * Number(int((c >>> 8) & 0xff) + BIAS);
fb = Number(~c & 0xff) * RESI;
v.x = fb * (v.x + fr);
v.y = fb * (v.y + fg);
p.x += v.x;
p.y += v.y;
if (p.x > WH){ p.x -= WH; }
else if( p.x < 0){ p.x += WH;}
else if (p.y > WH) p.y -= WH;
else if( p.y < 0) p.y += WH;
if(dat.getPixel32(p.x,p.y)== 0xffffffff){
p.x = WH*Math.random() ;
p.y = WH*Math.random() ;
v.x = 0;
v.y = 0;
} else
dat.setPixel32(p.x, p.y, 0xffffffff);
}
dat.applyFilter(dat, dat.rect, p0, blur);
dat.unlock();
});
stage.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void {
updateFM();
});
}
}
}