- ベストアンサー
停止してしまうgotoAndPlay
- フレーム上のスクリプトとクリップイベントの動作制限について分からない
- ムービークリップが特定の場所に到達した時に停止しているアニメーションを再生したい
- onClipEvent (enterFrame)内でthis.gotoAndPlayが無効なのかどうか疑問
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#1の者ですぅ。 Flash4の件は無視しておいてください。ぜんぜん参考になりませんから。 『_parent』は MX2004の「ActionScript リファレンスガイド」(ヘルプ) にもちゃんとあります。 ------------------------------------ _parent Player Flash Player 5。 シンタックス _parent.property _parent._parent.property 説明 識別子; 現在のムービークリップまたはオブジェクトを含むムービークリップまたはオブジェクトへの参照を指定するか、返します。現在のオブジェクトとは、_parent を参照する ActionScript コードがあるオブジェクトです。現在のムービークリップまたはオブジェクトの上位のムービークリップまたはオブジェクトへの相対パスを指定するには、_parent を使用します。 ----------------------------------- また,「ActionScript ユーザーガイド」(※PDFです。重いです。) http://download.macromedia.com/pub/documentation/jp/flash/mx2004/fl_usingas_in_flash.pdf P.29「ドットシンタックス」 P.96「_root の不使用」 あたりにもあります。 要は相対パスです。 Flash4だと ../ になります。 私は ../ の方がなんとなくわかりやすいです。HTMLの相対パスに近いですから。 ファイルと言うよりフォルダに近いので,HTMLのパスとは少し意味合いが違いますけどね。 _root とか _parent とかいう書き方はFlash5から使用されているものです。 ---例----------------------- メインアニメーション ┗親MC(インスタンス名:oya) ┣子1MC(インスタンス名:ko1) ┗子2MC(インスタンス名:ko2) --------------------------- 「子1MC」のパスをメインアニメーションからの絶対パスで書くと, _root.oya.ko1 となります。 「子1MC」のパスを「子2MC」から見たときの相対パスで書くと, this._parent.ko1 または _parent.ko1 となります。 「子1MC」のパスを「親MC」から見たときの相対パスで書くと, this.ko1 または単に ko1 となります。 「子1MC」のパスを「子1MC」(自分自身)から見たときの相対パスで書くと, this. または,無記入 となります。 「親MC」のパスを「子1MC」から見たときの相対パスで書くと, _root.oya となります。 「親MC」のパスを「子1MC」から見たときの相対パスで書くと, this._parent. または _parent. となります。 注意する点は,ko1 などMCからの相対パスは, ko1 内のフレームに書いても,MC自体に直接書いても,パスは同じになると言う点です。 なんとなく,MCに直接書くとMCの外側の皮に書いた気になりますが(私だけ?),実はMCの中に書かれているのです。 ですから,MCに直接書く場合も,MCの中のフレームから見たときのパスをイメージすると間違いにくいです。 パスの始まりは,「_root」と「_parent」と「this」の3つです。簡単に覚えられますね。 日本語で言うと, 「_根」と「_親」と「_これ」です。スクリプトのままの方がわかりやすい気がしますが…。 この3つ以外のパスの部分は具体的なオブジェクトのインスタンス名になります。 絶対パスで書くと,_root.oya.gotoAndPlay(**); みたいになり,子から見た親を言うだけでも,必ず親MCのインスタンス名が必要になります。 親MCのインスタンス名は,ご質問の回答では不用ですから _parent にしました。 また,任意にたくさんこのようなMCを作った場合, _root.oya1 _root.oya2 _root.oya3 …… のように作った数だけ,スクリプトのパスを変えなければなりません。 これが面倒な場合,または不可能な場合は,_parent を使用した方が良いです。 私の頭の中のイメージと,ここ↓の図のイメージは上下が反対なので,イマイチわかりにくいですが。 http://f-site.org/articles/2002/01/26153958.html >> 手引書を紹介していただくことは可能でしょうか? >> (この掲示板では固有名詞を発するのは禁止?) 書籍などの固有名詞を発するのは大丈夫ですよ, サイト名やリンクがOKなのですから。 ただ自分個人の固有名詞やサイト名はダメでしょう(^_^)。 しかし,手引書と言われても私の意見など聞いても参考になりませんよ。 昔はけっこう本を持っていましたが今は(今のバージョンは)持ってないに等しいです。 情報源は ネット:ヘルプ=2:3 くらいです。 ヘルプですけど… MXのヘルプは,ヘルプ(フレーム使用のHTMLの集合体)だけ,切り離して,いつでも使えるようにMOなどに持っています。 またデスクトップにヘルプのショートカットを用意しています。 そうしているとソフト本体を起動することなくヘルプを見ることができます。 でもMX2004はそう簡単に切り離せません。 というか切り離すのは簡単ですが,お互いのページ(HTML)どうしにリンクがかかっていませんから, HTMLの集合体を持っていても使いようがありません。 それで,CHM(HTMLヘルプ)ファイルに自分でコンパイルして,CHMを持ち歩いています。 Flash5のヘルプも持っています。Flash4は当然。 (って何のために…?) Flash3のヘルプがほし~ぃ。(ヘルプマニアか!?) Flash2・1は英語しかないと思うからいらん。(どーでもエエって!) Flashのヘルプはハッキリ言ってスカッと役立つヘルプではありません。 でも使い慣れた人が何度も読み返しているとだんだん意味がわかってくるようにはなっています(意味ないじゃん)。 という感じですね。
その他の回答 (2)
#1です。 以下,#1の補足ではなく#1の蛇足です。 ちょっとした懐古心から… 「ムービークリップにスクリプトが書けなくたって… entarFrameなんてなくたって… 同様なことは昔からできたんだ~い。」 てなわけで,Flash4で#1と同様のことを再現。 実際,Flash4まではムービークリップ自体にはスクリプトが書けず, entarFrameとかいうハイカラなスクリプトもなかったです。 でも,同様のことはできました。 ボタン以外にはフレームにスクリプトを書くしかなかったのでムービークリップが大活躍します。 動く,親MCの中に2つ子MCを作る必要があります。 まず1つ目は親MCを動かす用のMCです。 このMCの中を2フレームにします。そして 1フレームのフレームスクリプトには --------------------------------------- Set Variable:"pos" =GetProperty ( "../", _x ) Set Property ("../", X Position) =pos - 5 --------------------------------------- 2フレームのフレームスクリプトには --------------------------------------- Go to and Play (1) --------------------------------------- これで,このMCは 1フレームと2フレームを行ったり来たりするので, 1フレームに戻るたびに, GetPropertyで,親(../)のxポジションを求め, Set Propertyで,親のxポジションを今より-5移動させるMCが完成します。 次に,親MCのxポジションが200以下になったら,親MCを"label1"フレームにgotoさせるMC。 このMCも中を2フレームにします。そして 1フレームのフレームスクリプトには --------------------------------------- Set Variable:"pos" =GetProperty ( "../", _x ) If (pos<= 200) Begin Tell Target ("../") Go to and Play ("label1") End Tell Target End If --------------------------------------- 2フレームのフレームスクリプトには --------------------------------------- Go to and Play (1) --------------------------------------- これで,このMCは 1フレームと2フレームを行ったり来たりするので, 1フレームに戻るたびに, GetPropertyで,親(../)のxポジションを求め, もしそのポジションが,200以下になったら, Tell Target で親に "label1" に行け! って命令するMCが完成します。 (↑全てのスクリプトコピペ不可能。) 『もし"label1"に行ってもこの2つ目のMCがいたら, 親MCは"label1"に行き続けるので,いつまでたってもPlayしません。』 だから,このMCは1フレームにだけ存在させるMCになるのです。 両方のMCとも2フレームしかなく,その2フレーム間を行ったり来たりさせて,再計算させています。 これが,今でいう entarFrame です。 entarFrameと,それが無効になったように見えるイメージはわかりました? って,よけいわかりにくくなりましたか…。
どもです。 最近多忙につき,ちょっとしか考える時間がありません。 衝突判定は専門外なのでよくわかりません。(ココで言い訳。) >> onClipEvent (enterFrame)内で >> this.gotoAndPlayは無効なのでしょうか? 無効なのではなくて, 理論的に考えると「何故か1コマで停止しているようです。」 となるのは当たり前ですよ。 enterFrame = 1フレーム進む時間ごとに毎回{ }内を実行 なのですから,毎フレーム時間(1/12秒)に1回,"ラベル名"のフレームに行き続けます。 せっかく前に進もうにも,また"ラベル名"のフレームに戻されてしまいます。 だから止まっているように見えるのです。実際は行こうか戻ろうか,困っている状態だと思います。 だから動くMC(以降「親MC」とします)自体には, --------------------------- onClipEvent (enterFrame) { this._x -= 5; } --------------------------- みたいなのでそれ自体の座標を動かしておいて, その親MCの中の1フレームには --------- stop(); --------- と書いておいて止めておいて, 1フレームだけに存在する子MCを親MCの中につくって その,子MCに ----------------------- onClipEvent (enterFrame) { if (_parent._x<=200) { _parent.gotoAndPlay("label1"); } } ---------------------- のようなことを書くのが簡単な回避策だと思います。 「子MC」は「親MC」の1フレームだけにしか存在しない, つまり,2フレーム以降は存在しないので, このenterFrameは2フレーム以降,消えます。
お礼
sasakunさん、本当に毎回スミマセン。 しかもご多忙なようで、こんなつまんない質問に 時間を取らせ申し訳なく思います。 FLASH4での作成方法は理解するに時間がかかりそうです。 今日はめずらしく朝からお客さんのとこにいかなくては ならないので後でじっくり検証したいと思います。 ところで、enterFrameの理屈はなんとなくですが 分かりました。 FLASHに無茶な注文をしていたようです。 (納得できない矛盾もあるような気がしますが FLASHも精一杯頑張ってくれてるんだなと納得) 回避策のスプリクトを参考に後で頑張ろうと思います。 しかし、parentという命令が何者なのかが分かりません。 手引書の索引にも記載されていませんでしたし ヘルプを見ても出てきません (ヘルプの使い方がイマイチなのですが。。。) お手数ですが、parentについて簡略で結構なので どういったものなのかお時間あるときでも 教えて頂ければ幸いです。 あと、それら優れもののスプリクトが説明されている 手引書を紹介していただくことは可能でしょうか? (この掲示板では固有名詞を発するのは禁止?) 色々お手数ばかりかけて申し訳ございません。
お礼
全てにおいて納得しました! (けど、作成の工程で頭の中がこんがらがってきました) 紙に書きながら頑張ります! ありがとうございました。