サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

Tweenインスタンスにイベントハンドラを設定するとエラーになる

ID: FN0509005 Product: Flash

Platform: All
Version: MX 2004

問題
Flash MX 2004で確認されている問題です。たとえば、Flash 8の[Components Language Reference] > [Tween class] > [Tween.onMotionFinished]の項に記載されている以下のサンプルを[シッタックスチェック]すると、コンパイルエラーが発生します。なお、Tweenクラスは、Flash Player 6.0r79以降の対応です。

スクリプト001■Tween.onMotionFinishedイベントハンドラのサンプル

import mx.transitions.Tween;
var myTween:Tween = new Tween(img1_mc, "_x", mx.transitions.easing.Elastic.easeOut, 0, Stage.width-img1_mc._width, 3, true);
myTween.FPS = 30;
myTween.onMotionFinished = function() {
   myTween.yoyo();
};

エラーは、つぎのような内容です。

    **エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 4:onMotionFinished' という名前のプロパティはありません
       myTween.onMotionFinished = function() {

    ActionScript エラー数 :1 報告済みエラー :1

原因
実際Flash MX 2004のTweenクラスには、Tween.onMotionFinishedを始めとするイベントハンドラが、インスタンスプロパティとして宣言されていません。Flash 8のTweenクラスでは、以下のように(スクリプト002)イベントハンドラがプロパティ宣言されています。

スクリプト002■イベントハンドラがプロパティとして宣言されているFlash 8のTweenクラス(抜粋)

import mx.transitions.BroadcasterMX;
import mx.transitions.OnEnterFrameBeacon;

class mx.transitions.Tween {

  #include "Version.as"

  static var __initBeacon = OnEnterFrameBeacon.init();
  static var __initBroadcaster = BroadcasterMX.initialize (Tween.prototype, true);

  public var isPlaying:Boolean;
  public var addListener:Function;
  public var removeListener:Function;
  public var broadcastMessage:Function;

  // Flash MX 2004のTweenクラスには以下の宣言がない
  public var onMotionFinished:Function;
  public var onMotionLooped:Function;
  public var onMotionChanged:Function;
  public var onMotionStarted:Function;
  public var onMotionStopped:Function;
  public var onMotionResumed:Function;

したがって、この問題は、Flash MX 2004のTweenクラスのバグだと判断します。

対処法
この問題に対処する方法は、3つ考えられます[*1]。

[1] Flash 8のTweenクラスと同様に、必要なイベントハンドラを、インスタンスプロパティとして宣言することが考えられます。

ただし、この方法は、クラスおよびMacromedia Component Architectureバージョン2についての十分な知識があるユーザー以外にはお勧めしません。それは第1に、クラスの改変は、そのクラスだけでなく、継承・委譲・その他により関連する他のクラスの動作にまで影響を与える可能性があるからです。もっとも、プロパティ宣言の追加は、一般的にはその影響が限定的だと考えられます。

理由の第2は、複数の開発者で、プロジェクトに当たる場合の問題です。組込みのクラスについて開発者間で実装が異なると、チーム開発を進める際に環境が揃わないことになり、トラブルの原因となることがありえます。

[2] Tweenインスタンスを、Objectで型指定する方法がありえます。Macromedia Developer Center「Using the Tween and Transition Classes in Flash MX 2004」の「About the Tween Class」で紹介されているサンプルスクリプトは、この手法にもとづいています(もっとも、その理由については明記されていません)。

注意すべきことは、Object型で指定すると、未定義のプロパティやメソッドへのアクセスも可能になり、実際上型指定が意味をなさなくなることです。しかし、Tweenクラスのプロパティやメソッドは、あまり数が多くありませんし、引数をとるメソッドも少ないです。また、Tweenクラスで型指定をしても、Flash MX 2004はもちろんFlash 8でもコードヒントは表示されません。したがって、型指定の効力がないことによるデメリットは、相対的に少ないといってよいでしょう。

[3] 配列アクセス演算子[]を使ってプロパティを指定すると、そのアクセス時にかぎり、型指定のチェックを回避することができます。この方法によれば、インスタンスをTweenクラスで型指定して、他のプロパティやメソッドを使うときには型チェックを受けることが可能になります。

import mx.transitions.Tween;
var myTween:Tween;
// ...[中略]...
myTween["onMotionFinished"] = function() {
   // ステートメント
};

難点は、イベントハンドラメソッドにアクセスするときには、ドットシンタックスが使えず、必ず配列アクセス演算子を用いなければならないことです。

[*1] Flash MX 2004を使用する場合の対処方法です。Flash 8のTweenクラスは前述(スクリプト002)のとおり、問題が修正されています。したがって、Flash Player 7で書出す際も、エラーが発生することはありません。つまり、Flash 8にアップグレードすることも、解決方法のひとつになります。

_____

作成者: 野中文雄
更新日: 2006年2月3日 対処法[3]のスクリプトの誤植を訂正
作成日: 2005年9月26日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.