いろいろなパラメータ付きランダム
おもしろいランダムパターンを知っていたら教えてください
60行目前後から式を簡単に追加することができます
カーソルキー左右 : 式の選択
カーソルキー上下 : パラメータの増減
マウスホイール : スクロール速度
クリック : スクロールの停止、再生
元ネタ
http://wonderfl.net/code/feb94dc51f5dfdeb1aeef3d16b35c70661e6b963
パラメータつけたら色々変化したのが面白かったので作ってみました
import com.carlcalderon.arthropod.Debug;
...
@author br
package {
/**
* おもしろいランダムパターンを知っていたら教えてください
* 60行目前後から式を簡単に追加することができます
*
* カーソルキー左右 : 式の選択
* カーソルキー上下 : パラメータの増減
* マウスホイール : スクロール速度
* クリック : スクロールの停止、再生
*
* 元ネタ
* http://wonderfl.net/code/feb94dc51f5dfdeb1aeef3d16b35c70661e6b963
*
* パラメータつけたら色々変化したのが面白かったので作ってみました
*/
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.PixelSnapping;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.geom.Rectangle;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.utils.Timer;
//import com.carlcalderon.arthropod.Debug;
/**
* ...
* @author br
*/
[SWF(width="475", height="475", frameRate="120", backgroundColor="#222222")]
public class Main extends Sprite {
/**/
public function Main():void { this.addEventListener(Event.ADDED, init); }
/**/
private const PADDING:int = 10;
private const WIDTH:int = stage.stageWidth - PADDING * 2;
private const TIP_HEIGHT:int = 70;
private var bmd:BitmapData = new BitmapData(stage.stageWidth - PADDING * 2, stage.stageHeight - PADDING * 2, false, 0x444444);
private var bmp:Bitmap = stage.addChildAt(new Bitmap(bmd, PixelSnapping.AUTO, false), 0) as Bitmap;
private var tfFunc:TextField = addChild(new TextField()) as TextField;
private var tfSp:TextField = addChild(new TextField()) as TextField;
private var tfPa:TextField = addChild(new TextField()) as TextField;
private var running:int = 0;
private var speed:int = 2;
private var isPause:Boolean = false;
/**
* 返す値は 0~1の範囲にしてください
* 例外として
* 0以下の値を返すと 水色で
* 1以上の値を返すと 赤色で 描画されます
*/
private var fs:Vector.<Rnd> = Vector.<Rnd>([
new Rnd("Math().random + Math.random() + ...", 1, 25, 1, "Math.random() を Param 回実行した合計を Param で割った数",
function (param:Number):Number {
var r:Number = 0;
for (var i:int = 0; i < param; i++) r += Math.random();
return r / param;
}),
new Rnd("Math.pow", 1, 2, 1, "Math.pow(Math.random(), param)\nMath.random()の Param 乗",
function (param:Number):Number {
return Math.pow(Math.random(), param) / param;
}),
new Rnd("Math.random() * Math.random() ...", 1, 2, 1, "Math.pow(Math.random(), param)\nMath.random()を Param 回実行した積",
function (param:Number):Number {
var r:Number = Math.random();
for ( var i:uint = 0; i < param - 1; i++) r *= Math.random();
return r / param;
}),
new Rnd("Math.sqrt", 1, 2, 1, "Math.sqrt(Math.random() * param) / param\nMath.random() * Param の根号",
function (param:Number):Number {
return Math.sqrt(Math.random() * param) / param;
}),
new Rnd("Math.random() > param ? true : false", 1, 0.5, 0.05, "(Math.random() > .01 * param) ? 0.2 : 0.8\ntrue, falseを返したいときに",
function (param:Number):Number {
return (Math.random() > param) ? 0.2 : 0.8;
}),
new Rnd("Math.round", 1, 5, 0.1, "(Math.random() > .01 * param) ? 0.2 : 0.8",
function (param:Number):Number {
return Math.round(Math.random() * param) / 10;
})
]);
/**
* init
*/
private function init(e:Event = null):void {
this.removeEventListener(Event.ADDED, init);
bmp.x = bmp.y = PADDING;
with (this.graphics) {
beginFill(0x0, .7);
drawRect(PADDING, stage.stageHeight - PADDING - TIP_HEIGHT, WIDTH, TIP_HEIGHT);
endFill();
}
with (tfFunc) {
ctStr("Func");
textColor = 0xFFFFFF;
width = WIDTH;
x = PADDING + 10;
y = stage.stageHeight - PADDING - TIP_HEIGHT + 10;
}
with (tfSp) {
ctStr("Sp");
textColor = 0xFFFFFF;
autoSize = TextFieldAutoSize.LEFT;
x = stage.stageWidth - PADDING - tfSp.width - 10 - tfSp.width * .5;
y = stage.stageHeight - PADDING - TIP_HEIGHT + 10;
}
with (tfPa) {
ctStr("Pa");
textColor = 0xFFFFFF;
autoSize = TextFieldAutoSize.LEFT;
x = stage.stageWidth - PADDING - tfSp.width - 10 - tfPa.width * .5;
y = stage.stageHeight - PADDING - TIP_HEIGHT + tfSp.height + 10;
}
initRnd(0);
var timer:Timer = new Timer(1000, 0);
timer.addEventListener(TimerEvent.TIMER, onTimerHandler);
timer.start();
this.addEventListener(Event.ENTER_FRAME, onEntarFrameHandler);
stage.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheelEvent);
stage.addEventListener(MouseEvent.CLICK, onClickHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
}
private function onTimerHandler(e:TimerEvent):void {
drawBL(0x555555);
}
private function drawBL(color:uint):void {
with (bmd) {
unlock();
fillRect(new Rectangle(10, 0, 1, WIDTH), color);
lock();
}
}
private function onKeyDownHandler(e:KeyboardEvent):void {
switch(e.keyCode) {
case 39 : if ( running + 1 !== fs.length) funcControl(true); break;
case 37 : if (running !== 0) funcControl(false); break;
case 38 : paramControl(true); break;
case 40 : paramControl(false); break;
}
}
private function onEntarFrameHandler(e:Event):void {
var result:Number = fs[running].func(fs[running].param);
var color:uint;
if (result > 1) {
result = WIDTH - TIP_HEIGHT - 1;
color = 0xFF0000;
}
else if (result < 0) {
result = 0;
color = 0x00FFFF;
}
else {
result *= WIDTH;
color = 0xFFFFFF;
}
with (bmd) {
lock();
scroll(speed, 0);
setPixel(10, result, color);
unlock();
}
}
private function initRnd(r:uint):void {
ctStr("Func", fs[r].name + "\t(" + r.toString() + ")\n" + fs[r].description);
ctStr("Sp", (speed = 2).toString());
ctStr("Pa", (fs[r].param = fs[r].dParam).toString());
drawBL(0xFFFFFF);
}
private function funcControl(plus:Boolean):void {
initRnd(running += (plus) ? 1 : -1);
}
private function paramControl(plus:Boolean):void {
ctStr("Pa", (Math.round(100 * (fs[running].param += ((plus) ? fs[running].step : -fs[running].step))) / 100).toString());
}
private function ctStr(target:String, v:String = null):void {
this["tf" + target].text = target + "\t::\t" + ((v) ? v.toString() : " ");
}
private function onMouseWheelEvent(e:MouseEvent):void {
ctStr("Sp", (speed = (speed += (e.delta > 0) ? 1 : -1) >= 0 ? speed++ : 0).toString());
}
private function onClickHandler(e:MouseEvent):void {
with (this)
if (isPause) addEventListener(Event.ENTER_FRAME, onEntarFrameHandler);
else removeEventListener(Event.ENTER_FRAME, onEntarFrameHandler);
isPause = !isPause;
}
}
}
class Rnd {
public var name:String;
public var param:Number; //パラメータを複数設定出来るようにしようと思ったけど疲れた
public var dParam:Number;
public var func:Function;
public var step:Number;
public var description:String;
public function Rnd(name:String, param:Number, dParam:Number, step:Number, description:String, func:Function) {
this.name = name;
this.param = param;
this.dParam = dParam;
this.step = step;
this.description = description;
this.func = func;
}
}