- ベストアンサー
外部swfとして読み込ませると動かなくなる
下記のようなスクリプトを記したインスタンスをステージに配置し、stop();で止めてあるMC1を同じくステージに配置。 on (release) { _root.MC1.play(); } このままだと問題なく動いてくれるのですが、このswfファイルを別のswf(load.swf)から読み込むとうまく動いてくれません。 なんとなく_rootのあたりに問題があるのかな?と思うのですが、いまいちどう対処してよいものかわかりません。 解決する方法や代案をご存知の方がおられましたら、どうかご教示をよろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>なんとなく_rootのあたりに問題があるのかな?と思うのですが たぶんそうでしょうね。 ロードされる swf が 別のswf(load.swf) にロードされたとき, _root が その別のswf(load.swf)の _root を指すようになるために動かなくなったのだと思います。 > 下記のようなスクリプトを記したインスタンスをステージに配置し _root ├ スクリプトを記したインスタンス └ MC1 ということでしょうか? もしそうであって, スクリプトを記したインスタンスがボタンインスタンスであれば, on (release) { this.MC1.play(); } もしくは this を省略して on (release) { MC1.play(); } スクリプトを記したインスタンスがムービークリップインスタンスであれば, on (release) { this._parent.MC1.play(); } もしくは this を省略して on (release) { this._parent.MC1.play(); } と書けば大丈夫だと思います。 このように全て相対パスで書くのが一般的な対処法です。 「ターゲットパス」 http://homepage3.nifty.com/ginga-b/MX/targetpath.html また, Flashのアクションパネルの上側(スクリプトを書く部分のすぐ上の鴨居の部分)には, ○ に + を組み合わせた形のアイコン(田←これのフチが丸いボタン)があると思いますが, それが「ターゲットパスの挿入」ボタンです。 on (release) { play(); } ここまで書いておいて, play の前側にカーソルを置いて, on (release) { |play(); } 「ターゲットパスの挿入」ボタンを押すと,色々なインスタンスが出てくると思いますから, 「相対パス」にチェックを入れて MC1 を選択すると,自動的に, on (release) { this.MC1.play(); } などと記入されると思います。 いつもこのターゲットパスの挿入ボタンが使えるわけではありませんが, このボタンを使えた場合,使うのも1つの方法です。 ====================== なお, Flash MX 2004 (FlashPlayer7)以降は, ムービークリップに _lockroot プロパティが追加されました。 Google検索「_lockroot」 http://www.google.co.jp/search?hl=ja&q=_lockroot&lr= FlashPlayer7 以降用の SWF をパブリッシュする場合は, ロードされるSWFの_rootのフレーム1の最初などに, this._lockroot = true;. と書いておくと, その SWF が他の SWF からロードされたときも, 別のswf(load.swf) に _root が移動せずにその SWF 内でロックされるので, on (release) { _root.MC1.play(); } のままでも大丈夫になります。
その他の回答 (2)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#2です。 ぜんぜん 変更 になっていませんでした。 #2 で書きたかったのは, --------------------------------- > var se01:Sound = new Sound(); ↓変更↓ var se01:Sound = new Sound(this); でうまく行くのではないかと思いますが。 --------------------------------- です。
お礼
おおおおお!できました! 度重なる返信を頂き本当にありがとうございました。 四苦八苦していたため助かりました。 改めてありがとうございました。
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#1です。 > 実際は下記のようにクリックした際に音を鳴らすようになっているのですが、 > 音が鳴らないようになりました。 その現象は聞いたことがあります。 結局リンケージで共有する部分が難しいのです。 ロード元(親)SWF に ロード先(子)SWF のムービークリップを, attachMovie できないとか,その辺のことと絡んでいます。 > var se01:Sound = new Sound(); ↓変更↓ var se01:Sound = new Sound(); でうまく行くのではないかと思いますが。 「FN0402003 - Sound.attachSound()メソッド - Flash テクニカルノート」 http://www.fumiononaka.com/TechNotes/Flash/FN0402003.html > [*2] サウンドにリンケージを設定した外部SWFムービーを > MovieClip.loadMovie()メソッドで読込む場合には、 > Soundオブジェクトを作成する際(コンストラクタnew Sound())の > 引数として、外部SWFをロードするターゲットのMovieClipインスタンスが > 渡されなければなりません。 > // フレームアクション > my_sound = new Sound(this); > my_sound.attachSound("mySound"); > my_sound.start();
お礼
おかげさまでthis._parent.を2行目の頭に加えることで動くようになりました。助かりました。 詳しく教えていただいてとても勉強になりました。 実際は下記のようにクリックした際に音を鳴らすようになっているのですが、音が鳴らないようになりました。 教えて頂いたthis._lockroot = true;を使用してみたりse001の手前に_parent.を付け加えてみたりしたのですが、やっぱり鳴らない。 ライブラリにある音は相対パスのような感じで指定できますでしょうか? あつかましいのですがよろしければどうかよろしくお願いいたします。 on (release) { this._parent.MC1.play(); var se01:Sound = new Sound(); se01.attachSound("click"); se01.start(); //ライブラリ内のclick.mp3のリンゲージをclickに指定済み }