- ベストアンサー
ムービクリップのロールオーバによるalphaの動作が正常に行われない理由は何ですか?
- ムービクリップのa1,a2,a3,a4をロールオーバするとそれぞれ対応する数字のh1,h2,h3,h4のムービクリップのalphaが0から100にtweenを使って動かすことを考えたいと思います。
- このプログラムは、ムービクリップの初期設定を行い、それぞれのボタンのonRollOverイベントに対応するtweenを作成しています。
- しかし、このプログラムは正常に動作しません。原因として考えられるのは、ボタンのonRollOverイベントが正しく設定されていないことです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
ご提示のスクリプトですと、h1 ~ h4 にロールオーバーした時に a1 ~ a4 が変化するようになっていると思われますが、どちらなのでしょうか? とりあえず、ご質問文通り a1 ~ a4 にロールオーバーした時に h1 ~ h4 を Tween クラスで変化させる作例を考えます。 Tween クラスのコンストラクタ( new Tween )に渡す1番目のパラメータは、トゥイーンの対象になるオブジェクトの”参照”です。 ご提示のスクリプトでは、これがただの文字列になっているため、トゥイーンを作成する対象が正確に設定されていません。 この点を修正してスクリプトにしてみますと、大体、次のようになります。 ステージに a1 ~ a4 と h1 ~ h4 があり、a○のムービークリップにロールオーバーした時、h○のムービークリップを Tween クラスで操作するものとします。 このスクリプトは、メインのタイムラインのフレームに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) import mx.transitions.*; import mx.transitions.easing.*; //////////////////////////////////////////////////////////// //a1~a4の初期設定 //////////////////////////////////////////////////////////// for( i = 1 ; i <= 4 ; i++ ) { //ロールオーバー時に操作するムービークリップを記録しておく this[ "a" + i ].clip = this[ "h" + i ]; //ロールオーバー時の処理 this[ "a" + i ].onRollOver = function() { var tween_handler; //Tweenオブジェクトを作成 tween_handler = new Tween( this.clip , "_alpha" , Strong.easeOut , 0 , 100 , 1 , true ); }; } //////////////////////////////////////////////////////////// //h1~h4の初期設定 //////////////////////////////////////////////////////////// for( i = 1 ; i <= 4 ; i++ ) { //最初は透明にしておく this[ "h" + i ]._alpha = 0; } **************************** ムービークリップのインスタンス名を共通の名前+通し番号で付け、この通し番号をムービークリップごとに変数に保存しておいて何かに利用する手法は、ActionScript ではよく使われます。 今回は Tween クラスには対応する番号の”ムービークリップの参照”を渡さなければならないため、番号を保存した場合は、これを利用して対象のムービークリップの名前(を表す文字列)を作り、参照に変換して渡さなければなりません。 文字列を参照に変換するには eval 関数か [ ] 演算子を使いますが、eval 関数を使う方法は旧式です。 上記のスクリプトの this[ "a" + i ] や this[ "h" + i ] が、文字列を参照に変換している部分です。 [ ] 演算子で参照に変換する方法には様々な書き方がありますが、this を使う場合は this が指す対象に注意しましょう。 フレームに書いたスクリプトでの this は、そのタイムラインの階層を指します。 しかし、onRollOver などのイベントハンドラに登録される関数の中での this は、イベントハンドラの持ち主を指すように変わってしまいます。 各ムービークリップに設定した管理番号を利用し、更に this を使った相対表現でターゲットパスを書くと、new Tween の第1パラメータは tween_handler = new Tween( this._parent[ "h" + this.n ] , … ); このようになります。 番号を変数に記録しておき、onRollOver = function の中で番号から対象のムービークリップの参照を作るとなると、this の指す対象の変化でこの通りターゲットパスが複雑になります。 先の作例では、ただの番号ではなく、自分に対応するムービークリップの参照を変数に記録しています。 あとは、この変数を間違いなく new Tween に渡すだけです。 [ ] 演算子で変換すると this や _parent がたくさん付いてターゲットパスがややこしくなりそうな場合は、最初から、操作したいムービークリップの参照を記録しておく方法がオススメです。
お礼
ありがとうございました。質問の後、rootから指定すると作動したので、対応するクリップがわからないのだろうとは思っていましたが、なるほどこれはスマートです。色々応用できそうです。今後ともよろしくお願い申し上げます。