実際にサンプルを見てみよう。
これは、マウスが動くたびにボールが生成されて画面外まで移動し消えるものである。
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である。
|