たまにはFlashネタを書こうということで久々俺のバイブル「Essential Actionscript 2.0」をひっぱり出してActionScript2.0をいじる。で、今回はFlash ActionScript2.0でmx.utils.Delegateクラスを使用したスコープの指定方法。かなり今更な感じもするけど便利なので軽く解説。まずは「サンプル」を。こんな感じでボールがマウスを追いかけるよくありがちなやつ。ソースは下記の通り。
flaファイルの1フレーム目に書くフレームアクション
new Main();
Main.as
import mx.utils.Delegate;
class Main extends MovieClip {
//ボールをアタッチするMovie Clip参照用
private var mc;
//フレームレート
private var fps:Number = 30;
public function Main (mc:MovieClip) {
this.mc = mc;
//初期設定
init ();
}
//初期設定
private function init () {
//ボールをアタッチ
var ball:MovieClip = mc.attachMovie ("ball", "ball", 0);
//マウスを追うメソッドをsetIntervalに登録
setInterval(Delegate.create (ball, step), 1000 / fps);
}
//マウスを追うメソッド
private function step () {
this._x += (_root._xmouse - this._x) * 0.1;
this._y += (_root._ymouse - this._y) * 0.1;
}
}
で、Main.as内のinitメソッドにある setInterval の部分は onEnterFrameを使っても良いが、フレームレートに左右されずスピードをコントロールしたい時はsetIntervalの方が便利。
このテクニック自体は大重美幸さんの本(「FLASH ActionScript スーパーサンプル集 1.0/2.0対応版」とか)で勉強してから多用中なんだけど、クラス内で使う時はちょっと注意。
ball.onEnterFrame = step;
とすると stepメソッド内の this は initメソッドでアタッチした ball になるが、
setInterval(step, 1000 / fps);
とすると、stepメソッド内の this は undefined になってしまう。
こんな時に使えるのが mx.utils.Delegateクラス。
setInterval(Delegate.create (ball, step), 1000 / fps);
とすると step クラス内の this が ball になります。