- 締切済み
Flash MX2004のloader機能についてですが。。
最近、flashをはじめた初心者です、よろしくお願いしますm(_ _)m 質問: loader機能の外部swfファイル読み込みに関しての質問です。 コンポーネントのloader機能を使って、topページの中に貼ったloaderから、contentPathでtopページと同じ階層にあるフォルダ1の中から「フォルダ1/×××.swf」と設定して外部swfファイル×××.swfを読み込み、そして×××.swfファイルの中に、フォルダ1の中にあるフォルダ2の中から△△△.swfファイルを読み込ませようと「フォルダ2/△△△.swf」という様にcontentPathを設定したのですが、ブラウザで確認したところtopページの中に△△△.swfが読み込まれないのですが… loader機能では2階層以下のファイルは読み込まれないのでしょうか?それとも何かパラメータが必要なのでしょうか? 日本語力不足でこれで理解して頂けるか不安ですが、ご存知の方、是非ご教授下さいm(_ _)m
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- DPE
- ベストアンサー率85% (666/776)
もう少し、構成を整理してみてはいかがでしょうか。 Flash では、ムービー自体も1つのムービークリップとして扱います。 つまり、ムービーとして作るものは、基本的にはムービークリップでも実現できます。 ムービークリップであれば、同じムービーの中でいくつ使っても1つ分の容量だけで済みますし、同じムービークリップでも、ActionScript で動作を変えることもできます。 全部が Flash でできているページは表示に時間がかかり、あまり評判が良くないようですが、まあ、それはさておき。 Main.swf を複数のシーンに分け、シーン1をロード画面、シーン2をサイトトップ、シーン3をアルバムといった感じで作ってはいかがでしょう。 すると、ページの切り替えは同じムービーの中のフレームを移動するだけで済み、読み込みも1段階減りますし、ページを移動するたびにロード画面が出てくるような煩雑さもなくなります。 シーンの中でもフレームは移動できます。 仮に、シーン3のフレーム1に表紙と選択ボタン、フレーム2に実際のアルバムのムービークリップを置くとします。 フレーム1では画像の選択ボタンが押されるまで待ち、押されたらフレーム2に移動して指定の画像を読み込む・・・といった設計にすると簡単です。 フレーム2に「戻る」ボタンを置いて、フレーム1に戻れるようにしておけば、改めて画像を選び直すこともできます。 シーンは「シーン」パネルで管理します。詳しくは、ヘルプや入門書等をご参照ください。 アルバムのページでは、要するに、ボタン操作で20枚の画像(この画像は外部から読み込む)を切り替えて表示できればいいのだと思います。 album_**.swf の違いは読み込む画像が違うだけで、”20枚の画像を読み込んで表示する”という動作は全く同じです。 つまり、”20枚の画像を読み込み、表示する”というムービークリップを1つ作っておいて、あとは、読み込む画像を条件によって変えてやればいいわけです。 読み込む画像を特定の名前で指定せず、変数を使って loadMovie( folder_name + "/photo" + no + ".jpg" ); というように指定すれば、ムービークリップは1つでも、読み込む画像を変えて読み込むことができます。 読み込み先を指示する変数ですが。 おそらく、ステージに配置したボタンなどで読み込む内容が変わることになると思います。 ボタンが押された時に、 folder_name = "image1"; このような具合に、変数にフォルダ名を入れるスクリプトを書いてください。 ステージにあるボタンでこのようなスクリプトを書くと、この変数は _root の持ち物となります。ムービークリップから利用する場合は、_root.folder_name というように、ターゲットパスが必要です。 ------------------------------- アルバムのムービークリップは、次のように考えます。 レイヤー1:アクション用 レイヤー2:画像を読み込むためのムービークリップを配置 レイヤー3:Now Loading の表示 タイムラインは、 フレーム1:初期設定 フレーム2:画像の読み込み フレーム3:読み込み完了を待つ(何もしない) フレーム4:完了率の算出と終了判定 フレーム5:タイムラインを止める(普段はこのフレームを表示) といった流れになります。 画像20枚となると読み込みには時間がかかり、Now Loading の表示も必要になるかと思います。 その点も考慮して、今回は、#1に出てきた loadMovie よりも高機能な、MovieClipLoader という機能を使った作例をご紹介します。 なお、この例では、loaded_per という変数に完了率がパーセントで入ります。 Now Loading の表示の具体的な作り方は割愛しますが、巷でよく紹介されている作り方でも、完了率をパーセントで求めて表示していることが多いです。原理は同じですから、それらを参考に作成してみてください。 まず、絵の方についてですが。 予め、画像と同じ大きさの四角いムービークリップを作っておきます。 画像を読み込むムービークリップは、シンボルを作る時、四角の左上が+の位置に来るように合わせてください。+の位置に画像の左上が来るように読み込まれますので、この位置がズレていると画像もズレて表示されてしまいます。 アルバム用のムービークリップのレイヤー1・フレーム1にキーフレームを作り、表示する枚数の分だけ、先述のムービークリップを配置します。 配置したムービークリップに、固定の名前+通し番号でインスタンス名を付けます。ここでは仮に、clip1 ~ clip20 という名前にします。 これらのムービークリップは、画像の読み始めから終わってからもずっと存在していなければなりません。フレーム5にフレームを挿入して、フレーム1と同じ内容を繰り返すようにします。 ちなみに、Now Loading はフレーム2~4まで表示するように作ります。 これで絵に関しては完成です。 アクションのレイヤーでは描画は行わず、スクリプトを専門に扱います。 各フレームに、次のようなアクションを書きます。 (コピーする際は、各行頭の全角のスペースにご注意ください) ・フレーム1(初期設定) //読み込むファイルの総数と、 //読み込みが完了したファイルの数を保持 file_max = 20; file_cnt = 0; //ロード完了率の算出用オブジェクトを作成 prog_obj = new Object(); //ロード用のオブジェクトを作成 load_obj = new MovieClipLoader(); //ロード完了時に実行する処理を定義 load_obj.onLoadInit = function( target_clip:MovieClip ) { //読み込みが終了したファイルの数を更新 file_cnt++; //読み込んだ画像を、とりあえず非表示にしておく target_clip._visible = false; }; ・フレーム2(画像の読み込み) var i , image_name; //ムービークリップに画像を読み込む指令を出す for( i = 1 ; i <= file_max ; i++ ) { //画像のURLを設定 image_name = _root.folder_name + "/photo" + i + ".jpg"; //画像を読み込む load_obj.loadClip( image_name , this[ "clip" + i ] ); } ・フレーム3(読み込み終了を待つ) スクリプトは書きません。空白のキーフレームのままにしておきます。 ・フレーム4(完了率の算出と終了判定) total_byte = 0; loaded_byte = 0; loaded_per = 0; //全体の総バイト数とロード済みバイト数の取得 for( i = 1 ; i <= file_max ; i++ ) { //ファイルの情報を取得 prog_obj = load_obj.getProgress( this[ "clip" + i ] ); //総バイト数を算出 total_byte += prog_obj.bytesTotal; //ロード済みバイト数を算出 loaded_byte += prog_obj.bytesLoaded; } //ロード完了率の算出 loaded_per = Math.floor( loaded_byte / total_byte * 100 ); //終了した数がファイルの総数と一致すれば、読み込み終了と見なす if( file_cnt == file_max ) { //全画像を表示 for( i = 1 ; i <= file_max ; i++ ) { this[ "clip" + i ]._visible = true; } //先に進む gotoAndPlay( 5 ); } //完了していない場合 else { //全画像の読み込みの完了を待つ gotoAndPlay( 3 ); } ・フレーム5(普段はここを表示) stop(); MovieClipLoader では、読み込んだ画像1件ごとに様々なイベントが発生して、進捗状況を把握できます。 今回は、読み込みが完了した時に発生する”onLoadInit”というイベントを使います。 ロード完了時にカウントを取り、このカウントがファイルの総数と一致しているかどうかで、全体の読み込みが終わったかどうかを判断します。 また、この例では、ロード済みの画像を一旦非表示にして、最後にまとめて表示するようにしています。ロードが済み次第、順次表示するには、_visible を操作している箇所(フレーム1とフレーム4にあります)のスクリプトを削除してください。 この例では、各フォルダの画像が全て photo1.jpg ~ photo20.jpg というファイル名であることが条件になります。 同じように photo +通し番号で名前を付けておき、最初と最後の番号を変数に入れて読み込むように改造すると、1~ 20 まででなくても対応できるようになります。 ------------------------------ アルバムのムービークリップが完成したら、あとは、「アルバム」のシーンに配置し、画像を選択するボタンを作って完成です。 画像が正常に読み込まれるか、また、ロード完了率の表示が正しく行われるか、確認してみてください。 「ムービープレビュー」の「制御」→「ダウンロードのシミュレート」にチェックを入れると、模擬的にダウンロードが実行されます。 MovieClipLoader の仕組みについては、以前、別の質問で何回かご紹介しましたので、よろしければご参照ください。#3で説明しております。 ・onPressに関する質問 http://okweb.jp/kotaeru.php3?q=1005374 MovieClipLoader を使う時のロード完了率の出し方は、 ・再質問:for文について(MovieClipLoaderについて) http://okweb.jp/kotaeru.php3?q=1019966 の、#1で説明しております。
- DPE
- ベストアンサー率85% (666/776)
Loader コンポーネントで読み込んだムービーの中に、更に別のムービーを読み込みたい、ということでしょうか? 2階層以下のフォルダにあるムービーも読み込みは可能ですので、おそらく、1つのムービーの中で、結果的に Loader コンポーネントが入れ子になることが原因だと思います。 外部ファイルの読み込みの制御やコンポーネントの制御はただでさえも厄介なのに、これを入れ子にして二重に読み込むとなると ActionScript での制御も必要になります。 こんな複雑な設計にする前に、二重読み込みが本当に必要なのかを、もう一度検討してみてください。 素材サイト等から入手した Flash 素材を自分のムービーに配置したいだけなら、素材をムービークリップにして配置する方法もあります。 また、アニメを2つ重ねて実行したいなら、ムービークリップとして作り、レイヤーを使って重ねることでも対応できます。 入れ子にして読み込むことは不可能ではありませんが、単純に contentPath パラメータにファイルのパスを設定するだけというように簡単にはいきません。 ちょっと難しい話になるかと思いますので、そのつもりでお読みください。 -------------------------------- 例えば、あるフォルダが folder1 ┗ folder2 ┗ Sub_clip.swf ┗ Load_clip.swf Loader.swf このような構成になっているとします。 Loader.swf で Loader コンポーネントを使い、folder1 にある Load_clip.swf を読み込みます。 Load_clip.swf にもやはり Loader コンポーネントがあって、folder2 にある Sub_clip.swf を読み込むようにしている・・・と、現状ではこのようになっているかと思います。 外部からムービーを読み込むと、読み込まれたムービーは、最初に起動したムービーを構成する部品の1つのように扱われます。 つまり、Loader コンポーネントで読み込んだムービーも Loader コンポーネントを利用しているなら、 ・ムービー ┗ Loader コンポーネント ┗ Loader コンポーネント このように入れ子になります。 Loader コンポーネントは単純に見えますが、内部では目に見えない他のムービークリップを使っていたり、いろいろと難しい処理をしていたりとで、かなり複雑な構造になっています。 これを入れ子にしようとするとややこしいですし、contentPath を相対パスで指定していると、最初のムービーから見たパスとなるので指している対象が変わってしまったとで、なかなか上手くいきません。 そこで、Loader.swf では Loader コンポーネントを使うとしても、これに読み込まれる Load_clip.swf の方では、Loader コンポーネントを使わずに Sub_clip.swf を読み込む方法をご紹介します。 -------------------------------- 外部ムービーの読み込みは、何も Loader コンポーネントでなければできないわけではありません。 古い Flash には Loader コンポーネントがなく、外部のムービーや JPEG 画像を読み込むには、ムービークリップを受け皿として置いておき、ActionScript を使って読み込んでいました。 この方法は今でもよく使われているもので、むしろ、Loader コンポーネントよりも有名な手法です。 まあ・・・年寄りの説教のようで何ですが(^^;)、最初から Loader コンポーネントなんて安易な機能に頼らず、難しくても、ムービークリップに読み込む方法をマスターした方がいいと思います。 Loader コンポーネントも、内部ではムービークリップを使って読み込んでいます。簡単に手軽に制御できるようにと、面倒なところが見えないように隠されているにすぎません。 Load_clip.swf で、線のない塗りだけの四角いムービークリップを1つ作り、Loader コンポーネントの代わりにこちらを配置します。 このムービークリップにインスタンス名を付けます。この名前は、Loader.swf からここに Sub_clip.swf を読み込む時に必要になります。 ステージ上のムービークリップを選択した状態で「プロパティ」パネルを見ると、<インスタンス名> と書かれているところがあります。半角の英数字だけで名前を入力してください。ここでは仮に、”load_area”とします。 さしあたって、Load_clip.swf ではファイルを読み込む処理は不要です。 Loader.swf の方ではとりあえず Loader コンポーネントを使いますが、同じようにムービークリップを使って読み込むこともできます。 ActionScript や Flash に慣れてきたら、ムービークリップで読み込む方法も考えてみてください。 ステージに Loader コンポーネントを配置し、先のムービークリップと同様にインスタンス名を付けます。ここでは”main_loader”とします。 それから、「パラメータ」タブで contentPath を設定します。今回の例ですと、 folder1/Load_clip.swf です。 Flash では、ムービーの他に JPEG 画像やテキストも読み込むことができますが、何を読み込む時でも、必ず、ロードにかかる時間を考慮するようにしましょう。 読み込みが終わる前に次の処理に進んでしまうと、絵が表示されない・続きの読み込みが上手くいかないなど、不具合の原因になります。 ムービーや JPEG 画像は容量が大きく、ロードには時間がかかります。通信時間が長くなるほど、その間に回線が切断した・サーバーが応答しないなど、不測の事態で読み込みが失敗する可能性も大きくなります。 今回はそこまでは考えませんが、ActionScript を使って、読み込みが失敗した場合に対処することも可能です。こちらも、もう少し慣れてきたら研究してみてください。 Loader.swf の中に Load_clip.swf を読み込んだら、この読み込みが終わるまで待ってから、次の Sub_clip.swf を読み込みます。 ここからが ActionScript での制御になります。 ActionScript は専用のパネルで編集します。「ウィンドウ」→「開発者パネル」→「アクション」と選択するか、スクリプトを設定する対象を選び、「プロパティ」パネルにある矢印のアイコンをクリックして開きます。 デフォルトでは、ステージの下にドッキングされています。 タイトルバーの横をドラッグして移動すると、ドッキングが解除され、普通のウィンドウのように大きさを調整できます。小さくて使いにくい場合は、ドッキングを解除して使ってください。 ステージに配置した Loader コンポーネントを選択した状態で、「アクション」パネルを開いてください。 パネルの下に、スクリプトを設定しようとしている対象が表示されます。 ここが「 main_loader 」になっていることを確認して、次のようなスクリプトを書きます。 このスクリプトは、Loader コンポーネントでの読み込みが完了した時に実行されます。 (↓各行頭に全角のスペースが入っています。コピーして利用する際は、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) //コンポーネントでの読み込みが終了した時の処理 on(complete) { //読み込まれたムービーのロード領域に、 //他のムービーを読み込む this.content.load_area.loadMovie( "folder1/folder2/Sub_clip.swf" ); } ActionScript でムービークリップや変数・関数などを操作する時は、それらを持っているのが誰なのかを指定する必要があります。 自分が持っているものならば省略できますが、他のムービークリップが持っている場合は、その持ち主をはっきり指定して操作します。この指定のことを、ターゲットパスといいます。 例えば、Sub_clip.swf を読み込む時の受け皿となるムービークリップ(インスタンス名:load_area )は、Load_clip.swf の持ち物です。 しかし、読み込みの指令を出すのは Loader.swf です。Loader.swf からすれば、load_area ムービークリップは他人の持ち物ですから、使わせてもらうなら、その持ち主を指定しなければなりません。 this.content この部分までが、Loader コンポーネントに読み込まれた Load_clip.swf を指します。 更に、 this.content.load_area.loadMovie( ・・・ ); で、コンポーネント内に読み込まれた Load_clip.swf が持つ load_area ムービークリップに、ムービーをロードするという意味になります。 loadMovie は、他のムービーや画像を読み込むための関数のようなもの(メソッドといいます)です。 ムービークリップであればどれでも持っているものなので、当然ながら、load_area もこの命令を持っています。 -------------------------------- Load_clip.swf や Sub_clip.swf が容量の大きなムービーである場合は、ロードの進捗状況を表す Now Loading 画面を付ける必要も出てくるかと思います。 これも Loader.swf 1つで全部管理しようとするとややこしくなりますので、それぞれのムービーに作っておいた方が簡単です。 Now Loading 画面の作り方はいろいろな入門書や解説サイトで取り上げていますし、この OKWeb でも何度か話題になっています。そちらを参考になさってください。 長くなってすみませんでした。 不明な点がありましたら、補足してください。
補足
こんなに詳しく説明して頂いて本当に有難うございます!htmlのように間単にパスの受け渡しが出来る位にしか考えていなかったので本当に目から鱗です。。有難うございます(T_T)これを機にもっとちゃんと勉強していきたいと思います(^^; ちなみにお教え頂いた通りに作ってみたところちゃんと表示する事が出来たのですが…お時間があればもう一つお教え頂いても宜しいでしょうか? 冒頭に二重読み込みが本当に必要なのかを、もう一度検討してみてください…とありましたが、実は(無謀にも)今allフラッシュのページを作成しようとしていて、mein.swfの中にPhotoアルバムのトップページのphoto_album.swfのページを読み込んで、その中にphoto_album.swfの中のボタンによってalbum_1.swf、album_2.swf…と切り替えて読み込ませたかったので前述の質問をさせて頂きました。 そしてalbum_x.swfの読み込みまではお教え頂いた方法で出来たのですが、アルバムの写真の枚数が多かったもので、中にcontentPath=Photo_01.jpg、contentPath=Photo_02.jpg…と20個ほどloaderでjpg画像を読み込むalbum_x.swfを一つ作っておいて、20枚ずつ画像をPhoto_1.jpg…Photo_20.jpgと名前を振ってフォルダ分けしておいたフォルダにalbum_x.swfを一つずつコピーして入れて、album_x.swfの中身をいじらないで名前だけ変えることによってphoto_album.swfの中で切り替えれるようにしたいのですが… loader機能ではalbum_x.swfの中のcontentPathを「Photo_x.jpg」とするだけではもちろん出来ないの はお教え頂いたことから分かったのですが、このような場合どういう処理をしたら最善かお教えいただけないでしょうか。。m(_ _)m 無知なもので、見当違いな質問であったら済みません(--;