2008年02月12日
BASIC 風に円を書く
回顧主義的 Flash。
小学生のころ、BASIC でドラえもんを描こうとして挫折したのを思い出しました。
PC-98 とかだともっと速く描画できるんでしょうが、私が愛用していた MSX はこんな感じでした。MSX マガジンよりも MSX-FAN のほうが好きでした。んなことはどうでもいいですね、はい。
アルゴリズムは 円を描く (1)円弧描画のアルゴリズム あたりを参考にしてます。処理に時間がかかってるように見せるために、あえて途中で setTimeout を入れてます。
ソースの見所は、dispatchEvent で無名関数から無名関数を呼び出しているあたり。短いコードならではの威勢のいい実装となっております。
ソース(61行):
package{
import flash.display.*;
import flash.events.Event;
import flash.utils.setTimeout;
public class BasicCircle extends Sprite{
static private const COLOR:Array = [
0x000000, 0x2424db, 0x6c6cff, 0x24ff24, 0x48ff6d,
0xb62424, 0x48ffdb, 0xff2424, 0xff6d6d, 0xdb24db,
0xdb6ddb, 0x242491, 0xdbb648, 0xb6b6b6, 0xffffff
];
static private const TIMEOUT:int = 10;
public function BasicCircle(){
stage.scaleMode = "noScale";
var bmd:BitmapData = new BitmapData(256, 192);
var bmp:Bitmap = new Bitmap(bmd);
bmp.scaleX = bmp.scaleY = 2;
addChild(bmp);
addEventListener("complete", function(event:Event):void{
drawCircle(bmd,
256 * Math.random(),
192 * Math.random(),
50 * Math.random() + 50,
COLOR[Math.floor(Math.random() * COLOR.length)]);
});
dispatchEvent(new Event("complete"));
}
private function drawCircle(bmd:BitmapData, x0:int, y0:int, r:int, col:uint):void{
var x:int = r;
var y:int = 0;
var F:int = -2 * r + 3;
setTimeout(function():void{
if ( x < y ) {
dispatchEvent(new Event("complete"));
} else {
bmd.setPixel( x0 + x, y0 + y, col );
bmd.setPixel( x0 - x, y0 + y, col );
bmd.setPixel( x0 + x, y0 - y, col );
bmd.setPixel( x0 - x, y0 - y, col );
bmd.setPixel( x0 + y, y0 + x, col );
bmd.setPixel( x0 - y, y0 + x, col );
bmd.setPixel( x0 + y, y0 - x, col );
bmd.setPixel( x0 - y, y0 - x, col );
if ( F >= 0 ) {
x--;
F -= 4 * x;
}
y++;
F += 4 * y + 2;
setTimeout(arguments.callee, TIMEOUT);
}
}, TIMEOUT);
}
}
}