ActionScript2.0 Delegateを使ったスコープの変更

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

This entry was posted in FLASH Actionscript. Bookmark the permalink.

コメントを残す

メールアドレスが公開されることはありません。