• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:FlashのMCに複数の動作をつけるためには)

FlashのMCに複数の動作をつける方法

このQ&Aのポイント
  • FlashのMCに複数の動作をつけるためには、スクリプトを別々に設定している場合は思うような動きを出すことができません。同じフレームにスクリプトを書くことで解決できます。
  • 赤の四角(R_mc1、R_mc2)と白の四角(W_mc1、W_mc2)のムービークリップがあります。赤のMCをドラッグすると他のMCに重なると常に上に表示されます。ドラッグした赤のMCが白のMCにヒットすると色が変わります。
  • 環境はFlash Professional CS5.5 Action Script 2.0 Flash Player10です。スクリプト(1)とスクリプト(2)を組み合わせることで、赤のMCをドラッグすると赤から黄色に変化し、クリックすると赤から白色に変化します。リセットボタンをクリックするとMCが元の位置に戻ります。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1です。 実際に作ってみましたが, #1の[補足]に書かれていらっしゃるような不具合現象は起きませんでしたけどね。。。 ちなにみ私は メインのタイムライン(_root)の フレーム1 に ご質問本題のフレームのスクリプトを書いて メインのタイムラインの フレーム2 に stop(); と書いています。 ↑「絶対にこうすべき」という意味ではなくて, 動作検証のために作成しているファイルにおいて, 「私はそうしている」と言うだけの意味です。 というわけで, メインのタイムライン(_root階層)の様子は 下の 【添付図】↓ のようになっています。 #1より修正したスクリプトは2箇所(2行)で 変更点は次の通りです。 ◎メインのタイムラインの フレーム1 のスクリプト変更点 //変数 i に 1~2を入れながらループ for (var i:Number = 1; i<=2; i++) {   ↓変更↓ //変数 i に 1~10 を入れながらループ for (var i:Number = 1; i<=10; i++) { ◎リセットボタンのスクリプト変更点 //変数 i に 1~2を入れながらループ for (i=1; i<=2; i++) {   ↓変更↓ //変数 i に 1~10 を入れながらループ for (i=1; i<=10; i++) { 動作検証に使用した Flash のバージョン は Flash 8 と Flash CS 4 と Flash CS 5.5 です。 (OS は Windows Vista と XP です。) SWFのパブリッシュ設定は ActionScript 2.0 です。 そして Flash Player 6 設定でも Flash Player 10 設定でも(正確には Flash Player 10 & 10.1 でも) 不具合なく動作しました。 というわけで,一応の報告まで。

その他の回答 (2)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.3

#1&#2です。 #2では, なぜか【添付図】が付かなかったため 再添付します↓。

kochacha
質問者

お礼

BlurFiltanさん、いろいろなバージョン&OSでの動作確認、本当にありがとうございます。 時間や手間をおかけしてしまって本当に申し訳ありません。また、感謝の気持ちでいっぱいです。 もう一度、最初から作り直してみます。きっと私がアドバイス通りにスクリプトを書くことが出来なかった ことが原因だと思います(>_<) Flash初心者なので失敗の繰り返しですが、その度にBlurFiltanさんにはお世話に なってばかりです。いつもお力を貸してくださり、本当に本当にありがとうございますm(__)m

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

ご質問内容に 少々不可解な点がありますね。。。 > (4)赤の四角□をドラッグせずに > クリックだけをした場合は、 > MC内のフレーム2に行き、赤から白に色が変わる。 これに関してですが, まず「クリック」とは 「ボタンや MC などをマウスで一旦押して その押したボタンや MC などを放す行為」 を指しますが そこのところはよろしいですよね? 上の引用部分を言いかえるなら, まずは赤の四角□MCを一旦押したとします。 その後 ドラッグせずに「マウスを上げたとき」には そのMC内を フレーム2 に行かせて 少しでもドラッグしたときには そのMC内を フレーム1 または フレーム3 に行かせるという意味になります。  ↓↓ 例 ↓↓ まず R_mc1 を一旦押す →もしドラッグせずにマウスアップしたら R_mc1 内を フレーム2 にする。 それ以外で(=少しでもドラッグをした場合で), →もしドラッグ中に R_mc1 が W_mc1 に重なれば R_mc1 内を フレーム3 にする。 →もしドラッグ中に R_mc1 が W_mc1 に重なっていなければ R_mc1 内を フレーム1 にする。 (少しでもドラッグをしたら R_mc1 内を フレーム2 に行かせることはない。) こういう解釈でよろしいのでしょうか? これで良いとするなら, そうなるようにちゃんと場合分けを考えてスクリプトを組まなければならないでしょう。 > スクリプト(2)が優先されて、赤から黄にしたいのに、 > 白に変わってしまうのです。 そりゃ,そうなります。 現状ではマウスアップしたときに, 無条件にMC内を フレーム2 に行かせるようにしているのですから そんな感じになってしまいます。 希望通りの動きにするには 無条件に フレーム2 に行かせるのではなくて ちゃんと条件を付けて フレーム2 に行かせる必要があります。 あと > on (release) { >  this.gotoAndPlay(2); > } この gotoAndPlay も不可解です。 gotoAndStop の間違いではないのでしょうか? というわけで何だか不可解な点がありますが 書かれていらっしゃる内容の通りをスクリプト化してみます。   まず R_mc1とR_mc2自体に書かれた on (release) { this.gotoAndPlay(2); } は全て消してください。 そして フレームに書くスクリプトの修正例です↓。 //--------------------------- //深度カウント用変数を用意 var dep_cnt:Number = 1; //▼ドラッグされたかどうかのフラグとなる変数を用意 var drg_flg:Boolean; //変数 i に 1~2を入れながらループ for (var i:Number = 1; i<=2; i++) { //★「R_mc○」内の再生を停止 this["R_mc"+i].stop(); //★「R_mc○」内の変数 target_mc に「W_mc○」の参照を代入 this["R_mc"+i].target_mc = this["W_mc"+i]; //「R_mc○」押下時に関数 dragMC を実行 this["R_mc"+i].onPress = dragMC; //「R_mc○」を放した時に関数 dropMC を実行 this["R_mc"+i].onRelease = dropMC; //「R_mc○」をMC外で放した時にも関数 dropMC を実行 this["R_mc"+i].onReleaseOutside = dropMC; } //関数 dragMC の定義 function dragMC():Void { //深度カウント用変数をカウントアップ dep_cnt++; //▼ドラッグされたかどうかのフラグを false にする drg_flg = false; //押下されたMCをその深度に移動 this.swapDepths(dep_cnt); //押下されたMCのドラッグを開始 this.startDrag(); //★マウスが動く度に関数 watchHitW_mc を実行 this.onMouseMove = watchHitW_mc; } //関数 dropMC の定義 function dropMC():Void { //放されたMCのドラッグを終了 this.stopDrag(); //▼ドラッグされたかどうかのフラグが false であれば if (!drg_flg) { //▼クリックしたMC内をフレーム2で停止 this.gotoAndStop(2); } //★マウスが動く度に関数 watchHitW_mc を実行するのを解除 delete this.onMouseMove; } //★関数 watchHitW_mc の定義 function watchHitW_mc():Void { //▼ドラッグされたかどうかのフラグを true にする drg_flg = true; //★ドラッグ中のMCがそのMC内の変数 target_mc に // 代入したMCとヒットしていれば if (this.hitTest(this.target_mc)) { //★ドラッグ中のMC内をフレーム3で停止 this.gotoAndStop(3); } else { //★それ以外はドラッグ中のMC内をフレーム1で停止 this.gotoAndStop(1); } } //--------------------------- スクリプトのコメント行で▼を付けた行が ご質問のスクリプトに付け足しをした部分です。 (このフレームのスクリプトに関しては,付け足しをしただけで削除した部分はありません。)

kochacha
質問者

補足

Blur Filtanさんには、今回も本当にお世話になります。 説明不足で不可解な質問になってしまいました。すみません(^_^;) でも、私の意図した解釈をしてくださりありがたいです。 早速、ご回答くださったスクリプトをフレームに書いて動作確認をしてみました。 R_mcやW_mcの数を増やしてそれぞれにインスタンス名(R_mc3,R_mc4,R_mc5・・・)(W_mc3,W_mc4,W_mc5・・・)とつけてパブリッシュ後の動作確認をしました。 ほとんどのMCは、意図した動作をしてくれるのですが、なぜか全く反応しない (クリックもドラッグもできない)MCができてしまうのです。 なぜでしょうか? R_mc自体に書いたスクリプトはきちんと削除もしてあります。 また、R_mcやW_mcは10個ずつに増やしたので、 //変数 i に 1~10を入れながらループ for (var i:Number = 1; i<=10; i++) { と変数iの数値もきちんと変更したのですが・・・。 すみませんが、再度、ご回答をお願いいたしますm(__)m

関連するQ&A