うまくいかない原因がわからず困っています。
画面上の複数のmcに同じイベントを記述しました。
内容はシンプルで、「mc01にマウスがのったらフレームf01に移動する、
マウスが離れたらフレームstartに戻る」というものです。
mc02はf02へ、mc03はf03へ移動というふうにします。
これをmc01からmc07まで順番に書いていったところ
mc07は反応するのですが、あとの6つが反応しません。
mc07の記述を消すとmc06が反応するようになり、
どうやら一番最後に記述している部分しか反応しないようです。
これ↓がそれぞれのmcに書いてるASです。
----------------------------------------------------------
onClipEvent (enterFrame) {
if (_root.mc01.hitTest(_root._xmouse,_root._ymouse,1)) {
_root.gotoAndPlay("f01");
} else {
_root.gotoAndPlay("start");
}
}
----------------------------------------------------------
ちなみにFlash8使用、プレイヤー8でパブリッシュしてます。
どうぞよろしくお願いします。
No.2ベストアンサー
- 回答日時:
どこから説明すれば良いか困りますね。
長くなりますが,広く浅く説明します。
onClipEvent (enterFrame) {○○}
は1フレーム進む時間ごとに毎回 ○○ の部分が実行されます。
そこは宜しいですよね?
この onClipEvent(enterFrame){○○} を各ムービークリップに書くということは,
各ムービークリップの onClipEvent(enterFrame){○○} の○○が
1フレーム進む時間ごとに毎回順次実行されるということです。
この各ムービークリップの
onClipEvent (enterFrame) {○○} の実行順序ですが,
これは [パブリッシュ設定] の [Flash]タブ にある,
ダウンロードの順序(L):[下から上へ v]
となっているところで決まります。
[下から上へ] を [上から下へ] などに変えると,
逆に mc01 のみが反応するように変わると思います。
※デフォルトは [下から上へ] です。
通常それで問題はありません。
またそこを変えても何の解決にもならないので
実験してみるだけにしておいて,
本番は変えない方が良いです。
順序の規則(法則)については詳しく書きませんし複雑です。
とにかく,
各ムービークリップの onClipEvent(enterFrame){○○} の○○が
1フレーム進む時間ごとに毎回,不明な順序で実行される。
ということだけはちゃんと認識しておく必要があります。
ご質問のような現象が起こるのは,
mc01 の onClipEvent(enterFrame){○○} が実行
mc02 の onClipEvent(enterFrame){○○} が実行
mc03 の onClipEvent(enterFrame){○○} が実行
…略…
mc07 の onClipEvent(enterFrame){○○} が実行
という順で実行されるので起こる現象です。
たとえば,
「mc01」にだけ マウスが乗っていたとします。
mc01 の onClipEvent(enterFrame){○○} が実行
ここ↑でフレーム「f01」に進もうとします。
これがやりたいことですよね。
しかし次の
mc02 の onClipEvent(enterFrame){○○} が実行
が実行されたときには,
マウスは「mc02」には乗っていないのですから,
このスクリプトによって フレーム「start」 に進もうとします。
次の
mc03 の onClipEvent(enterFrame){○○} が実行
によっても フレーム「start」 に進もうとします。
最後の
mc07 の onClipEvent(enterFrame){○○} が実行
によっても フレーム「start」に進もうとします。
旗上げゲームで言うと
「赤上げて,赤上げないで,赤上げない。」
→赤が下がっているのが正解!
と同じ状態です。
したがって,結局最後に実行される
mc07 の onClipEvent (enterFrame) {○○} が最優先されて,
「mc01」にだけマウスが乗っていた場合,
フレーム「start」に進みます。
以上がそうなる理由です。
=== === === === === ===
解決策ですが。
そもそも Flash 5 時代にしか使われなかったような,
onClipEvent(enterFrame){○○} を使うところに
問題を生じやすくさせる原因があると思います。
普通 onClipEvent (enterFrame) {○○} などは
それ相応の理由がない限り使いません。
※仮に Flash 5 であっても
指令塔のようなムービークリップを1つ作成して
その 1ムービークリップ の onClipEvent(enterFrame){○○} だけによって
全体を管理するというのが普通のやり方です。
ご質問内容にあるようなことをする場合で,
なおかつ,スクリプト内容も変えない場合は次のようにします。
まず,
「mc01」~「mc07」 自体に書いた onClipEvent(enterFrame){○○} を全て削除します。
そして _root のフレーム1などに次のように書きます。
---------------------------------------------------
_root.onEnterFrame = function() {
if (_root.mc01.hitTest(_root._xmouse, _root._ymouse, 1)) {
_root.gotoAndPlay("f01");
} else if (_root.mc02.hitTest(_root._xmouse, _root._ymouse, 1)) {
_root.gotoAndPlay("f02");
} else if (_root.mc03.hitTest(_root._xmouse, _root._ymouse, 1)) {
_root.gotoAndPlay("f03");
} else if (_root.mc04.hitTest(_root._xmouse, _root._ymouse, 1)) {
_root.gotoAndPlay("f04");
} else if (_root.mc05.hitTest(_root._xmouse, _root._ymouse, 1)) {
_root.gotoAndPlay("f05");
} else if (_root.mc06.hitTest(_root._xmouse, _root._ymouse, 1)) {
_root.gotoAndPlay("f06");
} else if (_root.mc07.hitTest(_root._xmouse, _root._ymouse, 1)) {
_root.gotoAndPlay("f07");
} else {
_root.gotoAndPlay("start");
}
};
---------------------------------------------------
これで,
最後の「mc07」のスクリプトだけが動作するということはなくなります。
=== ===
ただしー! ですね。
最初に書きましたが,
onClipEvent (enterFrame) {○○} は,
1フレーム進む時間ごとに毎回 ○○ の部分が実行されます。
また上に書いた
○○.onEnterFrame = function() {○○} も
1フレーム進む時間ごとに毎回 ○○ の部分が実行されます。
つまりどっちにしても,
1フレーム進む時間ごとに毎回 ○○ の部分が実行されることには変わりがありません。
たとえば 「どのmcにもマウスが乗っていないとき」。
_root.gotoAndPlay("start");
これが1フレーム進む時間ごとに毎回実行されます。
つまり,1フレーム進む時間ごとに毎回フレーム「start」に行き続けます。
1フレーム進む時間ごとに毎回フレーム「start」に行き続けるということは
ずっと フレーム「start」 で止まりっぱなしになります。
ひとつも _root.gotoAndPlay("start"); の play は実行されないということです。
1フレーム進む時間ごとに毎回 フレーム「××」 に行きつづけさせないようにするのは,
何かフラグとなるような変数を1つ作って,
そのフラグを切り替えて,そのフラグによって動作を変えるようにするのも1つの方法です。
上のスクリプトを全て消して,
次のスクリプトに書き替えです。
---------------------------------------------------
var flag:Boolean = false;
_root.onEnterFrame = function():Void {
if (_root.mc01.hitTest(_root._xmouse, _root._ymouse, 1)) {
if (!flag) {
_root.gotoAndPlay("f01");
flag = true;
}
} else if (_root.mc02.hitTest(_root._xmouse, _root._ymouse, 1)) {
if (!flag) {
_root.gotoAndPlay("f02");
flag = true;
}
} else if (_root.mc03.hitTest(_root._xmouse, _root._ymouse, 1)) {
if (!flag) {
_root.gotoAndPlay("f03");
flag = true;
}
} else if (_root.mc04.hitTest(_root._xmouse, _root._ymouse, 1)) {
if (!flag) {
_root.gotoAndPlay("f04");
flag = true;
}
} else if (_root.mc05.hitTest(_root._xmouse, _root._ymouse, 1)) {
if (!flag) {
_root.gotoAndPlay("f05");
flag = true;
}
} else if (_root.mc06.hitTest(_root._xmouse, _root._ymouse, 1)) {
if (!flag) {
_root.gotoAndPlay("f06");
flag = true;
}
} else if (_root.mc07.hitTest(_root._xmouse, _root._ymouse, 1)) {
if (!flag) {
_root.gotoAndPlay("f07");
flag = true;
}
} else if (flag) {
_root.gotoAndPlay("start");
flag = false;
}
};
---------------------------------------------------
これ↑は長いので,
次↓のように for文を用いて短くしても良いかもしれません。
---------------------------------------------------
var ON_flag:Boolean = false;
var Hit_flag:Boolean;
var i:Number;
_root.onEnterFrame = function():Void {
Hit_flag = false;
for (i=1; i<=7; i++) {
if (_root["mc0"+i].hitTest(_root._xmouse, _root._ymouse, 1)) {
if (!ON_flag) {
_root.gotoAndPlay("f0"+i);
ON_flag = true;
}
Hit_flag = true;
break;
}
}
if (!Hit_flag && ON_flag) {
_root.gotoAndPlay("start");
ON_flag = false;
}
};
---------------------------------------------------
長くなりましたが,ポイントを要約すると次の2つなります。
◎「複数のインスタンスにスクリプトを書くと実行順序の把握が困難になる」
→実行順序の把握をしようとするのではなくスクリプトを1つにまとめる
※スクリプトを1つにまとめると実行順序を気にしなくて良い上
見通しが良くなり全体を管理しやすくなる (一石二鳥)
◎「enterFrame系スクリプトは1フレーム進む時間ごとに毎回実行される」
→ play() や gotoAndPlay() を使う場合は要注意
※ play() や gotoAndPlay() に限らず
ずっと全く同じ命令を出しつづけることは避けるべき
~~~ ~~~ ~~~
あと,
どうしても hitTest を使わなければならないのでしょうか?
on(rollOver){○○} や onRollOver=function(){○○} ,
on(rollOut){○○} や onRollOut=function(){○○}
などを使えば
以上のようなことを一々考えずに簡単に済む話ですが。
ご回答ありがとうございました。
大変参考になりました!!
実は最初、onRollOverを使って作ってみたのですがうまくいかず、
それでhitTestを使うことにしたのです。
が、たぶんそれも何か間違いがあったからだと思います。
とりあえず今回は教えていただいたスクリプトに書き換えて
なんとかまとめることができましたので、これでいこうと思います。
どうもありがとうございました。
No.1
- 回答日時:
よくわかりませんが、何となくmc01~mc07までを同じ深度(レベル)で作成されている、もしくはattachMovieされてませんか?
そうであれば一番最後に作成またはアタッチされたムービーしか反応しないのは当然ですが・・・
基本的なことをきちんと理解していないのですが、
レベルのことはまったく頭になかったので
おっしゃるようなことが原因かもしれません。
mc01~mc07を1つずつ個別のレイヤーに配置していたのですが
全部を1つのレイヤーに入れたら動くようになりました。
ご回答どうもありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つの条件を指定してVBAで行を削除したい 条件1:分類1が重複 条件2:分類2が重複 条件3:個数 6 2022/06/24 11:07
- スピーカー・コンポ・ステレオ MCカートリッジのオススメを教えてください。 お時間割いてくださりありがとうございます。 当方、現在 10 2022/07/04 14:20
- 情報・ワイドショー タレント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
- その他(ビジネス・キャリア) 海外から請求書がきたのですがPC/MCの意味がわからないのとそこの数字があってるのかわからなくて海外 2 2022/11/08 11:32
- 工学 材料力学(構造力学?)についての問題です。 写真のような形で部材CDの内力を考えます。 C点からの距 1 2022/11/22 00:41
- 物理学 相対性理論のエネルギーについて 3 2023/02/10 15:59
- Visual Basic(VBA) 正規表現を用いての並び替え 7 2022/04/04 09:27
- その他(テレビ・ラジオ) テレビ朝日でMCをしている元日本テレビの羽鳥アナウンサーが頭の悪い長嶋一茂と石原良純の遣りたい放題で 5 2022/12/29 18:58
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Form内のselectを連動させるに...
-
potplayerについて質問です
-
アメブロで音声ファイルを貼る方法
-
Python でシャットダウンのコマ...
-
最近、手の中にマイクロチップ...
-
FLASHでゲームを作っていた人は...
-
この曲はなんでしょう?
-
laptop go2からの買い替え、lap...
-
スクリップト
-
私のコンピューター上のファイ...
-
arduino プログラムについて
-
chrome flash
-
FLASHの再生はできないのでしょ...
-
フラッシュゲームアーカイブ2
-
ウェブサイトで Flash が事実上...
-
Flashコンテンツを使ったWebサイト
-
Flash Playerのサポートが終了
-
Flashをブロックしないで
-
ダウンロードしたデジブックはa...
-
ad or script について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
シェルでMYSQLを実行したい
-
マウス 追従 範囲外
-
複数のmcに同じイベントを記述...
-
startDragの範囲
-
マウスに反応した画像スクロール
-
Flash AS2でMCをDragしたいです
-
photoshopで書いた四角の枠の中...
-
VBAで改行の入ったデータの正規...
-
VBScriptでMsgBoxのYesNoボック...
-
python ボタンを押すと複数の関...
-
テキストボックスの中身をリセ...
-
テキストボックスにセルの値を...
-
else if文の順序を変えることに...
-
別のアプリケーションのテキス...
-
変数に256文字以上のテキストを...
-
VB6.0で、フォームから、別のフ...
-
VB6.0 でメニューを作りたいん...
-
【VB.NET】別Formのボタンが押...
-
UWSCのBTN関数について。
-
四乗根を英語で言うと・・・
おすすめ情報