- ベストアンサー
FLASHを使って、複数のswfとjpgをランダム表示させたい
- FLASHを使用して、複数のswfファイルとjpgファイルをランダムに表示させる方法について教えてください。
- 現在、10個程度のswfファイルと60個程度のjpgファイルがあります。それらをJavaScriptを使わずに(基本的にはFLASHで)、アクセスするたびにHTML上でランダム表示させたいと考えています。
- ベースとなるswfファイルを複数のファイル群と同じ階層において、その上の階層にあるHTMLから読み込む場合、表示がうまくされないという問題が発生しました。この問題を解決する方法も教えていただけると幸いです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ランダムに読み込まれるのは, SWF なのか JPEG なのかは,わからないという条件ですよね。 また,SWF のファイル数も変わる可能性があって, JPEG のファイル数も変わる可能性があるものとして考えます。 ファイル数は変わりますが, とりあえずのサンプルとして, 次のようなファイル構造であった場合のスクリプトを考えます。 任意のフォルダ ├ index.html (index.swf を表示) ├ index.swf └ files (フォルダ) ├ 0.swf ├ 1.swf ├ 2.swf ├ 0.jpg ├ 1.jpg ├ 2.jpg ├ 3.jpg └ 4.jpg まず SWF ファイル も JPEG ファイルも 0 という名前から連番にします。 配列を使いますので,0 から始まる連番の方がわかりやすくなります。 SWF が表示されるのか,JPEGが表示されるのかわからない状態, つまりファイル名がごちゃごちゃ混在している状態で, なおかつ均等にランダムを必要とされているのでしょうから, ファイル名のデータベースとなるものを用意して, そのデータの中からランダムなデータを選んで表示するしかないと思います(多分)。 イメージで書くと次のような感じです。 データ = リンゴ,バナナ,イチゴ,レモン,ミカン 乱数 = ランダムな5つの数を代入 → データの 乱数番目 の要素を読み込む このような感じです。 しかし, データ = 0.swf,1.swf,2.swf,0.jpg,1.jpg … として書いて行くのは非常に面倒なので, データを用意する部分も ActionScript でやってしまいます。 以上のような場合のスクリプトは, こんな感じになります↓(コピペ可能)。 //////////////////////////////////////////////////// // ※SWF と JPEG ファイルの個数を記入 num_swf = 3; num_jpg = 5; // loadFile という配列を作成 load_file = new Array(); // SWFファイルのデータを作成 for (i=0; i<num_swf; i++) { load_file[i] = i+".swf"; } // JPEGファイルのデータを作成 for (var i = 0; i<num_jpg; i++) { load_file[i+num_swf] = i+".jpg"; } // ファイル数分の整数の乱数を,変数 ransuu にセット ransuu = Math.floor(Math.random()*(num_swf+num_jpg)); // ムービー内に ransuu+".swf" をロード this.loadMovie("files/"+load_file[ransuu]); ///////////////////////////////////////////////////// 以上です。 以下は,単に上のスクリプトを説明しているだけです。 長いですが,もしわからない部分があれば,参考にしてください。 --- 各行の説明 ----------------------------- // ※SWF と JPEG ファイルの個数を記入 num_swf = 3; num_jpg = 5; 上のファイル構造の例で, 読み込むSWFファイルは, 0.swf,1.swf,2.swf この3つですから,num_swf = 3; と設定しておきます。 これは読み込む SWF の数によって変えてください。 読み込むJPEGファイルは, 0.jpg,1.jpg,2.jpg,3.jpg,4.jpg この3つですから,num_jpg = 5; と設定しておきます。 これも読み込む JPEG の数によって変えてください。 この2行の部分だけを変えてもらうと, あとはその数から色々計算するので,他の部分は変える必要がなくなります。 また,変動する可能性のある部分を変数化しておく方がメンテナンスなどで都合がよくなります。 作っているときは良いのですが, 作り終えたあとしばらくすると自分が書いたスクリプトでも何のことかわからなくなるものです。 そんな時,スクリプトをいちいち思い出す必要を無くすためにも,値を変数化しておきます。 // loadFile という配列を作成 load_file = new Array(); 見たまんま, load_file という配列変数オブジェクトを作成しています。 配列の話をしていると,それだけでこの回答欄がいくつも必要になります。 もしわからない場合は,次の URL などを参考にしてください。 「配列とは?Array」 http://www.1art.jp/flash/le/lesson34/lesson34.htm // SWFファイルのデータを作成 for (i=0; i<num_swf; i++) { load_file[i] = i+".swf"; } for文で配列の要素に,SWFのファイル名データを代入しています。 for文 を使わなければ, l oad_file[0] = 0+".swf"; load_file[1] = 1+".swf"; load_file[2] = 2+".swf"; と書いているのと同じです。 これで,配列データはどうなるかと言うと, load_file = ["0.swf", "1.swf", "2.swf"]; こうなります。 しかし, for文 を使わず羅列した場合は, データの数分の行が必要となり書くのが面倒ですし, 配列そのものを書く場合も,横にやたら長くなり,また面倒です。 つまり,数が変わるたびに行や書くことが増減してしまいます。 労力やミスなどを防ぐためにも,for文 などでループさせる方が良いです。 「繰り返し文 for - FLASHアクションスクリプト入門編」 http://isvalid.jp/actionscriptLab/ASlesson/actionsctipt_for.html // JPEGファイルのデータを作成 for (var i = 0; i<num_jpg; i++) { load_file[i+num_swf] = i+".jpg"; } これも同じです。 SWFファイル名データ要素(エレメント)の後に,JPEGファイル名データ要素を羅列するので, load_file[i+num_swf] にしています。 JPEG は 60 もあるのですから,絶対に for文 などループで処理するべきです。 JPEG は 60 あっても,1000 あっても,この3行で済みます。 // ファイル数分の整数の乱数を,変数 ransuu にセット ransuu = Math.floor(Math.random()*(num_swf+num_jpg)); これは見たままですね。 最初に定義(設定)した数は,上の場合, num_swf = 3; num_jpg = 5; ですから,その場合, num_swf + num_jpg は 3+5=8です。 したがって, ransuu = Math.floor(Math.random()*8); となり,0~7まで8つの整数の乱数が ransuu に入ります。 // ムービー内に ransuu+".swf" をロード this.loadMovie("files/"+load_file[ransuu]); このスクリプトの load_file[ransuu] は, したがって load_file[0~7のいずれか] となります。 つまり, 0.swf ~ 4.jpg のうちいずれかのファイル名がここに来ます。 this.loadMovie("files/"+ ( 0.swf ~ 4.jpg のうちいずれか ) ); 仮に ransuu に 7 が入った場合, load_file=["0.swf","1.swf","2.swf","0.jpg","1.jpg","2.jpg","3.jpg","4.jpg"] このうち,0から始まる7番目, つまり 普通の日本人が言う 8 番目 の要素データが入りますから, この部分は "3.jpg" となります。 したがってこの行は, this.loadMovie("files/"+ "3.jpg"); となり,つまり, this.loadMovie("files/3.jpg"); となります。 外部ファイルへのパスの話になりますが, loadMovie や getURL など,Flash 外部へのパスは SWFから見たパスではなく,SWFを貼り付けたHTMLから見たパスになります。 index.html から,例えば 3.jpg を見ると,上の場合, 任意のフォルダ ├ index.html (index.swf を表示) └ files (フォルダ) └ 3.jpg ですから, files というフォルダの中に 3.jpg があります。 したがって, "files/3.jpg" となります。 もちろん "./files/3.jpg" でもかまいません。 つまり, this.loadMovie("./files/"+load_file[ransuu]); でも良いです。 その辺は HTML のルールと同じです。 「MovieClip.loadMovieで外部ファイルを読込む」 http://www.fumiononaka.com/TechNotes/Flash/FN0307007.html ~引用~ > this.my_mc.loadMovie("test.swf"); > > 読込む外部ファイルのURLは、 > 絶対パスまたは相対パスで指定します。 > 相対パスを使う場合は、FlashのSWFファイルではなく、 > SWFファイルの埋込まれたHTMLファイルが > パスの起点になります。 > 記のサンプルスクリプトは、相対パスの例です。 見るまでのことはないと思いますが, 一応,HTMLでのパスの指定方法です↓。 「リンク - 超初心者のためのホームページ作成講座」 http://park16.wakwak.com/~html-css/link_koza/linkkoza.html
お礼
ありがとうございました!