• ベストアンサー

メニューボタンを押されたままの状態にしたいのですが出来ません・・・

FLASH8で、PRCDを作成中です。 この中でメニューボタンをいくつか設けているのですが、 メニュー内の項目ボタンが選択されると、ある画像が表示されるといった仕組みのものを作成しています。 あるメニューボタンが選択され、この画像が表示されている間、どれが選ばれているかが分かるように、ボタンを押されたままの状態(or他のボタンとは異なる表示)にしたいのです。 どのようなscript指示をかければ良いのでしょうか。 どなたか、ご教示願います。

質問者が選んだベストアンサー

  • ベストアンサー
noname#35109
noname#35109
回答No.1

動きのみを簡単に言うと, 複数チェック不可のチェックボックスを用意して, チェックが入っている画像のみを表示させるというようなことですね。 動きはチェクボックスに近いけど, 見かけはチェックボックスではなくボタンであるということでしょう。 方法としては, スクリプトだけでは解決しませんから, ボタンをムービークリップで自作して, そういうしくみ全体を自分でつくることでしょう。 まず, ボタン用のムービークリップを作成します。 ムービークリップ内のタイムラインは,1レイヤー,3フレーム必要です。  □ レイヤー 筆・・|●|●|●| フレーム1 に普通に見えている状態のボタンの絵を用意します。 フレーム2 にロールオーバー状態のボタンの絵を用意します。 フレーム3 に押された状態のボタンの絵を用意します。 これが1つのムービークリップ内の作成で, 仮にボタンが5つ必要であれば,これを5つ作るわけです。 同じ図柄のボタンが5つ必要な場合は, 1つのムービークリップを作成して,それをコピペで5つに増やしてもかまいません。 そして, 各ボタン用ムービークリップにインスタンス名を付けます。 「アルファベット文字列+連番数字」という形のインスタンス名が良いです。 ここではボタンを5つ用意して, 「btnMC0」,「btnMC1」,「btnMC2」,「btnMC3」,「btnMC4」というインスタンス名を付けたとしておきます。 それで, 5つの各ムービークリップに次のようなスクリプトを書けば(コピペすれば),ほとんどできあがりです。 ------------------------------------ // このムービークリップが表示されたとき onClipEvent (load) { // とりあえずストップ this.stop(); // 変数 flag の値を 0 に設定 var flag = 0; } // // ロールオーバー時 on (rollOver) { // もし変数 flag の値が 0 であれば if (flag == 0) { // フレーム2 でストップ this.gotoAndStop(2); } } // // プレス時 on (press) { // フレーム3 でストップ this.gotoAndStop(3); } // ロールアウト時 on (releaseOutside, rollOut) { // もし変数 flag の値が 0 であれば if (flag == 0) { // フレーム1 でストップ this.gotoAndStop(1); } } // // マウスアップ時(クリック時) on (release) { // btnMC0 ~ btnMC4 に対してまとめて命令 for (i=0; i<=4; i++) { // それらの flag を 0 にする _root["btnMC"+i].flag = 0; // そして 各ムービークリップを フレーム1 でストップ _root["btnMC"+i].gotoAndStop(1); } // このムービークリップの flag だけは 1 にする this.flag = 1; // フレーム3 でストップ this.gotoAndStop(3); // // =================================== // ★ ここにある画像を表示させるスクリプトを書く ★ // =================================== } ------------------------------------ 簡単なサンプルでも作ってみて, じっくり考えれば,なぜ上のようなスクリプトになるのかがわかると思います。 ムービークリップは, ボタンインスタンスのように,マウスの動きによって, 勝手にオーバーフレームやダウンフレームには行かないので, 自分でそれらのフレームに行かせるようなスクリプトを考えなければなりません。 しかし, 勝手にマウスの動きによって,オーバーフレームやダウンフレームには行かないので, 逆にボタンではできない自分オリジナルの動きが可能になります。 最近の Flash を使ったサイトでは, このムービークリップで自作するボタンがかなり多くなってきていると思います。 上記の,  // ===================================  // ★ ここにある画像を表示させるスクリプトを書く ★  // =================================== この部分は, ボタンによって 画像を表示させるスクリプト を変えてください。 それ以外は全く同じで行けると思います。 ただし, ムービークリップはボタンインスタンスと違って, 1つの階層を持ちますから,相対パスを使う場合ターゲットパスが変わります。 画像を表示させるスクリプトをどうしていらっしゃるのかわかりませんが, 例えば,画像を表示させるスクリプトが,loadMovie であって, _root(メインムービー)に置いてある「myMC」に外部JPEGを表示させるスクリプトとして, _root にあるボタンインスタンスに次のようにしていたとします。 ---------------------------- on (release) { myMC.loadMovie("aaa.jpg"); } ---------------------------- ボタンインスタンスには階層がありませんから, 上記で,ボタンと同じ階層にある myMC に aaa.jpg がロードできます。 しかし, ムービークリップは1つの階層を持つため上のように書くと, ムービークリップ内の myMC にJPEGをロードしようとします。 でも, ムービークリップ内には myMC は存在しないので,結果何も表示されません。 もし _root にある myMC に aaa.jpg をロードさせたい場合は, 絶対パスで, _root.myMC.loadMovie("aaa.jpg"); と書いてください。 また,相対パスを使う場合は, 自分の親である _root にある myMC に aaa.jpg をロードするのですから, this._parent.myMC.loadMovie("aaa.jpg"); のようになります。 実際には loadMovie なのか何なのかはよくわかりませんが, 何であっても同様に ターゲットパス には注意してください。 絶対パスで書かれている場合は, ボタンもムービークリップも同じですから,普通はそのままで大丈夫だと思います。

sakurakiku
質問者

補足

分かりやすい回答有難うございました! sassakunさんの教えていただいた通りに作成したら出来ました! が、この出来上がったswfを、さらに他のswfに組み込む(loadMovieで)と 正しく表示されないのは何故でしょうか? 組み込んじゃダメなんですかね?? 始めに表示される画面は問題ないのですが、 あるボタンを選択して、他のボタンが選択されても (3フレーム目)のまま解除(1フレーム目に戻らない) されないんです。 表示させたい画面は問題なく表示されてはいるんですけど。 もう少し、お力をお貸し下さい、お願いします。

その他の回答 (1)

noname#35109
noname#35109
回答No.2

#1です。 > 他のswfに組み込む(loadMovieで)と > 正しく表示されないのは何故でしょうか? _root が変わるからです。 #1の状態,つまり,単独のSWFの場合, _root はそのSWFのメインムービーのタイムラインを指しますが, 他 SWF に読み込まれた場合, その SWF のメインムービーのタイムラインが _root になるからです。 対処法は2つあります。 1つは, _root をその SWF 内に固定する(ロックする)スクリプトを使います, #1で作成したムービーのフレーム1の最初の行に, ------------------------------------ // _root の階層を この階層にロックする this._lockroot = true; ------------------------------------ と書いてください。 これで解決すると思います。 ただし, Flash Player 7 以上にパブリッシュする必要があります。 もう1つは, #1のスクリプトの _root という文字列をすべて, _parent に置換してください。 おそらくこの方法でもうまく行くのではないかと思います。 上に書いた, this._lockroot = true; を使う方が簡単で無難にうまく行くとは思います。

sakurakiku
質問者

お礼

ありがとうございました!出来ました! 丁寧で迅速な回答、大変助かりました!

関連するQ&A