サイトトップ

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

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

フレームを戻るとMovieClip.transformの値がリセットされる

ID: FN0702001 Product: Flash

Platform: Macintosh
Version: 8.0

問題
Flash 8で確認された現象です。タイムラインに配置したMovieClipインスタンスのMovieClip.transformプロパティの値を設定した後、それより手前のフレームに移動すると、プロパティの値がリセットされます。対象のMovieClipインスタンスは、プロパティを設定したフレームから戻り先まで連続して配置されているものとします。

図001■MovieClipインスタンスとフレームアクションを設定
図001

たとえば、メインタイムラインの第1フレームから第5フレームまでMovieClipインスタンスmy_mcを配置して、第5フレームアクションとして以下のスクリプト001を設定します(図001)。すると、第5フレームで、MovieClip.transformプロパティの設定により、MovieClipインスタンスmy_mcのカラーが青(0x0000FF)に変更され、x座標は100ピクセル右に移動します(図002)。

図002■MovieClipインスタンスのカラーと座標が変わる
図002

その後MovieClipインスタンスをクリックすると、MovieClip.onReleaseイベントハンドラメソッドに設定された関数(function)が、再生ヘッドをメインタイムライン第1フレームに戻します。その結果、MovieClipインスタンスは、MovieClip.transformプロパティ設定前の状態にリセットされます。

スクリプト001■MovieClip.transformプロパティでMovieClipのカラーと座標を設定

// フレームアクション: 第2フレーム以降
// MovieClip: 全フレームにmy_mcを配置
import flash.geom.Transform;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
var nFrame:Number = 1;
var myTransform:Transform = my_mc.transform;
var myColor:ColorTransform = new ColorTransform();
var myMatrix:Matrix = myTransform.matrix;
myColor.rgb = 0x0000FF; // カラーを青に変更
myTransform.colorTransform = myColor;
myMatrix.tx += 100; // 水平座標を右に100ピクセル移動
myTransform.matrix = myMatrix;
my_mc.onRelease = function() {
  this._parent.gotoAndStop(nFrame);
  trace(this._parent._currentframe);
};
this.stop();

原因
Flash 8でタイムラインに予め配置されたMovieClipインスタンスに対してMovieClip.transformプロパティの値を変更しても、手前のフレームに移動するとプロパティが配置時の値にリセットされるようです。Mac OS XとWindows XPの両環境で確認されています。

オーサリング時に予め配置されたMovieClipについて発生する現象です。ランタイムにダイナミックに生成したMovieClipインスタンスには、この問題は起こりません。また、Flash Professional 9 ActionScript 3.0 PreviewでFlash Player 9にパブリッシュした場合も、ActionScript 2.0と3.0[*1]ともに問題は解消しています。

したがって、Flash Player 8のバグと考えてよいでしょう。

[*1] ActionScript 3.0でスクリプト001と同様のサンプルを作成すると、つぎのようになります(スクリプト002)。

スクリプト002■ActionScript 3.0でMovieClip.transformプロパティでMovieClipのカラーと座標を設定

// フレームアクション: 第2フレーム以降
// MovieClip: 全フレームにmy_mcを配置
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.geom.Transform;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
var nFrame:Number = 1;
var myTransform:Transform = my_mc.transform;
var myColor:ColorTransform = new ColorTransform();
var myMatrix:Matrix = myTransform.matrix;
myColor.color = 0x0000FF;
myTransform.colorTransform = myColor;
myMatrix.tx += 100;
myTransform.matrix = myMatrix;
my_mc.addEventListener(MouseEvent.CLICK, click);
function click(eventObject:MouseEvent):void {
  this.gotoAndStop(nFrame);
  trace(this.currentFrame);
};
this.stop();

対処法
Flash Player 9に対応したFlashオーサリングツールがまだリリースされていない本稿執筆時の段階では、Flash Player 9でのパブリッシュは正式な対処法にはなりえません。

Flash 8では、MovieClip.transformプロパティの操作対象となるMovieClipインスタンスの一部プロパティに値を設定することで、この問題が解消することを確認しました。たとえば、スクリプト001の任意の行に、以下の1ステートメントを追加します。

my_mc._x += 0;

作成者: 野中文雄
作成日: 2007年2月28日


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