dポイントプレゼントキャンペーン実施中!

外部のムービークリップを予め読み込んでおいて(読み込んでいる間はNowLoadingさせる)順番に表示させるムービーを作成しています。

●時期によって外部のムービークリップを追加したり、入れ替えたり、順番を変えたりを簡単にできるようにしたいと考えています。
●順番に読み込んでいたのでは毎回ムービーが止まってしまうので、予め読み込んでおきたいと思っています。

以上のようなムービーを自分なりに調べたり試したりしているのですが、以下のようになってしまって、どうもうまくいきません。

▼loadMovie("url",target)を使って予め全て読み込むようにするには外部ファイル数分のtargetが必要になってしまった。
▼読み込んだ時点でムービーが始まってしまうので順番が来たときには外部ムービーのフレームが進んでしまっていた。
tellTarget (target) {
gotoAndPlay(1);
}
とやってみたが、うまくいかなかった。
▼loadMovieNumを使うと読み込まれた時点ですべて重なって表示されてしまう。
▼_root.target._visible = false;とやってみましたが表示されてしまった。読み込んだムービーは枠外に置く以外にうまい方法はないのでしょうか?非表示にはできないのでしょうか?

A 回答 (4件)

以前、2つのムービーをそれぞれムービークリップに予め読み込んでおき、ムービー1が終了したらムービー2に切り替える方法をご紹介しましたので、よろしければご参照ください。



 ・2つのswfファイルをつなげている場合の一括ローディング方法
  http://okweb.jp/kotaeru.php3?q=1288226

基本的な考え方・個々のムービーの終了を検出する方法については、この質問でご紹介した通りの考え方が使えます。
上記の質問の場合はムービーが2つと決まっていましたので、最初からムービークリップを2つ配置しておけば済みました。
しかし、今回の件ではムービーの数が不定になる可能性があるため、予めムービークリップを配置しておけないところが難点なのだと思います。


Flash のバージョンが書かれていませんので何ですが、Flash 5 からは、ステージに配置したムービークリップをコピーする duplicateMovieClip というメソッドが使えるようになりました。
ステージには、コピー元になるムービークリップを1つだけ配置しておきます。
あとは、ムービーの数だけコピーしてそこにムービーを読み込むと、ムービークリップの数についての問題は解決できます。

コピーしてできたインスタンスには、固定の名前+通し番号で付けます。ここでは仮に、cell +番号とします。
この番号を変数( cell_no とします)で管理すると、文字列からインスタンスを操作する機能( eval 関数もしくは配列演算子[ ] )を利用して

 this[ "cell" + cell_no ]._visible = true;

このようにしてムービークリップを操作できます。
番号は連番になっていますから、1つのムービーが終わった時は、cell_no を +1 すれば、次のムービーを表示・再生できます。


残る問題は、ムービーを再生する順番や読み込む数ですが。
指定の順序通りに何かをさせたい時は、先述のように通し番号を利用する他に、配列変数を使う方法があります。
ムービーの名前を通し番号でつけなければならないとすると融通が利かなくなりますので、ここでは、配列変数を利用した例をご紹介します。

Flash の文字列操作では、指定の文字を区切り文字として文字列を分割し、配列変数に格納することができます。
また、文字列を外部のテキストファイルから変数として読み込むことも可能です。
この2点を利用して、ムービーのファイル名を列挙したテキストファイルを1つ用意し、それをもとにムービーファイル名を入れた配列変数(テーブルといいます)を作ります。
ムービーがいくつあるかは、作られた配列変数の要素数( Array.length で取得できます)を見れば分かります。
個数が分かれば for ループが利用できますから、ムービークリップをコピーしながら、配列変数に入っている順にムービーをロードします。
これで、ムービーがいくつあっても、再生したい順にセットしておく仕組みが出来上がります。

--------------------------------------

Flash では、メインのタイムラインが止まっていても、ムービークリップのタイムラインは動いています。
読み込むムービーのタイムラインは stop(); で止められますが、フレーム1に複数のフレームから成るムービークリップがある場合は、このタイムラインは動いてしまいます。
一番簡単なのは、#1の方とかぶりますけれど、個々のムービーの最初に空白のフレームを1つ作り、ここに stop(); を入れて止めておくことです。

それから、最後のフレームには、再生が終了したことを全体の指揮を執るムービーに伝えるために

 _parent.end_flg = true;

というスクリプトを入れてください。


読み込むムービーのファイル名は、テキストファイルで設定します。
この設定ファイルを”movie_list.txt”とすると、

 movie_name=movie1,movie2,movie3

このような形式で書いておきます。
loadVariables などでこれを読み込み、” , ”を区切り文字とし分割して、ファイル名を配列変数にそれぞれ格納します。
ムービーの個数や名前は、このテキストファイルを書き換えるだけで変更できます。


全体の指揮を執るムービーは、次のようなレイヤー構成にします。

 アクション:スクリプトを書きます。
 表示領域 :ムービーを読み込むための、コピー元のムービークリップを配置。
 完了率表示:ロードの進捗状況の表示用。

ムービーの流れは、次のようになります。

 フレーム1:初期設定と、ファイル名の読み込み
 フレーム2:テキストファイルの読み込み終了待ち。スクリプトはなし。
 フレーム3:テキストの読み込み終了後、ファイル名のテーブルを作成。
 フレーム4:ムービークリップをコピーしながら、ムービーを読み込む。
 フレーム5:ムービーの読み込み終了待ち。スクリプトはなし。
 フレーム6:ロード完了率の算出。全ムービーが読み込まれたら、最初のムービーだけを再生させる。
 フレーム7:再生中のムービーの再生終了を待つ。スクリプトはなし。
 フレーム8:再生するムービーの切り替え処理。


ステージには、フレーム4から8まで、コピー元になるムービークリップ(インスタンス名を cell_org とします)を配置します。
ムービーの大きさが固定であれば、塗りだけの四角形をムービークリップにして配置しておくと、ムービーが表示される場所が分かりやすくなります。
ただ、このムービークリップは常時表示されてしまいますので、onClipEvent(load) を利用して _visible を false にしておくといいでしょう。
なお、ムービークリップを duplicateMovieClip でコピーすると、コピー元に onClipEvent で設定されているアクションはコピーにも受け継がれます。
従ってコピーも最初は非表示になりますので、最初にコピーを非表示にしておく処理は省略できます。


各フレームのスクリプトは、次のようになります。
(各行頭に全角のスペースが入っています。コピーする際はご注意ください)


 ・フレーム1

  //現在再生中のムービークリップの番号を保持
  cell_no = 0;

  //各ムービーの再生終了フラグ:このフラグは各外部ムービーから操作される
  //再生終了時true、それ以外はfalse
  end_flg = false;

  //ムービーリストの読み込み
  System.useCodepage = true;
  this.loadVariables( "movie_list.txt" );


 ・フレーム3

  //ムービーリストの読み込み完了を待つ
  if( movie_name == undefined )
  {
   gotoAndPlay( _currentframe - 1 );
  }
  else
  {
   //読み込んだ文字列を”,”で分割し、ファイル名のテーブルを作る
   str = new String( movie_name );
   movie_tbl = str.split( "," );
  }

↑ここまでで、テキストファイルから読み込んだファイル名が movie_tbl という配列変数に格納されます。


 ・フレーム4

  //全ムービーの読み込み
  movie_max = movie_tbl.length;
  for( i = 0 ; i < movie_max ; i++ )
  {
   //表示用ムービークリップをコピー
   //位置はオリジナルに重ねておく
   cell_org.duplicateMovieClip( "cell" + i , i );
   this[ "cell" + i ]._x = cell.org._x;
   this[ "cell" + i ]._y = cell_org._y;

   //コピーしたムービークリップにムービーを読み込む
   this[ "cell" + i ].loadMovie( movie_tbl[ i ] + ".swf" );
  }


 ・フレーム6

  loaded = 0;
  total = 0;
  per = 0;

  //ロード済み容量および総容量を取得し、完了率を算出
  //全ムービーの合算で出す
  for( i = 0 ; i < movie_max ; i++ )
  {
   loaded += this[ "cell" + i ].getBytesLoaded();
   total += this[ "cell" + i ].getBytesTotal();
  }
  per = Math.floor( loaded / total * 100 );

  //全ムービーの読み込み終了を待つ
  if( per < 100 )
  {
   gotoAndPlay( _currentframe - 1 );
  }
  else
  {
   //最初のムービーだけ表示・再生し、先へ進む
   this[ "cell0" ]._visible = true;
   this[ "cell0" ].gotoAndPlay( 2 );

   gotoAndPlay( _currentframe + 1 );
  }

↑ここまでが、ムービーを読み込む処理です。
完了率は全ムービーの合算で、変数 per に%で入ります。
Now Loading 画面はフレーム4から6まで表示してください。


 ・フレーム8

  //各ムービーの再生終了を待つ
  if( ! end_flg )
  {
   gotoAndPlay( _currentframe - 1 );
  }
  else
  {
   //今のムービーを非表示・停止
   this[ "cell" + cell_no ]._visible = false;
   this[ "cell" + cell_no ].stop();

   //次のムービーがある場合は、それを表示
   cell_no++;
   if( cell_no <= movie_max )
   {
    this[ "cell" + cell_no ]._visible = true;
    this[ "cell" + cell_no ].gotoAndPlay( 2 );

    //次のムービーの再生終了を待つ
    end_flg = false;
    gotoAndPlay( _currentframe - 1 );
   }
   else
   {
    //再生するムービーがない場合は、ここで待機
    stop();
   }
  }


ポイントは、ムービークリップを番号で操作できるようにする仕組みと、ムービーを再生順にセットしておくことです。

超長文になってすみませんでした。
不明な点がありましたら、補足してください。

この回答への補足

大変分かりやすい回答をありがとうございました!
勉強になりました。
まだ試していないのですが、ちょっと質問させてください。

●System.useCodepage = true; の部分、
これは定義済みの定数か何かですか?
何をさせているのでしょうか?

●gotoAndPlay( _currentframe - 1 ); の部分、
stop();ではダメということですか?
フレーム2,5,7はこのための空きフレームということですか?

●テキストファイル読み込みに待ち時間を設けていますが、ファイルが軽くても、待たせないと正常に動かないということですか?

●私が試した時は_visibleが効かず、外部ファイルが表示されてしまったのですが、ロードの仕方が悪かったのでしょうか?その時は確か…
loadMovie("pittanko.swf",target);
target._visible = false;
としたと思うんですが、どうでしょう?

●各外部ファイルの1フレーム目にstop();と入れておけば表示されないようになりましたが、それに加えて
_visible = false;
としておくワケは何ですか?
gotoAndStop(1);あるいはgotoAndPlay(1);ではダメなのでしょうか?

答えていただいたのにさらに質問攻めして申し訳ありません。
よろしくお願いします。

補足日時:2005/04/20 22:51
    • good
    • 0

#2、3です。

度々すみません。


#2のスクリプトに誤りがありました。
フレーム8のスクリプトで、

 //次のムービーがある場合は、それを表示
 cell_no++;
 if( cell_no <= movie_max )

この if 文の条件は、正しくは

 if( cell_no < movie_max )

でした。
cell_no は 0 から始まっていますから、例えばムービーが5つ( movie_max = 5 )ある場合は cell_no = 4 の時まで if の条件が成立すればいいのですが、#2のスクリプトですと cell_no = 5 の時も成立してしまいます。

それから、#3の回答で System.useCodePage と書いてしまいましたけれど、厳密には System.useCodepage (” p ”が小文字)です。
#2のスクリプトでは正しい書き方になっています。

大変失礼いたしました。
この場をお借りして、訂正させていただきます。

----------------------------------------

MX 2004 では Java やC++を意識してか、オブジェクトをクラスと呼ぶようになりました。
クラスの継承は可能で、現にコンポーネントの制御クラスは、基本中の基本である MovieClip クラスの他に、いくつかのコンポーネントに共通する動作に関する制御をまとめた UIObject クラスや UIComponent クラスを継承しながら設計されています。
設計理念は立派ですが、おかげでヘルプはややこしく、難しく見える記述になりました ^^;

カスタムオブジェクトの作成や継承は、確か Flash 5 でもそれらしきことはできたはずで、別に MX 2004 になって初めて取り入れられたものではなかったと思います。
もっとも、MX 2004 は Flash 5 から比べると、クラスの設計をしやすくするなど、プログラミング言語としての基盤の整備も進んでいます。


MX 2004 が出て1年以上経ち、Flash Player 7 も大分普及しているかと思いますので、個人的には、旧世代からの過渡期は過ぎたかなと思っています。
最新の技術をフルに活かしたコンテンツを堪能してもらいたいのなら、最新のプレイヤーが必要だという旨の注意書きを出しておいて、プレイヤーをインストールしてから見てもらえるような工夫をしておけば済むことです。

より多くの人に見てもらいたい時は、もう少し敷居を下げて、Flash Player 5 、6 あたりをターゲットにしてはいかがでしょう。
ただ、Flash Player は 4 と 5 の間では ActionScript の文法が大きく変わっており、プレイヤーとしての設計も大々的に変更されています。
Flash Player 4 以前向けに作られたムービーを新しいバージョンで再生すると、逆に、意図しない動きになる場合もあるそうです。
新しいプレイヤーがそれなりに普及している環境下では、普遍性を重視するあまり古すぎるバージョン向けにするのも、これまた問題アリというわけですね。

ゲームやアプリケーションなどでもそうですけど、再生できるプレイヤーやハードを持っていなければ利用できないのは当然のことです。
Windows 版しか出ていないソフトを Mac ユーザーが使いたいと思っても、どうにもなりませんよね。
ちょっと傲慢な言い分かもしれませんけれど、そもそも Flash 自体が、閲覧者を選ぶ素材です。全ての人・どんな環境でも全く問題なく見てもらえる方法はありません。
何の目的で使うムービーだとか、どんな人を対象にしたいかで、書き出すバージョンや使うスクリプトを選ぶくらいの姿勢で、いいと思うのですが。

Macromedia ( Adobe に買収されたそうですが)の製品は、最新版の2世代前までしかアップグレードの対象にならないので、マイナーチェンジを繰り返してバージョン数だけ稼がれても困りますね。
バージョンごとに劇的な進歩がないと、ユーザーも買う気にはならないと思いますよ。


ちなみに、Adobe による買収の話についてはこちらをどうぞ。

 ・アドビ システムズ社がマクロメディア社を買収
  http://www.macromedia.com/jp/macromedia/proom/pr …
    • good
    • 0
この回答へのお礼

アドビがマイクロメディアを買収したんですね。知りませんでした。これでイラレのデータをフラッシュに持っていきやすくなるといいな~。

> 全ての人・どんな環境でも全く問題なく見てもらえる方法はありません。
そうですね。プレステ2のゲームがやりたきゃプレステ2買いますもんね。ましてFlashの最新プレイヤーは無償ですから、気にする必要はないのかもしれませんね。
IE5やNN4.7のころはCSSに随分悩まされましたが、最近は無視しています(^^;

> バージョンごとに劇的な進歩がないと、ユーザーも買う気にはならないと思いますよ。
そうか。そうですよね。開発側からみれば当然の話ですね。これからも進化し続けていくのかと考えると、使う側も常に勉強しないと手に負えなくなりそうですね(^^;;

質問に対する完璧な回答に加え、解説、そして制作に対する心構えまで、ご教授ありがとうございました。
何か学校に教わりにきているみたいでした。
また何か質問するかもしれませんがよろしくお願いいたします。

お礼日時:2005/04/23 11:00

#2です。



お使いの Flash のバージョンは何でしょうか?
Flash はバージョンによって、スクリプトの文法やオブジェクト( MX 2004 ではクラス)がかなり違っています。同じ動作をさせるにも効率よく作れたり、より安全に設計できたりと、様々なところに違いが出ます。
Flash の質問をする時はバージョンをはっきり書いておいた方が、いい回答が集まりますよ。


#2のスクリプトは、System.useCodePage を除いては Flash Player 5 (作成ツールは Flash 5 )以降で動きます。Flash 5 をお使いの場合は、System.・・・の1行を削除してください。
ムービークリップをコピーする duplicateMovieClip は、Flash Player 5 以上でないと使用できませんので、Flash 4 以前をお使いの場合は、#2のスクリプトそのものが動作しません。

--------------------------------------------

● System.useCodePage について

Flash だけでなくホームページのデータなどでもそうですが、日本語はそのままでは通信できません。
日本語を通信できるデータの形に変換するルールを、エンコードといいます。
このデータを元に戻して日本語と解釈する(デコードといいます)には、エンコードした時と同じルールで解析しなければなりません。
送り手と受け取った側とでルールが一致していない時に発生するのが、いわゆる文字化けという現象です。日本語を英語の文法で解釈しようとすると意味不明の文になってしまうのと、同じことです。

Flash Player 5 までは、Shift-JIS というエンコードが使われていました。Shift-JIS は長らく日本語の標準とされてきたエンコードで、今でも現役ではありますが、規格としては少々旧式です。
Flash Player 6 (作成ツールは Flash MX )以降は、UTF-8 が標準のエンコードとして採用されました。何も指示しなければ、ムービーの外部とやりとりする文字は全て、UTF-8 のルールに従って解釈されます。
しかし、Flash Player 6 でも Shift-JIS でエンコードされた文字を利用したい場合もあります。
System.useCodePage はこのための設定で、true で Shift-JIS 、false で UTF-8 になります。デフォルトでは false になっています。

Flash Player 5 では Shift-JIS しか解釈できませんから、読み込むテキストファイルを Shift-JIS で記録しておかなければなりません。
Windows のメモ帳では、名前を付けて保存する時にエンコードの形式を選択できます。「 ANSI 」が Shift-JIS にあたります。
System.・・・の1行は削除してください。

Flash Player 6 以降では、読み込むテキストファイルを Shift-JIS で記録した時は、System.useCodePage を true にしないと文字化けが発生します。
UTF-8 で記録した時は、この設定は不要になります。

なお、エンコードが問題になるのは日本語の場合だけなので、読み込む文字が半角文字に限られている時はあまり気にしなくても大丈夫です。


●フレーム間をループする理由について

フレームに設定したスクリプト(フレームアクション)は、再生ヘッドがフレームに来た、その時1度しか実行されません。
フレーム3・6・8で stop(); で再生ヘッドを止めてしまうと、変数の判断が行われるのも1回限りになってしまいます。
しかし、読み込みの状況や再生が終了したかどうかの情報は、最初の1回で変わっているのではなく、何フレームか後といいますか、しばらくしてから変化する情報です。これらを監視して処理を分岐するには、フレームアクションを繰り返し実行できる仕組みが必要です。

再生ヘッドを何度もセットすれば、その都度フレームアクションは実行されますが、Flash の仕様上、同じフレームに続けて再生ヘッドをセットすることはできないようになっています。
#2のスクリプトでは、フレーム2・5・7にダミーのフレームを作り、前のフレームとの間をループさせることで、フレーム3・6・8のアクションを繰り返し実行できるようにしています。

変数の値を監視するなら、こんな面倒なことをしなくても、while ループでもできるような気がします。
ところが、これも Flash の仕様で、1つのフレームでいつまでもループが続いていると、システムを保護するために「スクリプトが原因でムービーが遅くなっています」という警告が出て、ムービーを強制終了できるようになっています。
画像やムービーの読み込みには時間がかかるのが当たり前ですし、回線の速度や状況によっても変動します。
while ループでは上記の警告が出る可能性が高いので、この手の処理には不向きです。


●テキストファイルを読み込む時の待ち時間について

これはやってみた方が早いですね。
例えば、” test.txt ”というファイルの中身が

 test=sample

だとします。日本語(全角文字)ですらない、とても単純なデータです。

 this.loadVariables( "test.txt" );
 trace( test );

このように loadVariables のすぐ後で利用しようとすると、変数 test の内容は undefined (未定義)と表示されます。
しかし、2~3フレーム先で同じく trace アクションで見てみると、きちんと読み込まれているのが確認できます。
つまり、たとえ単純なテキストデータであっても、読み込みの命令を出した次の瞬間に読み込みが済んでいることは、まずありえないのです。
ローカル環境でもこうなのですから、ネットで公開して通信回線を介する時はなおさらです。

読み込むテキストが単なる表示用のメッセージなどなら、単にメッセージが表示されないだけの話で済みますが、今回のテキストデータはムービーのファイル名です。
この読み込みが失敗している、もしくは完了しないまま先に進むと、ムービーの読み込みも失敗してしまいます。
#2では省略しましたが、通信の途中で読み込みが失敗した時の対策なども入れるとより安全です。


● _visible について

load イベントは、普通はムービークリップがステージに登場した時1度しか発生しません。
しかし、loadMovie でムービーを読み込むと、読み込みが終了した時に再び発生します。
この時に、ムービークリップの一部の属性が初期化されます。_visible の設定は初期化される属性で、読み込みの前に予め設定してあっても取り消されてしまうようです。
(ちなみに、Flash MX 以降で onEnterFrame などのイベントハンドラで処理を定義した時も、外部画像やムービーが読み込まれた時点でこれらは全てクリアされてしまいます)

#2でも書きました通り、コピー元のムービークリップに onClipEvent アクションが設定されている時は、コピーにもこのアクションが受け継がれます。
コピー元を onClipEvent(load) アクションで非表示にしておくと、コピーもロード完了直後に非表示になります。
load イベントでも不安な時は、データが書き込まれる度に発生する( loadMovie で読み込んだ場合のみ) data というイベントを使って _visible を false にすると万全です。
data イベントは load と同様に、onClipEvent アクションで指定できます。

ムービーの最初に空白のキーフレームを入れ、stop(); で止めておくと何も表示されないので、_visible = false; と結果は全く同じです。
ですが、これは最初のフレームがたまたま空白で何も表示されないというだけのことで、ムービークリップは依然としてアクティブのまま、描画処理等も通常通り実行されます。
_visible を false にすると、ムービークリップは休止状態になり、描画処理や一部の処理が停止されます。
つまり、表示する必要がないなら最初から休止させた方が処理が軽くなるのではないかと思い、_visible を false にしています。

最初のキーフレームを空白にして stop(); で止めておく理由は、実は、非表示にすることが本来の目的ではありません。
ムービーの最初に複数のフレームからできているムービークリップを置く時や、タイムラインを使ってサウンドを鳴らす場合は、フレーム1で止めてもムービークリップのタイムラインは動くし、音も鳴ってしまいます。
このような場合は、最初のフレームを空白にしておいた方が簡単ですし、確実にムービーを停止しておくことができます。
最初のフレームでこれらの素材を絶対に利用しないのであれば、空白のキーフレームは不要で、単にフレーム1に stop(); 、再生する時は play(); でも構いません。

余談ですが。
MX 2004 の Professional 版では、スライドプレゼンテーションという機能が使えます。
これは、#2でご紹介した仕組みを更に発展させたものです。
原理としては、ムービークリップをいくつも重ね、表示するスライド(その正体はムービークリップ)の _visible だけを true に、その他のスライドは false にして休止状態にしています。
スライド用のムービークリップには独自のスクリプトが組み込まれており、_visible が false から true 、逆に true から false に変わった時にイベントが発生して、スライドが切り替わったことを検出できるように設計されているなど、普通のムービークリップにはない面白い機能があります。
しかし、ムービークリップが並んでいることには違いないので、スライドの最初に複数のフレームからできているムービークリップを配置すると、スライドが切り替わる頃にはムービークリップのアニメも進んでしまっているという、困った欠点があります。


度々長文になってすみませんでした。

この回答への補足

すみません。バージョンなどを書くのを忘れていましたね。バージョンはMX、OSはWindowsXPです。

スレッドをたてた一番最初の書き込みでそれは気づいていたのですが、追加書き込みができずに、そのまま忘れてしまっていました。(教えてgooを始めて使ったので勝手が分からなかったのです。すみません。)

それにしてもFlashのバージョンアップはいつも劇的ですよね。4から5に変わった時が特に違っていたので私は使うのをためらっていました。2004ではClassがあるということは、使いまわし度もさらに増してくるのでしょうか? バージョンによってこんなに違うと、サイト閲覧者の環境によってもかなり違うのでしょうね。便利になっていいものが作れるようになってもそれをフルに使っていいものかどうか、変革期には悩みます。

補足日時:2005/04/21 17:05
    • good
    • 0

"私であったら" と言う1つの方法をかきます。


最善の方法とも思えません。
ロードするムービーの1フレーム目を空フレームにしてはダメなのでようか?
そうするとかなり楽だと思います。

まず,読み込む全てのSWFファイルの1フレーム目を空フレームにして
stop();
を書いておきます。これで読み込まれても何も表示されません。
これを,「1.swf」,「2.swf」… とします。

次にメインのアニメーションに「target1」,「target2」…
というインスタンス名のムービークリップを作り,
1フレーム目のフレームに

loadMovie("1.swf", target1);
loadMovie("2.swf", target2);
   …   …

を書きます。
それで,ボタンか何かを用意して,ボタンであったら,
ボタン1には

on (release) {
target2.gotoAndStop(1);
target1.gotoAndPlay(2);
}

ボタン2には

on (release) {
target1.gotoAndStop(1);
target2.gotoAndPlay(2);

}

と書きます。簡単。
これで読み込んだムービーを枠外に置く必要はなくなります。

----------------------------------------------------

>> 読み込んだムービーは枠外に置く以外にうまい方法はないのでしょうか?

上の方法をしなかった場合でムービーは枠外に置く方法の1つを書いておきます。
簡単に書くと,
ムービークリップの座標をsetPropertyで見えないところにセットし,
そのムービークリップにムービーを読み込ませる。
という方法です。

個人的には座標を調べてその座標を指定する作業があまり好きでないので,
いつも,置きたい場所に違うアンカーとしてのムービークリップを置いて,そのアンカーの座標を取得させて,
その座標に,ターゲットのムービークリップをセットするようにしています。
「anc1」=表示させたい場所に置いておきます。
「anc2」=枠外に置いておきます。

メインムービーの1フレーム目のフレームアクションとして,

//それぞれのアンカーMCのx,y座標を取得
anc1_x = getProperty("anc1", _x);
anc1_y = getProperty("anc1", _y);
anc2_x = getProperty("anc2", _x);
anc2_y = getProperty("anc2", _y);
//ムービーを読み込ませたMCの座標を「anc2」=枠外にセット
setProperty("target1", _x, anc2_x);
setProperty("target1", _y, anc2_y);
setProperty("target2", _x, anc2_x);
setProperty("target2", _y, anc2_y);
//ターゲットにムービーをロードする
loadMovie("1.swf", "target1");
loadMovie("2.swf", "target2");

を書いて,欄外にセットしたアンカーの場所にMCを非難させておいて,
ボタンなどで,

on (release) {
setProperty("target1", _x, anc1_x);
setProperty("target1", _y, anc1_y);
target1.play();
}

などと命令します。
他のMCとかの制御がだんだんややこしくなるので,
やっぱり-------より上の方法を取りたいです。
    • good
    • 0
この回答へのお礼

なるほど! 上の方法なら簡単に非表示にできますね。ありがとうございます。

ただ、これだとファイル数が増えると「target1」,「target2」…と増やしていかなければならず、ボタンではなく順番に表示させるとしたら、全てのフレームに
target1.gotoAndStop(1);
target2.gotoAndPlay(2);
………
と入れなければ…
あ、でも、フレームを一つにして、ファイル数を変数に入れてやればwhileか何かでできるか?
ちょっとやってみます。

お礼日時:2005/04/20 21:40

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