- ベストアンサー
FLASHボタンでムービーを再生する方法について質問
- ページAとページBにあるFLASHボタンをクリックすると、開くムービーが再生されます。
- 他のボタンがクリックされた場合、そのページの開くムービーと前のページの閉じるムービーが再生される方法を知りたいです。
- ロールオーバーとロールアウトの応用ではうまく実装できないことが分かりました。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
引用されているURLで回答したらしき者です。 (なぜか,書いた記憶がほとんど残っていない…) ボタンはMC(ムービークリップ)で作って, こんなの↓にするところまでは良いですか。 1 5 レイヤー2 筆・・|●|●|●| レイヤー1 筆・・|● []| 今回の場合, ボタンMC内のフレーム1は,普通の状態の静止画。 ボタンMC内のフレーム2に,開くムービー(MC)を入れる。 ボタンMC内のフレーム3に,閉じるムービー(MC)を入れる。 という状態にします。 そして,他のボタンからこのボタンを操作することが必要になりますから, ボタンMC に インスタンス名をつけます。 ボタンA には 「btnA」,ボタンBには「btnB」,… という具合にインスタンス名を付けていきます。 そして,それぞれのボタンMCに次のようなスクリプトを書けばだいたいできあがりです。 例はボタンA(btnA)に書くスクリプトです。 ------------------------------------- onClipEvent (load) { this.stop(); } on (release) { if (_root.btn_name != "btnA") { this.gotoAndStop(2); _root[_root.btn_name].gotoAndStop(3); _root.btn_name = "btnA"; //---ここに何か動作を書く--- } } ------------------------------------- 2つあるの "btnA" はボタンによって変えてください。 ボタンB の場合は, "btnB" になります。 最初の, onClipEvent (load) { this.stop(); } これでとりあえずボタンMCをフレーム1でストップさせます。 そしてそのボタンがクリック(release)されたとき, if文に入ります。 if (_root.btn_name != "btnA") もし, _root の 変数 btn_name の値が "btnA" でない場合, 続く { } 内を実行します。 this.gotoAndStop(2); これで自分自身のMC内をフレーム2に進めます。 つまり,開くムービーが再生されます。 _root[_root.btn_name].gotoAndStop(3); これで,変数 _root.btn_name のボタンを フレーム3 に進めます。 この _root の 変数 btn_name の値は,その前にクリックされたボタンによって決定されています。 _root.btn_name = "btnA"; これで, _root の 変数 btn_name の値を決定します。 原理はわかりますか? クリックされたとき, _root(メインムービー) に自分の名前を登録するのです。 自分の名前を登録しておくと,次にクリックされたボタンによって, 自分自身は フレーム3 に進むことができます。 最初の状態で,_root.btn_name は何も値が入っていません。 入っていなくても動作することは動作しますが,あまりよろしくないので, メインムービーのタイムラインのフレームには, ------------------------ var btn_name = 0; ------------------------ と,存在しないボタンの名前を最初に登録しておくほうが良いです。 最初に例えばボタンBがクリックされた場合, _root.btn_name != "btnB" の状態ですから,ボタンBのスクリプトは全て実行されます。 つまり,_root の 変数 btn_name の値は,"btnB" になります。 次にまた ボタンB がクリックされても何も起こりませんが, ボタンAがクリックされた場合, _root.btn_name != "btnA" の状態ですから,,ボタンAのスクリプトは全て実行されます。 それと,場合によるのでよくわかりませんが, それぞれの閉じるムービーが再生されたあと,また静止状態の最初のボタンに戻したい場合は, 閉じるムービーの最終フレームに, ------------------------ _parent.gotoAndStop(1); ------------------------ と書いておけば,そのボタンMC内のフレームは フレーム1 に戻ります。 あと気になったのが, >> ページBへのボタンを押したときにはページAの閉じるムービーが再生、 >> ページBの開くムービーが再生されるという ここの部分の時間的関係がよくわかりませんでした, 「Aの閉じるムービーが再生」と「ページBの開くムービーが再生」は同時に起こることなのか, 「Aの閉じるムービーが再生」された後に「ページBの開くムービーが再生」されるのかと言うことです。 上のスクリプトで行くと同時に起こります。 もし 「Aの閉じるムービーが再生」された後に「ページBの開くムービーが再生」される。 という方が良い場合は,if文の中の _root[_root.btn_name].gotoAndStop(3); _root.btn_name = "btnA"; この2行を,閉じるムービーの最最終フレームのタイムラインのスクリプトに持っていってください。 また,スクリプト中の //---ここに何か動作を書く--- には,そのボタンによって発生する本当のイベントスクリプトを書いてください。 例えばムービー全体を gotoAndPlay(10); させたいとするなら, _root.gotoAndPlay(10); のようなことを書いてください。 ボタンMCはボタンシンボルではなく,ムービークリップなので,パスが変わる部分も出てきますので注意してください。
その他の回答 (1)
#1です。 前半に書かれていることは,全然わからない現象ですね。 >> 何故かボタンを押すと前に表示されていたものが残り >> 開くムービーが再生されて重なってしまいました。 前に表示されていたものが残るというのは, 開くムービーと同時(同じフレーム)に前に表示されていたものが存在しているからとしか考えようがありません。 ボタン(MC)の中のタイムラインはこんなのですよ。 最初の静止画↓↓開くムービー(MC) レイヤー2 筆・・|●|●|●| レイヤー1 筆・・|● []| ←無くても良い背景 フレーム2 に進んで最初のボタンの状態が重なるはずはありませんね。 上記のようなタイムラインになっている場合, 下のレイヤー(レイヤー1)は本当は不要で無くても良いのですよ。 ただ,ボタンと違い,MCではヒット領域を確保できないため, 下のレイヤーに透明か,ボタンの下地の色の背景を置いているだけです。 この無くても良いレイヤーに,最初の静止画を持って来ていると重なるという現象は起きます。 しかし, >> 一番はじめの動作だけなので、 なんで,一番はじめだけなのでしょう??? ずっとなら意味がわかりますが,さっぱりわかりません。 あと, >> ページが表示されたときにbtnAの開くムービーを再生したいので 開くムービーが2回も表示されるのですか。 想定外ですね。 想定外ですが,2回動いても,_root.btn_name の値さえ変えなければ特に問題はありません。 しかし, >> _root.btnA.gotoAndPlay(2); これはマズイでしょう。 上に書いたタイムラインのようになっていた場合, _root.btnA.gotoAndStop(2); です。 「開くムービー」をMCにしていた場合そのフレームで止まってくれないといけません。 gotoAndPlay だと,フレーム2 → フレーム3 → フレーム1 → フレーム2 と,ボタン内のアニメーションがクルクル回転してしまいます。 「開くムービー」をMCにせず, 最初の静止画↓ 開くムービー 閉じるムービー レイヤー2 筆・・|●|●-------->[]|●|●-------->[]|●| レイヤー1 筆・・|● []| としているのであれば, _root.btnA.gotoAndPlay(2); でも良いですね。 >> ページが表示されるときに再生されるムービーは >> btnAのムービーと同じもので、 >> btnAボタンを一度クリックするとその他のボタンも正常に動作しますが、 >> btnAボタンをクリックせずbtnBボタンをクリックすると >> btnAは閉じるムービーを実行せず、 >> btnBの開くムービーが重なって表示されてしまいます。 ここだけは理解できました。 そりゃ当たり前です。 スクリプトの "意味" を考えてください。 変数 _root.btn_name に登録しておくから, 他のボタンがクリックされたとき,登録されている名前のボタンが閉じるムービーを再生するのですよ。 最初に var btn_name = 0; としていたら,何も登録されていないので,btnAは閉じるムービーを再生するはずはありません。 だから最初は var btn_name = "btnA"; です。 自由に状況を変えてくださるのは当然良いことですし,状況を変えないと意味もないことですが, スクリプトの文章ではなく,なぜこのときにこのスクリプトが必要なのかを理解して状況を変えないと,ちょっとのアレンジさえできなくなります。 スクリプトはコピペ可ですが, スクリプト自体より,原理を理解してください。
お礼
2度に渡り丁寧な回答ありがとうございます。 無事希望する動作ができるようになり、とても参考になりました。 結果ですが、 var btn_name = "btnA"; と書き換えたところ正常に動作しました。 前回の回答で原理などもわかりやすく説明頂いたので原理も理解することはできましたが、var btn_name = 0;については「0」に意味があるものだと勘違いしていました。(もっと勉強しないとですね) また、 _root.btnA.gotoAndPlay(2); についてですが、btnAのMCには最後にstopをつけていますのでPlayで良いと思っていますがStopの方が正しいのでしょうか? 説明不足や理解不足でsassakunさんには大変ご迷惑おかけしたところもありましたが、ご協力頂いたおかげで無事出来上がりました。 ありがとうございました。
お礼
ありがとうございます。 試してみたのですが、一番はじめの動作がどうもうまくいきません。 何故かボタンを押すと前に表示されていたものが残り開くムービーが再生されて重なってしまいました。 一番はじめの動作だけなので、もしかすると > 最初の状態で,_root.btn_name は何も値が入っていません。 > 入っていなくても動作することは動作しますが,あまりよろしくないので, > メインムービーのタイムラインのフレームには, > ------------------------ > var btn_name = 0; > ------------------------ > と,存在しないボタンの名前を最初に登録しておくほうが良いです。 の部分かな?と勝手に思っていますが、 var btn_name = 0; はこのままコピペしてタイムラインのactionへ入れました。また、ページが表示されたときにbtnAの開くムービーを再生したいので _root.btnA.gotoAndPlay(2); を加えました。これが誤動作する原因でしょうか? ページが表示されるときに再生されるムービーはbtnAのムービーと同じもので、btnAボタンを一度クリックするとその他のボタンも正常に動作しますが、btnAボタンをクリックせずbtnBボタンをクリックするとbtnAは閉じるムービーを実行せず、btnBの開くムービーが重なって表示されてしまいます。 つたない説明で申し訳ないですが、何かおわかりになりましたらどうぞご教授お願いします。