プロが教えるわが家の防犯対策術!

以下2パターンを試してみました。


ボタンシンボルが配置してあるswfファイルを作成(0.swf)し、「sum」というMCに読み込み
loadMovie("0.swf","sum");

結果は、通常状態の表示は問題なく行いましたが、マウスをボタンの上にもってきても反応しませんでした。
(カーソルは変更されるが画像に変化なし)


MCをつくり、そこに
on (rollOver) {
this.gotoAndStop("2");
}
on (rollOut) {
this.gotoAndStop("1");
}

下の階層に、1フレーム目および2フレーム目に通常状態とrollOverの画像を読み込むためのMCを配置。それぞれsum_1、sum_2。

そのMCがあるタイムライン上に
loadMovie("0.jpg","sum.sum_1");
loadMovie("0_on.jpg","sum.sum_2");

要するに箱を作って、画像だけ差し替えられるようにした感じです。

実行すると、1フレーム目は正常に表示されますが、マウスをかざした時に白くなってしまい、マウスを戻しても白いままで最初の画像が戻りません。

loadMovieはこういう動きなのでしょうか。
外部から読み込んでボタンとして動作させたい場合はどのようにすればいいでしょうか。

よろしくお願いします。

A 回答 (2件)

#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");
---------------------------
も普通は無理ですということです。
ボタンにロールオーバーなどでフレーム移動をさせるのでしたら,
「いきなり」ということは普通はないので,大丈夫だと思います。
    • good
    • 0
この回答へのお礼

なるほど、1の場合なぜ失敗したかもよくわかりました。
ご丁寧にありがとうございました。
非常に助かりました。

お礼日時:2006/09/26 09:50

ご質問の内容の,



>> 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 以下でしたら,上記スクリプトは使えません。
    • good
    • 0
この回答へのお礼

どうも細かくありがとうございました。
私の書き方が悪かったのですが、原因は、loadMovieをタイムライン上に記述したために、そのような現象になっていました。
各MC上でイベントが発生したときに読み込むように記述したところ正常に動作しました。

で、ご指摘のとおり、ちらつきも発生し、背面に同じ画像を引くことで回避しました。
どうもありがとうございました。

ところで別件なので新たに質問立ててもいいのですが、1番の別なSWFを読み込む場合ですが、そのSWFファイルのラベルを参照してそのラベル番号に飛ばしたりということはできないのでしょうか。
よろしくお願いします。

お礼日時:2006/09/26 00:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!