電子書籍の厳選無料作品が豊富!

現在、10個程度のswfファイルと60個程度のjpgファイルがあります。それらをjavascriptを使わずに(基本的にはFLASHで)、アクセスするたびにHTML上でランダム表示させたいと考えています。

これまで、ひとつのswfファイルをベースにして、以下のアクションスクリプトを使って、10個のswfファイルをランダム表示させることには成功しています。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//1~3の整数の乱数を,変数 ransuu にセット
ransuu = Math.floor(Math.random()*13)+1;
//ムービー内に ransuu+".swf" をロード
this.loadMovie(ransuu+".swf");
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

たぶんこのスクリプトを発展させれば、jpgもランダム表示できるようになると思います。

ランダム表示させたい複数のswfファイルとjpgファイルは同じ階層にあります。HTMLはそのひとつ上の階層にあります。ベースとなるswfファイルは、複数ランダム表示用のファイル群と同じ階層でも良いし、もしくはHTMLと同じ階層でも良いことにします。

どのような方法があるか、教えてください。

*ちなみに、ベースとなるswfファイルを複数ランダム表示用のファイル群と同じ階層において、そのひとつ上の階層にあるHTMLから読み込んだ場合、うまく表示されませんでした。このアクションスクリプトを引用した元のウェブサイトでは、HTMLも、ベースとなるswfファイルも、ランダム表示される複数のファイル群も、全て同じ階層にあるという前提になっていました。

A 回答 (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/actio …



 // 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/FN030 …
 ~引用~
 > this.my_mc.loadMovie("test.swf");
 >
 > 読込む外部ファイルのURLは、
 > 絶対パスまたは相対パスで指定します。
 > 相対パスを使う場合は、FlashのSWFファイルではなく、
 > SWFファイルの埋込まれたHTMLファイルが
 > パスの起点になります。
 > 記のサンプルスクリプトは、相対パスの例です。


見るまでのことはないと思いますが,
一応,HTMLでのパスの指定方法です↓。

「リンク - 超初心者のためのホームページ作成講座」
http://park16.wakwak.com/~html-css/link_koza/lin …
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2006/07/10 21:56

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