• 締切済み

他のswfファイルのMcを表示するには?

まるっきりの素人なので、どう質問してよいかわかりませんが、やりたいことは 下記の通りです。 a.swfで、ある条件によって、a.swfの中のあるxxxMcを、this.play();というかたちで実行しています。 このxxxMcを、b.swfにも作成し、上記の条件でb.swfのxxxMcを表示するようにしたいのですがどうやったら良いのかわかりません。 (a.swfで表示しているxxxMcが、b.swfの下に入り込んでいて、xxxMcの一部が表示されないため、xxxMcをb.swfに持っていって表示させようとしております)

みんなの回答

  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

a.swf にあるムービークリップを b.swf でも利用し、a.swf から b.swf のムービークリップを制御することは、Flash MX 以降をお使いであれば、一応、可能です。 ただし、相当ややこしい話になりますので、そのつもりで聞いてください。 まず、a.swf と b.swf でシンボルを共有する方法ですが。 Flash には共有シンボルという考え方があります。 これは文字通り、複数の swf ファイルで1つのシンボルを共有するというもので、主に、複数の人間で1つの作品を作る時などに利用されます。 共有しているシンボルは、オリジナルを変更した時に、それを利用している側のシンボルも自動的に更新されるように設定することもできます。 今回の例では、a.swf にある xxxMc を共有し、b.swf でも利用可能にします。 a.swf はシンボルを使わせてあげる方なので”共有用に書き出し”、b.swf は a.swf のシンボルを見せてもらうのですから”共有シンボルを読み込み”ができるように、シンボルを設定します。 シンボルを共有できるようにするには、「リンケージ」という機能を使います。 a.swf の編集用のファイルである a.fla の「ライブラリ」パネルで xxxMc シンボルを選択した状態で右クリック( Mac では control +クリック)でメニューを出し、「リンケージ...」を選択してください。「リンケージ設定」パネルが開きます。 この中の、「ランタイム用に書き出し」と「最初のフレームに書き出し」にチェックを入れ、「識別子」に何か名前を入力してください。日本語やスペースが含まれているとトラブルの原因になりやすいので、半角の英数字と数字・アンダーバーだけで付けるといいでしょう。 「識別子」は、シンボルを共有する際に必要となる名前です。 「ランタイム用に書き出し」を選んだ時は、このシンボルが存在する URL を入力しなければなりません。 このシンボルを他の swf ファイルが参照する時、このアドレスを元にして参照するためです。 http:// から始まるアドレスを書いてもいいのですが、a.swf と b.swf を同じフォルダに置くのなら、単純に” a.swf ”で構いません。 これで、xxxMc を他の swf ファイルでも利用できるようになります。 なお、xxxMc シンボルに音声やビットマップ系画像が含まれていると、「最初のフレームに書き出し」を選ぶとフレーム1が極端に肥大し、ロード画面を作っている場合はアニメがなかなか始まらなくなります。 今回はとりあえず、この件については割愛させていただきますが、このような状況の場合はシンボルを別のフレームに書き出す工夫も必要です。 b.swf でも、a.swf が持っている xxxMc を借りられるように、同様にリンケージを設定します。 b.swf の編集用ファイルである b.fla を、a.fla と同時に開いてください。 a と b の「ライブラリ」パネルを両方表示した状態で、a.fla の「ライブラリ」パネルから xxxMc シンボルを、b.fla の「ライブラリ」パネルにドラッグします。 a.fla を編集中の時、b.fla の「ライブラリ」はグレー表示になっていて編集できないようになっていますが、ドラッグによるシンボルのコピーは可能です。 これで b.fla にも xxxMc シンボルが作られ、普通のシンボルと同様に利用できるようになります。 「リンケージ」を設定したシンボルは単純なコピーとは違い、更新すると、それを利用している側のシンボルも同期して変更を反映させることができます。 b.fla の「ライブラリ」パネルで xxxMc シンボルを選択し、右クリック→「プロパティ」を選択してください。「プロパティ」パネルが開きます。 「詳細」( Flash MX では「高度な設定」)ボタンを押すとパネルが広がり、タイプ等の下にリンケージの設定も表示されます。 一番下の「ソース」の項目にある「パブリッシュ前に常に更新」にチェックを入れ、「ファイル」の項目にある「参照」ボタンを押して、ソースファイルに a.fla を設定しておくと、パブリッシュの前にシンボルが必ず更新されるようになります。 なお、a.fla で xxxMc シンボルを更新して保存しただけでは、b.fla 上でのシンボルは更新されますが、肝心の b.swf のシンボルは古いままです。 共有シンボルは、あくまでも swf ファイルに書かれたライブラリにあるシンボルを共有します。 a.fla の xxxMc を更新した時は、「パブリッシュ」または「ムービープレビュー」を実行して、更新された状態の a.swf を作成してください。 --------------------------------------------------------- リンケージを設定すると、attachMovie というスクリプトでシンボルを動的に挿入できるようになりますが、ここではとりあえず、b.swf のステージに最初から xxxMc を配置しておくものとします。 a.swf である条件が成立するまで b.swf の xxxMc は見えてはならないようなら、b.swf の xxxMc に (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります)  //最初は非表示にする  onClipEvent(load)  {   this._visible = false;  } というスクリプトを設定して、非表示にしておきましょう。 Flash Player 6 (作成ツールは Flash MX )から登場した LocalConnection という機能を使うと、swf ファイル間で情報を通信することができます。 これを利用して、a.swf である条件が成立した時に b.swf に指令を送ります。 a.swf から b.swf にあるムービークリップを直接制御することはできませんが、b.swf で指令を受信した時に xxxMc を稼動させるようにすることで、a.swf から擬似的に b.swf にあるムービークリップを制御できます。 LocalConnection は2つの swf 間で情報を送受信する機能です。 この接続を担当する、専用の LocalConnection というクラス( Flash MX ではオブジェクト)があります。 LocalConnection は、a と b のそれぞれに1つずつ、通信を担当する LocalConnection クラスのオブジェクトを用意しておきます。 仮に、a.swf にある xxxMc のインスタンス名を” clip_a ”、b.swf にある xxxMc のインスタンス名を” clip_b ”とします。 ( xxxMc は共有シンボルで、実体は a.swf にあります) a.swf では、ある条件が成立した時に clip_a を動かすと同時に、b.swf にアニメ開始の指令を出します。 a.swf の条件がよく分からないので条件式までは書けませんが、次のようなイメージのスクリプトになります。  if( /*ここに、clip_aを動かす条件を書く*/ )  {   //clip_aを動かす   clip_a.play();   /* b.swfに指令を出す*/   //オブジェクトを作成   send_lc = new LocalConnection();   //アニメ開始指令を送信   send_lc.send( "receive" , "anime_start" );  } b.swf では、a.swf から情報を受け取る準備をします。 スクリプトは次のようになります。 このスクリプトはフレームに設定してください。  //オブジェクトを作成  receive_lc = new LocalConnection();  //メソッドを用意  receive_lc.anime_start = function()  {   //clip_bを表示して動かす   clip_b._visible = true;   clip_b.play();  };  //接続名を付け、受信可能にする  receive_lc.connect( "receive" ); LocalConnection で情報を送受信するには、接続名とメソッドという2つの情報が必要です。 接続名は通信する相手を識別する名前のことです。 上記の a.swf に書いたスクリプトでは、” receive ”という接続名を持っている LocalConnection オブジェクトに対し、情報を送信します。 接続名は、LocalConnection にある connect メソッドで定義します。 メソッドは、接続した相手が持っている様々な仕事(メソッド)の中の、どれを実行するのかという指示です。 例えば、接続した相手が anime_start と anime_stop という2つのメソッドを持っていた場合、単に相手とつながっただけでは、受信側は何をしたらいいのか分かりません。 そこで、相手に情報を送る時は、何の仕事をしてほしいのか、送った情報をどのメソッドで活用してほしいのかという情報も必要になるのです。 上記の例ですと、受信する b.swf の LocalConnection オブジェクトには、clip_b を動かすための anime_start というメソッドが定義されています。送信側である a.swf からはこのメソッドを呼び出すことで、任意のタイミングで clip_b のアニメを実行できるようにします。 a.swf と b.swf を同時に立ち上げ、動作を確認してみてください。 LocalConnection は Flash Player で実行されている swf 同士でさえあれば通信が可能で、スタンドアロンプレイヤーで再生されているムービー同士でも、スタンドアロンプレイヤーで再生されているムービーと HTML ページ内に組み込まれていてブラウザで再生されているムービーとでも通信できます。 今回は a.swf である条件が成立した時に b.swf の clip_b を動かせばいいだけのことですから、a.swf からは他の情報を送る必要はありません。単純に、clip_b を動かすメソッドを a.swf から呼び出せればいいだけです。 LocalConnection では、他の情報をパラメータとして送り、それをもとに何かをさせることもできます。 例えば、a.swf 側の clip_a が回転した時に、この角度を送信して clip_b も同様に回転させるといったことも可能です。 ・・・とまあ、このようなことをすれば、a.swf と b.swf でシンボルを共有し、a.swf から b.swf にあるムービークリップの制御することも、一応は可能ではあるのですが。 a.swf と b.swf を本当に分けなければならないのか、どうしても違うムービー同士で情報を送受信してまで同期を取らなければならないのかなど、もう少し構造を整理してみてはいかがでしょうか。 2つに分けずに済むのなら、同じムービー内に並んだムービークリップの制御になるので、こんな複雑なことをせずに済みますし、fla ファイルも1つにまとまって編集も簡単です。

すると、全ての回答が全文表示されます。
noname#35109
noname#35109
回答No.1

例えば, --------------------------------- a.swf には「空(背景)」と「家(xxxMc)」があって,"朝日が昇る" という条件によって「家」の窓が開く。 b.swf には「木」がある。 b.swf の「木」の後(下のレイヤー)に a.swf をロードすると,「家」が「木」に隠れる。 b.swf の「木」の前(上のレイヤー)に a.swf をロードすると,「木」が「空」に隠れる。 困った・・・  a.swf を 「木」の後にロードして,「家」 だけを「木」の前に持ってきたい。 --------------------------------- というような感じなのでしょうか? attachMovie や,duplicateMovieClip を考えてみましたがどうも無理そうです。 attachMovie はSWF内のリンケージで設定されたシンボルにしか通用せず, duplicateMovieClip は階層をまたいでシンボルをコピーできない。 ようです(たぶん)。 念のため他の方の回答を待った方が良いかもしれませんが。 しかし, 『仮にできたとしても,a.swf の "ある条件" によって,"b.swf 内の" xxxMc もしくは xxxMc の分身を操作しないといけません。』  ↑ここ重要。 それなら,最初から xxxMc を b.swf 内に作るか, xxxMc を単独で c.swf みたいに作って, b.swf から, a.swf と c.swf を読み込む形にした方が良いと思います。 見えない物のパスを想像して書くより見えている物の方が間違えにくいです。 b.swf に xxxMc を作ったとして, 仮に, a.swf に "朝日が昇ったとき(例)" に xxxMc を動かすとします。 朝日が昇った a.swf のフレームに _root.xxxMc.play(); と書けば, b.swf の xxxMc が動き出します。 (もちろん xxxMc はあらかじめ stop(); で止めておく必要がありますが。 ) b.swf に 空(から)もしくは,小さなムービークリップを作り, そのムービークリップに xxxMc というインスタンス名をつけて, このムービークリップに c.swf を読み込んでも同じです。 _root.xxxMc.play(); で xxxMc に読み込まれた c.swf は動き出します。 >> ある条件によって、a.swfの中のある xxxMcを、 >> this.play();というかたちで実行しています。 と書かれていますが,ある条件というのはこんな単純なものではないのでしょうか? よくわかりませんが。 xxxMc の条件設定が,xxxMc の周りによる条件成立で this.play(); するのだとしたら, その条件を a.swf が読み込まれた部分の条件成立で this.play(); すれば良いと思います。 もしくは, a.swf 内に条件がそろったら, _root に変数と値を上げてください。 例えば, _root.sashi = "1"; みたいな形で。 xxxMc の方には,今書いてあるのを変えて, if(_root.sashi == "1") { this.play(); } みたいなので動かせばいいのではないでしょうか。 普通は今ここに書いたように考えると思います。 だから階層を越えてオブジェクトがコピーできなくて困ったことは今までのところ一度もありません。

すると、全ての回答が全文表示されます。

関連するQ&A