- ベストアンサー
Flashロールオーバーボタンと画像の変更
Flash ActionScript初心者です。 http://www.asebino.com/ 上記URLのトップページで見るFlashと同じ様なものを作りたいのですが、どうしたら良いのでしょう? ボタン上にカーソルが来るとボタンがロールオーバーし別座標の画像がマスク処理され表示されます、その際、前の画像がデフォルトに戻らず、残ったままその画像の上に重なるように表示するにはどうしたら良いでしょう。 宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#1です。 なるほど。言われてみれば,そうですね。 一番上のボタンを複数回ロールオーバーしても,何も変化が起きませんね。 #1で勝手に作った階層(mainMC.subMc1)で書いた場合は以下の様にするとできると思います。 mainMC.subMC1を動かすボタンには -------------------------------------------- on (rollOver) { if (movie != "1") { shindo += 1; _root.mainMC.subMC1.swapDepths(shindo); _root.mainMC.subMC1.gotoAndPlay(2); } movie = "1"; } -------------------------------------------- mainMC.subMC2動かすボタンには -------------------------------------------- on (rollOver) { if (movie != "2") { shindo += 1; _root.mainMC.subMC2.swapDepths(shindo); _root.mainMC.subMC2.gotoAndPlay(2); } movie = "2"; } -------------------------------------------- わかりますか? 条件で分岐させているのです。上のsubMC1を動かすスクリプトに注釈を入れるなら, -------------------------------------------- //ロールオーバーで on (rollOver) { //もし「movie」という変数に"1"が入ってない場合 if (movie != "1") { //変数「shindo」に1を加える。 shindo += 1; //mainMC.subMC1にはその深度を設定して, _root.mainMC.subMC1.swapDepths(shindo); //mainMC.subMC1を2フレーム目からPlay。 _root.mainMC.subMC1.gotoAndPlay(2); } //無条件に「movie」という変数に"1"という値を与える。 movie = "1"; } ---------------------------------------- という感じです。 movie = "1"; でないかぎり,スクリプトは実行されますが,いったん,movie に "1" が入ると何も実行されません。 これで,mainMC.subMC1 は同じボタンの命令を聞かなくなります。ただ,最終フレームに向かって進むだけ。 mainMC.subMC1 の最終フレームには stop(); を書いて止めてくださいね。ループするので。 こういう勝手に決めた変数と値で,その後の成り行きを変化させることは,Flashに限らずよく使うことです。 ご存じかもしれませんが,一般的には「フラグ(旗)を立てる」と言います。 一般的には, movie = "1"; ではなく, flag = "1"; とか flg = "1"; とか言うように書く場合が多いです。 例えばフラグはExcelの関数やVBAなどではしょっちゅう使います。 それと, なんで5行目が,gotoAndPlay(2);なのかと言うと, subMC1,2,…?までの最初のフレームには stop(); を書いて止めていると思うからです。 #1では,つたない説明でしたが, 深度の設定と,ムービーを動かすところまでは無事にできたのですね。 ちょっと感動しました。
その他の回答 (4)
>> 入子の階層? >>(MC(ムービークリップ)の中にMCという形で)が >> 増えていくと下の階層に当たるマスクの >> ムービークリップは使えないのでしょうか? パスさえ間違えなければできますがね。 普通は,単に動き回るのは,「グラフィックオブジェクト」。 さらに中で動き回るか,オブジェクト自体にActionScriptを書く場合は,「ムービークリップオブジェクト」にしますが, グラフィックにしてもムービークリップにしても, 入れ子状態でも大丈夫です。 うーん,わかりかねます…
お礼
分かりにくい質問でした。反省。 階層がある程度多く重なっていても大丈夫そうですね。 少し自分でも調べてみます。 でも、大分やりたいことは出来ました。回答者様のおかげです。 また自分である程度Flash Actionscriptを理解したところで質問したいと思います。 毎回の質問に対しご丁寧かつ迅速に対応していただきありがとうございました。
#3の訂正です。 すみません。 >> 参考URLの#1さんの回答が参考になるかもしれません。 ↓訂正 参考URLの#2さんの回答が参考になるかもしれません。 です。#1は私でした。#1は参考になりません。
補足
少しずつの質問にお答えしていただきありがとうございます。 マスクは_root.mainMC.subMC1の中にmaskMCとして置いてありますが、これではマスクは見れないのですか? subMC内に作ったマスクは簡単に画像と同サイズのシェイプを上下左右に動かしているのですが、複雑なマスクを掛けたムービーをsubMCの中の一つとして作成したいです。 入子の階層?(MC(ムービークリップ)の中にMCという形で)が増えていくと下の階層に当たるマスクのムービークリップは使えないのでしょうか? 質問が分かりづらいと思いますが、何卒宜しくお願い致します。
#1です。 >> ボタンのロールオーバーした状態を維持するために、 >> 別フレームに反転したボタンを配置して、 >> そのフレームにgotoAndplayで移動させ対処したのですが、 >> Actionscriptでも可能でしょうか? どういう,状態か,勝手に想像した範囲でしか言えませんが… その方法でも良いですね。すると,ボタンの上にボタンが重なるので,元のボタンは効かなくなりますね。 フラグを立てる必要もなくなります。 でも,ActionScriptでも可能かという質問がよく理解できません。 他にも方法はたくさんあると思います。 少なくとも,そのメインムービーに複数フレームを作って,そこにgotoするというのはあまり使わないような気がします。 例えば 「ボタン1」の上のレイヤーに,「反転した?ムービークリップ1」を作っておいて,1フレーム目を空にしてstopさせておく。 その「ボタン1」にロールオーバーしたとき,「反転した?ムービークリップ」をplayさせる。 「ボタン2」にロールオーバーしたときは,,「反転した?ムービークリップ1」をgotoAndStop(1); で止めて置いて,「反転した?ムービークリップ2」ををplayさせる。 こんな感じが普通でしょうかね。 これだと,Actionscriptも使いやすくなります。 1フレーム目を空にして見せないのではなく, _root.hantenMC1._visible = true; //(表示) とか _root.hantenMC1._visible = false; //(非表示) で切り替えることもできますし, _root.hantenMC1._alpha = 100; //(不透明) とか _root.hantenMC1._alpha = 0; //(透明) で,アルファをかけることができます。 基本的に,ActionScriptを使って,他の物の状態を変える場合は同じフレームにオブジェクトが共存していないとできないので(共存していなくてもできますが,少し大変),同フレームにムービークリップを用意しておくのが一般的だと思います。 別に,今されている他のフレームに行く方法でもさしつかえないですよ。 >> それと、ムービークリップ内に >> ムービークリップとして作成したマスクが >> 適応されなかったのですが、 >> これもActionscriptで制御するのでしょうか? マスクは適応されているのですが, ムービークリップの深度を変えることによって,そのマスクよりもムービークリップが上の深度になってしまうためにマスクがマスクではなくなってしまうのです。 最初の例で言うと,_root.mainMC にマスクを置かれてるのではないでしょうか。 マスクは,_root.mainMC.subMC1 内に作ると,深度が共に変化するのでマスクはかかると思います。 または,setMaskを使うことでしょうか? 参考URLの#1さんの回答が参考になるかもしれません。
根本原理は,ムービークリップの深度を変えています。 参考URL↓の2つ目の画像。 クリックするとムービークリップの上下が変わります。 質問者さまが示されているURLの場合は, 各メニューボタンの選択で深度を変えると同時に,そのムービークリップを動かしているのです。 メニューボタンは常に上に表示されていますから, 切り替わるムービークリップより上のレイヤーに配置。 切り替わるそれぞれのムービークリップを全て入れるムービークリップを メニューボタンより下のレイヤーに作ってその中に,各切り替わるムービーを入れる。 □レイヤー2 ・・・|●| ←メニューボタン用レイヤー □レイヤー1 ・・・|●| ←切り替わるオブジェクト用レイヤー ※↓参照 ※ ┌mainMC─┐ │ subMC1 │ │ subMC2 │ │ subMC3 │ │ … … │ └────┘ こんな感じで↑。 メインアニメーションの1フレームのフレームスクリプトとして,例えば, shindo = 0; という変数とその変数に0を入れておいて, 「subMC1」を上に表示させて,なおかつ動かすメニューボタンには ---------------------------------- on (release) { shindo += 1; _root.mainMC.subMC1.swapDepths(shindo); _root.mainMC.subMC1.gotoAndPlay(1); } ---------------------------------- みたいな感じのスクリプトを書いておけば, メニューボタンクリックと同時に,「subMC1」が「mainMC」内で最上深度となって,なおかつ1フレームに戻って中のムービーが再生するスクリプトになります。
お礼
早速のご回答ありがとうございます。 教えていただいた参考URLと方法でがんばってみます。
補足
すいません、また失礼します。 ロールオーバーして画像が変わるところまでできたのですが、同じボタンの上にカーソルを乗せると同様に画像の変更ムービーが流れます、その時、その前の前の画像が下の現れて違和感を感じます。 同じボタンにカーソルが乗ったときには画像が変わらないようにしたいのですが、どうしたらよいのでしょうか? また、ボタン画像も別のボタンを触るまでロールオーバーした状態で維持させたいです。 ようは http://www.asebino.com/ このURLのHPと同等のものを作りたいと解釈して頂ければと思います。 宜しくお願い致します。
補足
前回同様すばやいご回答ありがとうございます。 出来ました!! 大変勉強になりました。 あと少し分からない箇所があります。 ボタンのロールオーバーした状態を維持するために、別フレームに反転したボタンを配置して、そのフレームにgotoAndplayで移動させ対処したのですが、Actionscriptでも可能でしょうか? それと、ムービークリップ内にムービークリップとして作成したマスクが適応されなかったのですが、これもActionscriptで制御するのでしょうか? ちょこちょこと質問してしまってすいません。 どうぞ宜しくお願い致します。