たまには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 になります。