- ベストアンサー
外部swfファイルの閉じ方
メインに"stage2というmcを配置し、123.swfを読み込むボタンを配置しました。 ボタンスクリプト: on (release) { _root.construction(); loadMovie("123.swf", "_root.stage"); _root.stage.swapDepths(5); for (i=1; i<=4; i++) { _root["m_"+i]._visible = false; } 開いた外部swfファイルを閉じる設定をしたいのですが、どのようにすればよいでしょうか。 よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
前回のご質問に回答した者です。 _root.construction(); など意味不明な物をごちゃごちゃ書いても, 誰も理解できないだけです。 また, 質問の本文の 「メインに"stage2というmcを配置し、」と スクリプトの loadMovie("123.swf", "_root.stage"); が一致していません。 (この謎はしばらく考えて解けました。「"」 と 「2」 は同じキーですね。) 大きなお世話かと思いますが… ~~~ 質問の書き方例 ~~~ メインムービー _root のステージ上に "stage" というインスタンス名のムービークリップを配置し, ムービーに配置した別のボタンに次のようなスクリプトを書き,"stage" に外部swfファイルをロードさせました。 on (release) { loadMovie("123.swf", "_root.stage"); _root.stage.swapDepths(5); } ロードさせることはできたのですが,ロードされたswfファイルの閉じ方がわかりません。 どのようにしたら,閉じることができるのでしょうか。 Flashムービーの作成には Flash MX を使用しています。 ~~~~~~~~~~~~~~~ 私は前回のご質問に回答したので, http://oshiete1.goo.ne.jp/kotaeru.php3?q=2021966 http://okwave.jp/kotaeru.php3?q=2021966 質問の書き方例ように書かなくても, 今回のご質問で意味はわかりますが, 普通は少なくとも上のように書いてもらわないと答えようがありません。 しかし,上のように書いたとしても 『何をしたときに』 閉じたいのかがまだわかりませんね。 わかりませんが,普通は unloadMovie("_root.stage"); で良いのではないでしょうか。 『"sutage" に読み込まれたムービーより上に表示させたボタン(MC)をクリックしたとき』に 開いた外部swfファイルを unload したいのでしたら、 _root のタイムラインのステージ上に 「閉じる」を書いた "ムービークリップ" を用意し, インスタンス名を適当に,close_btn などとしておき, そこに, ------------------------------ on (release) { unloadMovie("_root.stage"); this.swapDepths(-1); for (i=1; i<=4; i++) { _root["m_"+i]._visible = true; } } ------------------------------ と書いても良いと思います。 この close_btn は,"stage" より全面(上の深度)に出ておく必要がありますから, ロードするボタンスクリプトは ---------------------------- on (release) { _root.construction(); loadMovie("123.swf", "_root.stage"); _root.stage.swapDepths(5); //↓ココを追加 _root.close_btn.swapDepths(6); for (i=1; i<=4; i++) { _root["m_"+i]._visible = false; } } ---------------------------- となるでしょう。 また,上のようにはせず, 読み込まれた、「123.swf」の中に「閉じる」ボタンを作った場合、 そのボタンには ------------------------------ on (release) { for (i=1; i<=4; i++) { _root["m_"+i]._visible = true; } unloadMovie("_root.stage"); } ------------------------------ と書いても良いですし、 MovieClip._lockroot = true; などを使って、 親ムービーへの _root へのパスを無効にされている場合は、相対パスで ------------------------------ on (release) { for (i=1; i<=4; i++) { _root["m_"+i]._visible = true; } unloadMovie(this); } ------------------------------ でも良いと思います。 ====== しかし ======================== 確か,前回のご質問だと, "stage" には最初背景画像を入れてあるのですよね。 その場合,上のように unloadMovie(); すると, 確かに,ロードされたものは消えますが, 元の背景が戻ってくるわけではありません。 もし,元の背景に戻したい場合……・・・ どうするのでしょうか? どうすれば良いかは, 作者の意図や作っている物の状況にもよりますから一概に言えませんが, 「元の背景は元の背景。」「読み込むswfは読み込むswf。」 別々にした方が良いのではないでしょうか。 --- 手抜きな方法1 -------------- まず,今現在背景として利用している "stage" というムービークリップのあるレイヤーの上にさらにレイヤーを追加します。 そして "stage" というムービークリップのインスタンス名を消すか別の名前にします。 そしてその "元stage" を選択→「編集」→「コピー」その状態で, 新規で追加したレイヤーを選択し, 「編集」→「同じ位置にペースト」で新規で追加したレイヤーに "元stage" をコピーします。 そしてその上レイヤーにコピーされた "元stage" のインスタンス名を "stage" に戻します。 その "stage" を選択した状態で下のプロパティパネルの右の方にある, カラー:[なし ▼] となっている部分を カラー:[アルファ ▼] [0% ]▼ のようにします。 これで透明なインスタンス名 "stage" というムービークリップができますから,ここに "123.swf" などをロードしても良いですね。 すると,unloadMovie(); した場合も,"元stage" が再表示されます。 -------------------------------- 「元の背景は元の背景。」「読み込むswfは読み込むswf。」 次は別々にしない場合の方法例です。 --- 手抜きな方法2 ------------------ "stage" というムービークリップを,新規ドキュメントにコピーし, その "stage" を外部swfとして,例えば「stage.swf」というファイル名で用意しておきます。 そして,「123.swf」が読み込まれたあと,それを消したい場合は,unloadMovie(); をするのではなく, __root のタイムラインのステージ上に 「閉じる」を書いた "ムービークリップ" を用意して, そこに, --------------------------- on (release) { loadMovie("stage.swf","_root.stage"); _root.stage.swapDepths(0); this.swapDepths(-1); for (i=1; i<=4; i++) { _root["m_"+i]._visible = true; } } --------------------------- と書いておけば, _root の "stage" がクリックされたとき,「stage.swf」がロードされ,深度 0 に移動しますから, また背景に戻ります。 ---------------------------------- この辺はスクリプトとかそういうものの問題ではなく, 実物を目の前にして, 「どのように表示させたいか。また,どのようなしくみにすれば良いか。」 というものを実際にごちゃごちゃしながら考えるしかないと思います。 ========================================= 最初に戻りますが,スクリプト上の話だと, ロードしたものを消す場合は unloadMovie(); です。 または, _root.stage._visible = false; でも消えます。 何でしたら,"stage"の深度は 0 以上ですから 前回紹介した http://hakuhin.hp.infoseek.co.jp/main/as/z.html#Z_01 にも書いていますとおり, _root.stage.removeMovieClip(); でも消えます。 また,ロードしたものを違う物に変えたいときは loadMovie(); です。 あとは,それをどう使うかは検討してみてください。 上に書いたことを理解するより,loadMovie(); と unloadMovie(); で, 実際に考えてみるほうが早いと思いますし,考える技量も上がると思います。
補足
説明不足、大変失礼致しました。以後気をつけます。 教えいただいた回答の最初にあった「unloadMovie」でやってみました。 「information」mcでうまく外部swfがそれぞれ閉じるのですが、「home」でシーン1へ戻ると、シーン2の4つのmcのみ残ってしまいます。 さらにシーン2へ行くと、4つのmcが重複して表示されてしまいます。 深度の問題でしょうか? homeへ戻った時に、4つのmcが表示されない方法を教えてください。 よろしくお願いいたします。