- ベストアンサー
外部の画像、もしくはswfを読み込んでボタンをつくりたい
- 外部の画像やswfファイルを読み込んでボタンを作成する方法について試してみましたが、いくつか問題が発生しました。
- swfファイルを読み込む方法では、通常状態の表示はできましたが、マウスをボタンの上に持っていっても反応しませんでした。
- 画像を差し替える方法でも問題があり、マウスをかざした時に白くなってしまい、元の画像に戻らないという現象が発生しました。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ご質問の内容の, >> 1 ボタンシンボルが配置してある… に関しては,普通そんなことはあまりしないので, 省略させていただきます。 >> 2 MCをつくり、そこに… を読ませていただいた感じですが, >> 実行すると、1フレーム目は正常に表示されますが、 これが,最も怪現象です。 loadMovie("0.jpg","sum.sum_1"); では読み込まれるはずがないと思います…(おそらく)。 おそらく,別の場所に同じスクリプトが書いてあるから。 「実行すると、1フレーム目は正常に表示される」 という, 全く正常ではない, 怪現象が起こるのではないでしょうか。 ご質問を読む限り, 各ムービークリップの階層構造は次のようになっています。 _root(メインムービーのタイムライン) └ sum (親ムービークリップ) ├ sum_1 (子ムービークリップ) └ sum_2 (子ムービークリップ) sum (親ムービークリップ) のタイムラインに, loadMovie("0.jpg","sum.sum_1"); を書かれたのでしたら, 『sum (親ムービークリップ) の中の sum というムービークリップの中に, sum_1 というムービークリップがるから, そこに "0.jpg" をロードしなさい。』 という意味になりますよ。 説明を見る限りでは sum の中に sum などありません。 ですから,こう↓ 『sum (親ムービークリップ) の中に sum_1 というムービークリップがるから, そこに "0.jpg" をロードしなさい。』 ↓ ↓ ↓ loadMovie("0.jpg","sum_1"); もしくは loadMovie("0.jpg","_root.sum.sum_1"); でないとおかしいです。 というわけで,成功例サンプルです。 一応次の通りで正常に動作しました。 ムービークリップ sum に書くスクリプト ------------------------------ on (rollOver) { this.gotoAndStop(2); } on (rollOut) { this.gotoAndStop(1); } ------------------------------ ムービークリップ sum 内タイムラインの フレーム1に書くスクリプト ------------------------------ stop(); loadMovie("0.jpg", "sum_1"); ------------------------------ ムービークリップ sum 内タイムラインの フレーム1に書くスクリプト ------------------------------ loadMovie("0_on.jpg", "sum_2"); ------------------------------ ただし, ムービークリップ sum にロールオーバーした瞬間, loadMovie("0_on.jpg", "sum_2"); が実行されますが, 読み込まれるまでの 0.0? 秒間ボタンが空白の間が空きます。 空白である間があると,その間は ロールアウト 状態になり, loadMovie("0.jpg", "sum_1"); を実行しようとするので ピクピク と動作が不安定になります。 ですから, ムービークリップ sum のレイヤーは3レイヤー以上にして, JPEG が読み込まれていない瞬間も, ロールオーバー になるように,JPEG より下のレイヤーを, 透明な塗りなどで塗りつぶしておく必要はありそうです。 □ レイヤー 筆・・|○|○| ←スクリプト □ レイヤー 筆・・|●|●| ←sum_1,sum_2 □ レイヤー 筆・・|●/ []| ←(透明な)塗り このムービークリップ sum の最下レイヤーの塗りは, ボタンの ヒット に当たる部分の役目になります。 ============================== しかし, 私は面倒くさがり屋で, ムービークリップ 内を複雑にするのはいやですから, 同じ方法を使う場合,私であれば次のようにすると思います。 まず,ムービークリップ sum 内のライムライン □ レイヤー 筆・・|●| ←sum_1 □ レイヤー 筆・・|●| ←(透明な)塗り このタイムラインのフレームにはスクリプトを書きません。 sum 内に用意するのはムービークリップ sum_1 のみです。 そして,ムービークリップ sum 自体には, 次のようなスクリプトを書きます。 ------------------------------ onClipEvent (load) { loadMovie("0.jpg", "sum_1"); } on (rollOver) { loadMovie("0_on.jpg", "sum_1"); } on (rollOut) { loadMovie("0.jpg", "sum_1"); } ------------------------------ 非常に簡単です。 =============================== さらにしかし, どうも,上のままでは, 読み込まれるまでの一瞬の空白時間のチラツキが気になって仕方ありません。 ですから,ちょっと改良して次のようにすると思います。 まず,ムービークリップ sum 内のライムライン □ レイヤー 筆・・|●| ←sum_1 □ レイヤー 筆・・|●| ←sum_2 (□ レイヤー 筆・・|●| ←塗り (おそらく不要) ) そして,ムービークリップ sum 自体には, 次のようなスクリプトを書きます。 ------------------------------ onClipEvent (load) { // まとめてロード loadMovie("0.jpg", "sum_1"); loadMovie("0_on.jpg", "sum_2"); // sum_2 を非表示にする this.sum_2._visible = false; } on (rollOver) { // sum_1 を非表示にし sum_2 を表示にする this.sum_1._visible = false; this.sum_2._visible = true; } on (rollOut) { // sum_1 を表示にし sum_2 を非表示にする this.sum_1._visible = true; this.sum_2._visible = false; } ------------------------------ あらかじめ画像は2つとも読み込んでおいて, 表示・非表示を切り換えるだけなので, 不安定なチラツキはなくなります。 === 補足 ======================== もし 0_on.jpg などが,プログレッシブJPEGでしたら, スクリプトの問題ではなく,元からFlash Player 7 以下ではロードできません。 ご使用の Flash のバージョンが Flash MX 2004 以下でしたら, プログレッシブJPEGは使用せず,普通のJPEGにしてください。 それと,環境。 質問者さまが書かれているスクリプトも, 私が書いたスクリプトも Flash MX 以降,Flash Player 6 以上で動作します。 質問者さまが Flash 5 以下をご使用だと言うことは考えられませんが, もし Flash 5 以下でしたら,上記スクリプトは使えません。
その他の回答 (1)
#1です。 補足で, >>1 ボタンシンボルが配置してあるswfファイルを作成(0.swf)し、 について書かれていらっしゃるので, あらためて読ませていただきましたら,私が読み違いをしていることに気づきました。 すみません。 メインのムービーの方にボタンを作って, そのボタンの中にムービークリップを入れて, そのボタンの中のムービークリップ内に 0.swf をロードするのかと勘違いしていました。 ボタンの入れ子はできませんし, ボタン内のフレームにスクリプトを書くこともできませんから, #1で,「普通そんなことはあまりしないので」と書いた次第です。 良く読むと違っていますね。 ボタンは外部ファイルである 0.swf の方にあるのですね。 それなら,普通そんなことはよくします。 >> そのSWFファイルのラベルを参照してそのラベル番号に >> 飛ばしたりということはできないのでしょうか。 普通にできますよ。 ただし,ロードしきれていないフレームにいきなりジャンプさせようとすると, Flash が真っ白になって停止していまいますから, その点は気を付けなければなりませんが, それは loadMovie に限らず, 普通の単独の SWF でも同じですから, 注意する点は同じです。 「外部SWFファイルのラベルを参照してそのラベル番号に飛ばす」ということは, 「ロードされたSWFのラベルを参照してそのラベル番号に飛ばす」ということです。 「ロードされたSWF」は,ロードしたムービークリップそのものですから,結局, 「ロードしたムービークリップのラベルを参照してそのラベル番号に飛ばす」ということになります。 外部 0.swf には, 「name1」と「name2」というフレームラベルがあったとします。 #1 で回答したように, 本体 SWF の階層は次のようになっているとします。 _root(メインムービーのタイムライン) └ sum (親ムービークリップ) └ sum_1 (子ムービークリップ) ムービークリップ sum 内のライムラインは次のようにしておきます。 □ レイヤー 筆・・|●| ←sum_1 □ レイヤー 筆・・|●| ←(透明な)塗り そして,ムービークリップ sum 自体には, 次のようなスクリプトを書きます。 ------------------------------------------ onClipEvent (load) { loadMovie("0.swf", "sum_1"); } on (rollOver) { // sum_1 にロードされたSWFを ラベル name2 へ進ませる this.sum_1.gotoAndStop("name2"); } on (rollOut) { // sum_1 にロードされたSWFを ラベル name1 へ戻す this.sum_1.gotoAndStop("name1"); } ------------------------------------------ これで, name1 ⇔ name2 を行き来します。 0.swf の最初のフレーム(一応 フレームラベル name1 のつもり)には, stop(); を書いて,読み込まれたときストップするようにして置いた方が良いと思います。 最初に書いた, 「ロードしきれていないフレームにいきなりジャンプさせよ うとすると,Flash が真っ白になって停止していまいますから」 はどういうことかというと, ------------------------------------------ onClipEvent (load) { loadMovie("0.swf", "sum_1"); // sum_1 にロードされたSWFを ラベル name2 へ進ませる this.sum_1.gotoAndStop("name2"); } ------------------------------------------ のように,ロードもされていない 0.swf をいきなり, 先のフレームラベルにジャンプさせることは不可能です。 また 0.swf の最初のフレームにいきなり, --------------------------- gotoAndStop("name2"); --------------------------- も普通は無理ですということです。 ボタンにロールオーバーなどでフレーム移動をさせるのでしたら, 「いきなり」ということは普通はないので,大丈夫だと思います。
お礼
なるほど、1の場合なぜ失敗したかもよくわかりました。 ご丁寧にありがとうございました。 非常に助かりました。
お礼
どうも細かくありがとうございました。 私の書き方が悪かったのですが、原因は、loadMovieをタイムライン上に記述したために、そのような現象になっていました。 各MC上でイベントが発生したときに読み込むように記述したところ正常に動作しました。 で、ご指摘のとおり、ちらつきも発生し、背面に同じ画像を引くことで回避しました。 どうもありがとうございました。 ところで別件なので新たに質問立ててもいいのですが、1番の別なSWFを読み込む場合ですが、そのSWFファイルのラベルを参照してそのラベル番号に飛ばしたりということはできないのでしょうか。 よろしくお願いします。