In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

いろいろなパラメータ付きランダム

おもしろいランダムパターンを知っていたら教えてください
60行目前後から式を簡単に追加することができます

カーソルキー左右 : 式の選択
カーソルキー上下 : パラメータの増減
マウスホイール : スクロール速度
クリック : スクロールの停止、再生

元ネタ
http://wonderfl.net/code/feb94dc51f5dfdeb1aeef3d16b35c70661e6b963

パラメータつけたら色々変化したのが面白かったので作ってみました

import com.carlcalderon.arthropod.Debug;

...
@author br
Get Adobe Flash player
by TmskSt 15 Dec 2009
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;
	}
}