![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
ムービークリップに スクリプト(以下(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に複数の動作をつけるため」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/1/1203846_5497dc924d8d8/M.jpg)
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 でも)
不具合なく動作しました。
というわけで,一応の報告まで。
No.3
- 回答日時:
#1&#2です。
#2では,
なぜか【添付図】が付かなかったため
再添付します↓。
![「FlashのMCに複数の動作をつけるため」の回答画像3](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/a/1373636_5497e205eebaa/M.jpg)
BlurFiltanさん、いろいろなバージョン&OSでの動作確認、本当にありがとうございます。
時間や手間をおかけしてしまって本当に申し訳ありません。また、感謝の気持ちでいっぱいです。
もう一度、最初から作り直してみます。きっと私がアドバイス通りにスクリプトを書くことが出来なかった
ことが原因だと思います(>_<)
Flash初心者なので失敗の繰り返しですが、その度にBlurFiltanさんにはお世話に
なってばかりです。いつもお力を貸してくださり、本当に本当にありがとうございますm(__)m
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);
}
}
//---------------------------
スクリプトのコメント行で▼を付けた行が
ご質問のスクリプトに付け足しをした部分です。
(このフレームのスクリプトに関しては,付け足しをしただけで削除した部分はありません。)
![「FlashのMCに複数の動作をつけるため」の回答画像1](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/8/1373636_5497e61c1ba4c/M.jpg)
この回答への補足
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- スピーカー・コンポ・ステレオ MCカートリッジのオススメを教えてください。 お時間割いてくださりありがとうございます。 当方、現在 10 2022/07/04 14:20
- 物理学 相対性理論のエネルギーについて 3 2023/02/10 15:59
- その他(ビジネス・キャリア) 海外から請求書がきたのですがPC/MCの意味がわからないのとそこの数字があってるのかわからなくて海外 2 2022/11/08 11:32
- 情報・ワイドショー タレントMC 5 2023/06/23 06:44
- アイドル・グラビアアイドル 嵐の中でも櫻井翔がMC向き扱いだったけど。 むしろ バラエティやらみていて 爺ちゃん ばあちゃん 国 2 2022/12/03 19:49
- BTOパソコン https://www.youtube.com/watch?v=8h8EVXotOwQ&t=14s 2 2022/12/23 02:25
- バラエティ・お笑い リニューアルされた「新婚さんいらっしゃい!」 3 2022/04/03 18:55
- 物理学 『四次元温度』 2 2022/05/09 11:07
- 工学 材料力学(構造力学?)についての問題です。 写真のような形で部材CDの内力を考えます。 C点からの距 1 2022/11/22 00:41
- 宇宙科学・天文学・天気 AIが答えた方程式 1 2023/02/20 00:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
paraflaのアクションスクリプト...
-
ASではどうやって記述するのか
-
フレームでのResponse.Redirect
-
格闘ゲームのコマンド→↓→のプロ...
-
ActionScript~ロールオーバー...
-
FLASHでシーンをつなげる。
-
読み込んだテキストを Split で...
-
ムービーの早送りと巻き戻しが...
-
フレームからフレームへの移動...
-
suzukaのタイムラインの設定に...
-
左フレームの選択結果を右フレ...
-
Flashで右クリックメニューにつ...
-
フラッシュで逆再生中の停止に...
-
Flash3.0 ループ再生について
-
phpで音を鳴らす
-
ビルダー2001:フレームの保存
-
マスクの形を自由自在に変えたい
-
動画の遅延再生プログラム
-
WindowsMediaVideoをインライン...
-
ビルダー フレームページから...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
三角形ABCのBを可変にしたい
-
外部ムービー読込み後 AS が...
-
paraflaのアクションスクリプト...
-
Flash ドラック&ドロップ 色の...
-
mcのスクロール
-
Flash lite 1.1で待受け作成
-
FlashのMCに複数の動作を...
-
AS3.0でムービークリップ制御
-
【AS3.0】Timerとタイムライン
-
ムービークリップを1コマ飛し...
-
FLASH LITE1.1 制限時間を任意...
-
オンマウスでモーションを停止...
-
関数を順番に実行したい AS3
-
FLASHの同一タイムラインで、複...
-
AS3でムービークリップ再生・早...
-
AS3.0でComboBox
-
as3.0でのフレーム移動制御のス...
-
actionscript3.0で親階層にある...
-
フレーム内に移動したい
-
【C#】wavファイルの複数同時再生
おすすめ情報