JAVAC.JP
HOSHI TETSUYA 星鉄矢
2005/07/25
hossy@javac.jp
http://www.javac.jp
Google
WWW を検索 WWW.JAVAC.JP を検索

3-2 レジスタークラス - サンプル

実際にサンプルを見てみよう。
これは、マウスが動くたびにボールが生成されて画面外まで移動し消えるものである。
example
ソースは以下の通りになる。
まず、タイムラインに記載する#include "main.as"に相当するmain.asファイルは、以下である。
main.as
---
var main:MainClass=new MainClass(this);
stop();
MainClass.asがメインのクラスとなる。これはmain.asから呼び出されるクラスファイルなので、#includeされる必要はない。
コンストラクタにて空ムービークリップを生成しマウスの動きを監視させるようonMouseMoveを設定する。
onMouseMoveHandlerメソッドでは引数からマウスのx,y座標を取り出し、その移動量に応じてリンケージ名ovalを生成させる。
MainClass.as
---
import mx.events.EventDispatcher;

class MainClass{
    private var path:MovieClip;
    private var mouseListener:MovieClip;
    private var DEPTH_MOUSELISTENER:Number=0;
    private var DEPTH_OVAL_START:Number=1;
    private var old_x:Number;
    private var old_y:Number;
    private var depth_oval:Number;

    function MainClass(path:MovieClip){
        this.path=path;
        path.createEmptyMovieClip("mc_mouselistener"
                                    ,DEPTH_MOUSELISTENER);
        mouseListener=path.mc_mouselistener;
        EventDispatcher.initialize(mouseListener);
        mouseListener.onMouseMove=function(){
            var lo:Object=new Object();
            lo.target=this;
            lo.type="onMouseMoveHandler";
            lo.x=this._parent._xmouse;
            lo.y=this._parent._ymouse;
            this.dispatchEvent(lo);
        }
        mouseListener.addEventListener("onMouseMoveHandler",this);
        old_x=0;
        old_y=0;
        depth_oval=DEPTH_OVAL_START;
    }

    function onMouseMoveHandler(eventObj):Void{
        var new_x:Number=Number(eventObj.x);
        var new_y:Number=Number(eventObj.y);
        var r:Number=Math.sqrt((new_x-old_x)*(new_x-old_x)
                                +(new_y-old_y)*(new_y-old_y));
        var v:Number=(new_x-old_x)*r/Math.abs(new_x-old_x);
        if(Math.abs(v)>5){
            var linkage:String="oval";
            var depth:Number=depth_oval;
            depth_oval++;
            var mcname:String="oval"+depth;
            path.attachMovie(linkage,mcname,depth);
            var mc:MovieClip=path[mcname];
            mc.setPosition(new_x,new_y);
            mc.setScale(Math.abs(v));
            mc.setVelocity(v);
        }
        old_x=new_x;
        old_y=new_y;
    }
}
Flashアプリケーションで、リンケージ名ovalにOvalClassを登録する。OvalClassは以下の通りである。
onEnterFrameメソッドを記載しているので、注意が必要である。ここでは、フレームをカウントしていてカウント数が100に到達したら、自分自身のムービークリップを消すことで、ムービークリップが生成されすぎることを防いでいる。
OvalClass.as
---
class OvalClass extends MovieClip{
    private var count:Number;
    private var v:Number;
    private var alpha:Number;

    function OvalClass(){
        var arr:Array=[
            0xFFFFAA,
            0xFFAAFF,
            0xAAFFFF,
            0xAAAAFF,
            0xAAFFAA,
            0xFFAAAA
        ];
        var colorObj:Color=new Color(this);
        colorObj.setRGB(arr[Math.floor(arr.length*Math.random())]);
        count=0;
        alpha=100;
    }

    function setPosition(x:Number,y:Number):Void{
        _x=x;
        _y=y;
    }

    function setVelocity(v:Number):Void{
        this.v=v;
    }

    function setAlpha():Void{
        _alpha=alpha;
    }

    function setScale(scale:Number):Void{
        _xscale=scale;
        _yscale=scale;
    }

    function onEnterFrame():Void{
        count++;
        alpha--;
        setAlpha();
        _x+=v;
        if(count>=100){
            this.removeMovieClip();
        }
    }
}
ここではonEnterFrameメソッドをクラス内に書いているが、本来この行為は危険である。スレッドの回るムービークリップを生成することは、ムービークリップを適切に消去しないと、スレッドの乱立を招くことになるからである。
ムービークリップを消去すればスレッドは消えるが、スレッドだけ消してムービークリップは残したい場合もある。その際、活躍するのが、addEventListnerとremoveEventListenerでイベント管理を行えるEventDispatcherである。



BACKTOPNEXT




All Contents Copyright (C) 2005 HOSHI Tetsuya
Home