電子書籍の厳選無料作品が豊富!

ムービークリップに スクリプト(以下(1)(2))をつけたいのですが、
そのスクリプトを別々(フレームやムービークリップ)に設定しているためか、
思うような動きを出すことができません。
同じフレームにスクリプトを書くことができれば
解決できると思うのですがそれができなくて・・・。

私の考えるイメージは以下の通りです・・・。
(1)フレーム上に赤の四角□(R_mc1、R_mc2)と白の四角□(W_mc1、W_mc2)のムービークリップ(MC)があります。
(2)赤のMCはドラッグすることができ、ドラッグしたMCは他のMCに重なると常に上に表示される。
(3)ドラッグした赤のMCが白のMCにヒットすれば(重なれば)、赤から黄へと色が変わる。
 (そのために、赤のMC内のタイムラインには、フレーム1に赤、フレーム2に白、フレーム3に黄色の四角□を置いて、ヒットすればMC内のフレーム3にいくようにする。)
(4)赤の四角□をドラッグせずにクリックだけをした場合は、MC内のフレーム2に行き、赤から白に色が変わる。
(5)リセットボタンをクリックすると、赤や黄のMCが元の位置に戻る。(最初のMCに戻る)

環境は、Flash Professional CS5.5 Action Script 2.0   Flash Player10 です。

以下はフレームに書いたスクリプト(1)です。

//---------------------------
//深度カウント用変数を用意
var dep_cnt:Number = 1;

//変数 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++;
//押下されたMCをその深度に移動
this.swapDepths(dep_cnt);
//押下されたMCのドラッグを開始
this.startDrag();
//★マウスが動く度に関数 watchHitW_mc を実行
this.onMouseMove = watchHitW_mc;
}

//関数 dropMC の定義
function dropMC():Void {
//放されたMCのドラッグを終了
this.stopDrag();
//★マウスが動く度に関数 watchHitW_mc を実行するのを解除
delete this.onMouseMove;
}

//★関数 watchHitW_mc の定義
function watchHitW_mc():Void {
//★ドラッグ中のMCがそのMC内の変数 target_mc に
// 代入したMCとヒットしていれば
if (this.hitTest(this.target_mc)) {
//★ドラッグ中のMC内をフレーム3で停止
this.gotoAndStop(3);
} else {
//★それ以外はドラッグ中のMC内をフレーム1で停止
this.gotoAndStop(1);
}
}
//---------------------------



以下はR_mc1とR_mc2自体に書いたスクリプト(2)です。  R_mcをクリックしたときに白色になるようにR_mc 内のフレーム2(白い四角□)に行くようにしてあります。
(本当は、上記に示したフレームに書くスクリプト(1)に加えて書かなければいけないのだと思うのですが、その書き方がわからないので、R_mc自体に書いています。)


//---------------------------
on (release) {
this.gotoAndPlay(2);

}
//---------------------------

以上のようなスクリプト(1)(2)にすると、赤のMC(R_mc1、R_mc2)をドラッグすると、スクリプト(1)ではなく、スクリプト(2)が優先されて、赤から黄にしたいのに、白に変わってしまうのです。

上記の私の考えるイメージ(1)~(5)が実行できるようなフレームに書くスクリプトを教えてください。
どうぞよろしくお願いいたします。

補足 リセットボタンには以下のスクリプトを書いてあります。
   リセットボタンは同じフレーム内にスクリプトを書かずに、リセットボタン自体に書いてもかまいません。

//------------------
on (release) {
//変数 i に 1~2を入れながらループ
for (i=1; i<=2; i++) {
//「R_mc○」を削除
this["R_mc"+i].removeMovieClip();
}
gotoAndStop(1);
gotoAndStop(2);
}
//------------------

「FlashのMCに複数の動作をつけるため」の質問画像

A 回答 (3件)

#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 でも)
不具合なく動作しました。


というわけで,一応の報告まで。
    • good
    • 0

#1&#2です。




#2では,
なぜか【添付図】が付かなかったため
再添付します↓。
「FlashのMCに複数の動作をつけるため」の回答画像3
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/09/06 21:49

ご質問内容に


少々不可解な点がありますね。。。


> (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);
}
}
//---------------------------



スクリプトのコメント行で▼を付けた行が
ご質問のスクリプトに付け足しをした部分です。
(このフレームのスクリプトに関しては,付け足しをしただけで削除した部分はありません。)
「FlashのMCに複数の動作をつけるため」の回答画像1

この回答への補足

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

補足日時:2013/09/04 20:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!