bugdraw on AS3
[習作]書籍「FLASH LAB」の「bugdraw」をAS3にしてみる
虫が勝手にランダムにドット絵を作ってくれるってやつです。
もしかしたらアーティスティックな作品を作ってくれるかも作ってくれないかも。
OriginalSource on AS2 : UMETSU TAKESHIRO
http://www.microgarbage.org/
package
{
/*
* [習作]書籍「FLASH LAB」の「bugdraw」をAS3にしてみる
*
* 虫が勝手にランダムにドット絵を作ってくれるってやつです。
* もしかしたらアーティスティックな作品を作ってくれるかも作ってくれないかも。
*
* OriginalSource on AS2 : UMETSU TAKESHIRO
* http://www.microgarbage.org/
*
*/
import flash.display.Sprite;
import flash.events.Event;
[SWF(width = 465, height = 465, frameRate = 60, backgroundColor = 0x000000)]
public class Main extends Sprite
{
private const SW:Number = 465;
private const SH:Number = 465;
private var numX:Number = 93;
private var numY:Number = 93;
private var rectWidth:Number = SW / numX;
private var rectHeight:Number = SH / numY;
private var tileArray:Array = [];
private var bugArray:Array = [];
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//タイルを敷き詰める
for (var i:uint = 0; i < numX; i++) {
for (var j:uint = 0; j < numY; j++) {
var tileSp:tile = new tile(rectWidth, rectHeight);
tileSp.x = i * rectWidth;
tileSp.y = j * rectHeight;
tileSp.name = "x" + tileSp.x.toString() + "_y" + tileSp.y.toString();
addChild(tileSp);
tileArray.push(tileSp);
}
}
//虫を配置する
for (i = 0; i < 4; i++) {
var bugSp:bug = new bug(rectWidth, rectHeight);
addChild(bugSp);
bugArray.push(bugSp);
switch(i) {
case 1:
bugSp.x = SW - rectWidth;
break;
case 2:
bugSp.x = SW - rectWidth;
bugSp.y = SH - rectHeight;
break;
case 3:
bugSp.y = SH - rectHeight;
break;
}
}
this.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}
private function onEnterFrameHandler(e:Event):void {
//虫の数の分だけ処理する
for each (var bugSp:bug in bugArray) {
var diffX:Number = 0;
var diffY:Number = 0;
//動く方向をランダムに決める
switch (Math.floor(Math.random()*6))
{
case 0:
diffY = -rectHeight;
break;
case 1:
diffX = -rectWidth;
break;
case 2:
diffX = rectWidth;
break;
case 3:
diffY = rectHeight;
break;
default:
break;
}
//新しい場所を算出
var newX:Number = bugSp.x + diffX;
var newY:Number = bugSp.y + diffY;
//新しい場所がステージ内だったら虫を移動する
if (newX >= 0 && newX <= SW - rectWidth && newY >= 0 && newY <= SH - rectHeight) {
bugSp.x = newX;
bugSp.y = newY;
}
//移動した場所にあるタイルを見つけ出して、一定の確率で塗る
if (Math.random() * 5 > 3) {
var tileSp:tile = this.getChildByName("x" + bugSp.x + "_y" + bugSp.y) as tile;
tileSp.reDraw();
}
}
}
}
}
import flash.display.Sprite;
class tile extends Sprite {
private var _w:Number;
private var _h:Number;
private var thisAlpha:Number = 0;
private var alphaFlag:int = 1;
private var diffAlpha:Number = .05;
function tile(w:Number, h:Number) {
_w = w;
_h = h;
reDraw();
}
public function reDraw():void {
this.graphics.clear();
this.graphics.beginFill(0xFFFFFF, thisAlpha);
this.graphics.lineStyle(.2,0x333333,.5);
this.graphics.moveTo(0, 0);
this.graphics.lineTo(_w, 0);
this.graphics.lineTo(_w, _h);
this.graphics.lineTo(0, _h);
this.graphics.lineTo(0, 0);
this.graphics.endFill();
if (alphaFlag == 1) {
thisAlpha += diffAlpha;
} else {
thisAlpha -= diffAlpha;
}
if (thisAlpha > 1) {
alphaFlag = -1;
} else if (thisAlpha < 0) {
alphaFlag = 1;
}
}
}
import flash.display.Sprite;
class bug extends Sprite {
function bug(w:Number,h:Number) {
this.graphics.beginFill(0xAA0000, .5);
this.graphics.drawRect(0, 0, w, h);
this.graphics.endFill();
}
}