今日は外部ライブラリを使ってみました。
http://www.formequalsfunction.com/downloads/drawmethods.html
にあるやつです。

  • drawOval.asとdrawRect.asをダウンロード
  • test.flaと同階層にそれぞれ置く
  • main.asはこんな感じ
main.as
----
// 初期化
// MovieClipの拡張
#include "drawOval.as"
#include "drawRect.as"

// 背景の描画
var bg = this.createEmptyMovieClip("bg_mc",1);
bg._x = 5;
bg._y = 5;
bg.lineStyle();
bg.beginFill(0x000000);
bg.drawRect(0, 0, 160, 160, 3);
bg.endFill();

// パネル
var pman   = new info.uebuyahonpo.PanelMan(bg);
var panels = [
    pman.create_panel(  3,  3),
    pman.create_panel(  3, 81),
    pman.create_panel( 81,  3),
    pman.create_panel( 81, 81)
];

// 色関数
var colors = [ 0xff0000,0x00ff00,0x0000ff ];
var colidx = 0;
function get_color() {
    var ret = colors[colidx];
    colidx = (colidx + 1) % colors.length;
    return ret;
}

// ボール
var bman  = new info.uebuyahonpo.BallMan(this);
var balls = [bman.create_ball(10,10,get_color())];

// キーのディスパッチ
var key_disp = [
    function () {}, // 0が押されたら
    function () {}, // 1が押されたら
    function () {   // 2が押されたら
        for ( var i = 0; i < balls.length; i++ ) {
            balls[i]._y -= 5;
        }
    },
    function () {}, // 3が押されたら
    function () {   // 4が押されたら
        for ( var i = 0; i < balls.length; i++ ) {
            balls[i]._x -= 5;
        }
    },
    function () {   // 5が押されたら
        balls.push(bman.create_ball(10,10,get_color()));
    },
    function () {   // 6が押されたら
        for ( var i = 0; i < balls.length; i++ ) {
            balls[i]._x += 5;
        }
    },
    function () {}, // 7が押されたら
    function () {   // 8が押されたら
        for ( var i = 0; i < balls.length; i++ ) {
            balls[i]._y += 5;
        }
    },
    function () {}  // 9が押されたら
];

//メインループ
this.onEnterFrame = function () {
    var k = Key.getCode();
    //最後に押されたキーが数字キーでまだ押されているか
    if ( k >= 48 && k <= 57 && Key.isDown(k) ) {
        key_disp[k-48]();
    }
}

ボールを複数扱うようにしてみました。

  • ボールに関しては、
BallMan.as
----
class info.uebuyahonpo.BallMan {
    private var parent:MovieClip;
    private var count:Number;

    function BallMan(mc:MovieClip) {
        // 親を設定する
        this.parent = mc;
        this.count  = 0;
    }

    public function create_ball(x:Number,y:Number,c:Number):MovieClip {
        var nm  = this.count;
        this.count++;
        nm = "ball_" + nm + "_mc";
        var ret = parent.createEmptyMovieClip(nm,parent.getNextHighestDepth());
        // 親からの相対位置に移動する
        ret._x = x;
        ret._y = y;
        var color = c;
        if ( color == undefined ) {
            color = 0xFF0000;
        }

        ret.lineStyle();
        ret.beginFill(color);
        ret.drawOval(0, 0, 5);
        ret.endFill();

        return ret;
    }
}

ボールの中で名前を作るようにして、色指定もできるようにして、ムービークリップの深度を改良して、drawOvalでボールらしくした。

  • 新しくパネルも作成
PanelMan.as
----
class info.uebuyahonpo.PanelMan {
    private var parent:MovieClip;
    private var count:Number;

    function PanelMan(mc:MovieClip) {
        // 親を設定する
        this.parent = mc;
        this.count  = 0;
    }

    public function create_panel(x:Number,y:Number):MovieClip {
        var nm  = this.count;
        this.count++;
        nm = "panel_" + nm + "_mc";
        var ret = parent.createEmptyMovieClip(nm,parent.getNextHighestDepth());
        // 親からの相対位置に移動する
        ret._x = x;
        ret._y = y;

        ret.lineStyle();
        ret.beginFill(0xffffff);
        ret.drawRect(0, 0, 76, 76, 1);
        ret.endFill();
        for (var i=0; i<3; i++) {
            for (var j=0; j<3; j++) {
                ret.beginFill(0xcccccc);
                ret.drawOval(22*i+16,22*j+16,6);
                ret.endFill();
            }
        }

        return ret;
    }
}

ほとんどコピーなのが、リファクタリングの余地ありです。

とりあえず、この間おもちゃ屋にいったときにみたペンタゴでも作ってみようと思います。