ホーム >> 左脳ActionScript3 >> アクションスクリプト3 >> boidデモを作る >> boidデモ作成 その1:ランダムな点を表示する。
boidデモ作成 その1:ランダムな点を表示する。
フラッシュで、デモを作ってみよう。

今回のネタは、「boids」と呼ばれる物。これは、ボイドと読む。

1987年に Craig Reynolds という学者でもない、一介のプログラマーが考え出した、とても簡単なルールで鳥の群れの動きを表現できるアルゴリズム。(参考資料:論文

その boids理論 を簡単に説明すると、「多数の個体の動きを決めるもの」で以下のような3つのルールで定義される。

  1. 距離が近すぎれば遠のく
  2. 距離が離れていれば近づく
  3. ほどほどの距離なら並走(移動方向を回りにあわせようとする)

ルールはココの説明が判りやすいかもしれない。



第一歩

まずは簡単に、画面上にランダムに配置し、表示するところから。

project_file_tree.png FlashDevelop 画面右の Project にプロジェクトファイルのツリーがある。
ここの src を右クリックすると、メニューが出る。

メニュー Add >> New Class ...で、新しいクラスの名前を聞かれる。

ここでは、「boid」と言う名前のクラスを作ってみよう。



newClsDlg.PNG
入力すると、src 以下に指定した名前でクラスのファイルが作成され、画面はその作成されたクラスのエディットが出来る状態になる。

今後は、以下のコードをベースにブラッシュアップしていく方法で話を進める事にする。

boid.as:boidクラスコード。

package  
{
    import flash.display.Shape;

    public class boid extends Shape
    {
        public static const number_of_points:int    =   100;    //  個体数
        //
        private var objs:Array;
        private var wd:Number;
        private var he:Number;
        //  boidクラスのコンストラクタ
        public function boid(w:Number, h:Number) 
        {
            wd = w; //  画面幅
            he = h; //  画面高さ
            //
            objs    =   new Array();
            for (var i:int = 0; i < number_of_points; i++)
            {   //  点を登録する
                objs.push(new one(w, h));
            }
        }
        //  全ての点を描画
        public function draw():void 
        {
            graphics.clear();
            graphics.lineStyle(10, 0x000099);
            for (var i:int = 0; i < number_of_points; i++)
            {   //  点を描く
                var t:one   =   objs[i];
                t.draw(graphics);
            }
        }
    }
}
import flash.display.Graphics;
import flash.geom.Point;

internal    class one
{
    public var  p:Point;    //  位置
    public var  v:Point;    //  速さ
    //  点クラスのコンストラクタ
    public function one(w:Number, h:Number) 
    {
        //  ランダムな位置
        p   =   new Point(Math.random() * w, Math.random() * h);
        //  ランダムな移動方向
        v   =   new Point(Math.random(), Math.random());
    }
    //  一つの点を描画
    public function draw(g:Graphics):void 
    {
        g.lineStyle(2, 0x000099);   //  ちょっと暗めの青
        g.moveTo(p.x, p.y);
        g.lineTo(p.x - v.x, p.y - v.y);
    }
}

プロジェクトを作った段階で最初から有る、mainクラスも少々の変更を。ここから boidクラス のインスタンスを作って呼び出している。
main.as:メインのコード。

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    /**
     * ...
     * @author 
     */
    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private var bd:boid;
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            //  boid画面の作成
            bd  =   new boid(300, 100);
            addChild(bd);
            //  boid画面描画のタイミングの登録
            addEventListener(Event.ENTER_FRAME, enterFrame);
        }
        //
        private function enterFrame(e:Event):void 
        {   //  フレーム毎に点を描画
            bd.draw();
        }
    }
}

また、プロジェクトの設定から、フラッシュのサイズを「300×100」にしておく。

ひとまずビルドしてみよう。問題が無ければ直ぐに実行できるハズだ。



実行

Get Adobe Flash player
なんのことはない。
ただ画面上に動かないランダムの点が現れるだけ。動かないのでつまらない事この上ない。

boid.as の number_of_points を変更すれば点の数は変更でるが、幾等点を増やしたところで、動かないものがツマラナイ事には変わりなく。


>> その2へ。

トラックバック(0)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/195

コメントする

ホーム >> 左脳ActionScript3 >> アクションスクリプト3 >> boidデモを作る >> boidデモ作成 その1:ランダムな点を表示する。