perlinNoise遊び
クリックでリセット。
rが明るさ
gがx方向の移動距離
bがy方向の移動距離
/**
* Copyright cpu_t ( http://wonderfl.net/user/cpu_t )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/l4b4
*/
// クリックでリセット。
//
// rが明るさ
// gがx方向の移動距離
// bがy方向の移動距離
//
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.MouseEvent;
[SWF(width = 465, height = 465)];
public class FlashTest extends Sprite
{
public function FlashTest()
{
vectormap = new BitmapData(465, 465);
bmpdata = new BitmapData(465, 465, false, 0);
addChild(new Bitmap(bmpdata));
stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void
{
reset();
});
reset();
}
private var vectormap:BitmapData;
private var bmpdata:BitmapData;
private function reset():void
{
vectormap.perlinNoise(465 * .5, 465 * .5, 3, Math.random() * 0xFFFFFFFF, false, true);
// bmpdataをクリア
bmpdata.fillRect(bmpdata.rect, 0);
// vectormapの全ピクセルに対してループ
for (var y:int = 0; y < vectormap.height; y++)
{
for (var x:int = 0; x < vectormap.width; x++)
{
// rgb要素を取得
var px:uint = vectormap.getPixel(x, y);
var r:int = px >> 16 & 0xFF;
var g:int = px >> 8 & 0xFF;
var b:int = px & 0xFF;
// x,yにg,bを足す
var tx:int = x + (g / 0xFF - .5) * 465;
var ty:int = y + (b / 0xFF - .5) * 465;
// bmpdataの範囲外になってしまったらcontinue
if (ty<0 || ty>=bmpdata.height ||
tx<0 || tx>=bmpdata.width) continue;
var col:uint = bmpdata.getPixel(tx, ty);
col += 0x010101 * (int)(r * .2);
if (col > 0xFFFFFF) col = 0xFFFFFF;
bmpdata.setPixel(tx, ty, col);
}
}
}
}
}