Flash Pro CS5
AS3.0
で記述しています。


1~10の整数をランダムかつ重複せずに配列に格納したいと考えています。



そこで,ネット上で参考になるソースを見つけ,
以下のように書き直しました。




var int_a = new Array();
var int_b = new Array();


function RandomInt():void{

//ここだけ変更すればよい
var maxN:Number = 10;//乱数の最大値

//0~maxNの数字を全部配列に入れる
for (var i:int=0; i< maxN; i++) {
int_a[i] = i+1;
}

var j:Number = 0;
var a_length:Number = int_a.length;

//要は配列をシャッフルする
while (a_length) {
var int_r:Number = Math.floor(Math.random()*(maxN+1-j));

//乱発生した整数を配列int_bに順番に入れ、int_aから削除する
int_b[j] = int_a.splice(int_r, 1);
j++;

//配列int_a内の数字が一つずつ減っていく
a_length = int_a.length;
}

//ここで配列int_bがシャッフルされた

trace(int_b);
}


RandomInt();



としました。


しかし出力結果がなぜか
8,2,4,9,,7,6,5,10,3,1のように抜けている部分があり,


次のフレームで
for(var j:int=1; j <= 10; j++){
  trace(int_b[j]);
}


として確認してもやはり
2
4
9
7
6
5
10
3
1

となってしまします。

どの部分がおかしいのか教えていただきたいです。
また,乱数発生の部分で
Math.floor(Math.random()*(maxN+1-j));
という風に記述してあったのですが,ここは間違いではないのでしょうか?
jを引いていくと発生する乱数の範囲が徐々に狭くなっていってしまうと思ったのですが;



それとも元のソースコードを使って
ttp://www.renowan.com/blog/?p=143
0~9までの乱数を発生させてそれぞれに1を足す方が簡単でしょうか?





よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

その式ですと、乱数の範囲が、配列変数のインデックス(管理番号)の最大値よりも 1 だけ広くなってしまいます。


RandomInt 関数内の乱数を求める式を

 Math.floor( Math.random() * ( maxN - j ) );

に、変更してみてください。

 
たった 1 の違いが、何が問題なのかと言いますと。
ご提示の式ですと、0 ~ 配列変数の要素の総数、の範囲で乱数を求めることになります。
例えば int_a が 10 個の要素を持っている時、0 ~ 10 までの乱数を求めてランダムに要素を1つ取るとすると、最大の 10 が出た時には int_a[ 10 ] を取ることになります。
しかし、配列変数のインデックスは 0 から始まるので int_a は 0 から 9 番までしかなく、10 番を指定したのでは値の取得に失敗してしまいます。
関数内で、乱数で選んだインデックス(変数 int_r )と int_a の要素の総数を表す a_length の値を監視してみると分かるのですが、値の取得に失敗して「 ,, 」と歯抜けになるのは乱数(= int_r )と a_length が同じになった場合で、運よく1度も同じにならなかった時はこの問題は起こりません。

- - - - -

Math.random で任意の範囲の乱数を発生させる式が、Adobe 社のホームページで紹介されています。

 ・Math.random() でランダムな整数を取得する方法
  http://kb2.adobe.com/jp/cps/228/228622.html

ご参考になさった作例では、この式を利用して配列変数 int_a のインデックスの範囲内で乱数を決めて任意の要素を1つ抜き取り、それを別の配列変数 int_b の先頭から順に詰めていく、といった方法をとっていると思われます。

int_a の要素は最初は変数 maxN と同じ数、ご提示のスクリプトですと 10 個あるのですが、配列変数のインデックスは 0 から始まるので、最後の要素は int_a[ 9 ] です。
ですから、抜き取る要素を決める乱数は 0 ~ 9 の範囲で求めます。最大値の 9 とは、maxN - 1 のことです。
すると、先の式に当てはめますと、

 Math.floor( Math.random() * ( ( maxN - 1 ) - 0 + 1 ) ) + 0

これを整理しますと、

 Math.floor( Math.random() * maxN );

になります。

int_a から splice メソッドで要素を抜き取ると配列変数の要素が少なくなっていきますから、要素が減った分だけ乱数の範囲も狭めていかなければなりません。
抜き取ってなくなった数は、値を抜き取った時にカウントを取っている変数 j を見ると分かります。
合わせますと、int_a の 0 ~最大インデックスの間で乱数を求める式は

 Math.floor( Math.random() * ( maxN - j ) );
 
となります。


* * *

今回の件での変数 maxN とは、初期状態の int_a の要素の総数と同じ意味です。
配列変数の要素の総数は length プロパティに記録されており、要素を削除・追加した時には length プロパティは自動的に修正されます。
この点を利用して、

(↓ 各行頭に全角のスペースが入っています。コピーする際はご注意ください)


//***

 //抜き取った値をint_bに詰める時のインデックス
 var j:Number = 0;

 //int_aの要素が尽きるまでループ
 while( int_a.length )
 {
  //抜き取る要素をランダムに選ぶ
  var int_r:Number = Math.floor( Math.random() * int_a.length );

  //int_aの要素を抜き取り、int_bの先頭から詰めていく
  int_b[ j ] = int_a.splice( int_r , 1 );

  //値を詰めるインデックスを更新
  j++;
 }

//***

と、書くこともできます。


なお、繰り返しますが、配列変数のインデックスは”0 から”始まり、最後は”要素の総数 - 1 ”です。
配列変数 int_b の値を for ループで全部取り出す時は、

 for( i = 0 ; i < int_b.length ; i++ )

というように書きます。
先頭は1番ではありませんので、ご注意ください。
    • good
    • 0
この回答へのお礼

丁寧でわかりやすい解説ありがとうございました。
別の書きかたでのコードも大変参考になりました。

for( i = 0 ; i < int_b.length ; i++ )
の部分ですが,どうしても配列の0番目からではなく1番目~10番目に格納したかったので
そのように記述してしまいました。

しかし0~9番目に入れて後で新しい配列に入れなおせばよかったのですね。

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

お礼日時:2011/04/14 17:03

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q数字をランダムに表示してくれる機械がほしいです。

タイトルにもありますが、ビンゴゲームで使う機械のような、好きな範囲で、好きな個数の

数字をランダムに表示してくれる機械などありますでしょうか?

上記の機能だけならエクセルの関数を使って簡単に再現できるのですが、

なるべくパソコンを使わない、コンパクトで電気をあまり使わない形で使いたいのです。

また、商品として売られていないのであれば、そういった機械をオーダーメイドで作ってくれる

お店などありませんでしょうか?

以上、どなたかご教示頂きますよう、お願い致します。

Aベストアンサー

非安定マルチバイブレータかCMOSインバーターでクロックを得て、それを不定期に断続してカウンターで計測すれば目的は達せられます、

ヤフー知恵袋の工学のカテゴリーで、CMOSロジックicで乱数を発生させるや、電子サイコロや7セグメントLEDで表示させるスロットマシンの作り方等で質問をしてみたら如何でしょうか?

ただし、回答がもらえるまでくだらない事で荒れるのがヤフーですのでエラソーに回答をするバカや基地外は適当にあしらって下さい、

とりあえずは解決へのヒントまで…

QFlash professional CS5を使っており,AS3.0で

Flash professional CS5を使っており,AS3.0で記述しています。




外部swf(test.swf)をムービークリップ(my_mcとしました)に読み込むには
どのようにコードを記述すればよいのでしょうか?



MovieClipLoaderを使う物や


var urlReq:URLRequest=new URLRequest("test.swf");
var swfLoader:Loader=new Loader();
swfLoader.load(urlReq);


このようにロードする方法は見つかったのですが


my_mc = loader.content as MovieClip;

などとしても
ムービークリップに読み込めません。
いろいろ試したのですが直接ステージに読み込まれて表示されたり,エラーも起こらず表示されなかったりします。




よろしくお願いします。

Aベストアンサー

ActionScript 2.0 以下ではないのですから
「ムービークリップ(または root) にロードする」 という考え方自体を変えないとだめです。

「ムービークリップ(または root) にロードする」 のではなくて
「Loaderにロードして そのLoaderをムービークリップ(または root) に addChild する」 のです。

QjQueryを使ってランダムに表示

jQueryを使って5つのボックス要素を、ランダムに3つ表示させています。
現在はページを読み込むたびに表示を切り替えていますが、これを「一定時間で表示を切り替え」に変更する事は可能でしょうか?
できればjsのみの修正でできれば良いのですが…。
どなたかお助けください。よろしくお願いいたします。
jsとhtmlは以下のようにしています。

jQuery(function($) {

$.fn.extend({
randomdisplay : function(num) {
return this.each(function() {
var chn = $(this).children().hide().length;
for(var i = 0; i < num && i < chn; i++) {
var r = parseInt(Math.random() * (chn - i)) + i;
$(this).children().eq(r).show().prependTo($(this));
}
});
}
});

$(function(){
$("[randomdisplay]").each(function() {
$(this).randomdisplay($(this).attr("randomdisplay"));
});
});

});


<div randomdisplay="3">
<div id="box">ランダム1</div>
<div id="box">ランダム2</div>
<div id="box">ランダム3</div>
<div id="box">ランダム4</div>
<div id="box">ランダム5</div>
</div>

jQueryを使って5つのボックス要素を、ランダムに3つ表示させています。
現在はページを読み込むたびに表示を切り替えていますが、これを「一定時間で表示を切り替え」に変更する事は可能でしょうか?
できればjsのみの修正でできれば良いのですが…。
どなたかお助けください。よろしくお願いいたします。
jsとhtmlは以下のようにしています。

jQuery(function($) {

$.fn.extend({
randomdisplay : function(num) {
return this.each(function() {
var chn = $(this).children().hide().length;
for(var i = 0; i...続きを読む

Aベストアンサー

ランダム表示する関数を呼び出している部分を関数にして、setIntervalで繰り返して呼んであげればいいんでないでしょうか。

https://developer.mozilla.org/ja/docs/Web/API/window.setInterval

QAS3.0 二次元配列でムービークリップが出来ない

Actionscript3.0 超初心者です。 二度目の質問です。 
40x80のマス目をエクセルマクロが使えない人のためにFlashで表示させようとしています。

ライブラリーのMC mark_mcを二次元配列で並べようとしていますが、うまく行きません。
試しに一次元配列だと下記のコードでエラーが出なくうまく表示されます。

var mc_array:Array = new Array();
mc_array[3]=new mark_mc();
addChild(mc_array[3]);
mc_array[3].scaleX = 0.5;
mc_array[3].scaleY = 0.5;
mc_array[3].x = 300;
mc_array[3].y = 200;

二次元にして
var mc_array:Array = new Array();
mc_array[3][2]=new mark_mc();
addChild(mc_array[3][2]);
mc_array[3][2].scaleX = 0.5;
mc_array[3][2].scaleY = 0.5;
mc_array[3][2].x = 300;
mc_array[3][2].y = 200;

こうすると、TypeError: 「Error #1010: 条件は未定義であり、プロパティがありません。」が出てしまいます。 [3][2]の部分はfor文でデータをマス目に作ろうとしています。

基本的に間違っているのでしょうか?

Actionscript3.0 超初心者です。 二度目の質問です。 
40x80のマス目をエクセルマクロが使えない人のためにFlashで表示させようとしています。

ライブラリーのMC mark_mcを二次元配列で並べようとしていますが、うまく行きません。
試しに一次元配列だと下記のコードでエラーが出なくうまく表示されます。

var mc_array:Array = new Array();
mc_array[3]=new mark_mc();
addChild(mc_array[3]);
mc_array[3].scaleX = 0.5;
mc_array[3].scaleY = 0.5;
mc_array[3].x = 300;
mc_array[3].y = 2...続きを読む

Aベストアンサー

結論から書けば
単純に二次元目を配列定義していないからですね。
(一次元目の要素を配列定義していないからです。)

次のようにすれば良いでしょう。

var mc_array:Array = new Array();
//↓※ mc_array[3] を配列とする
mc_array[3] = new Array();
mc_array[3][2]=new mark_mc();
addChild(mc_array[3][2]);
mc_array[3][2].scaleX = 0.5;
mc_array[3][2].scaleY = 0.5;
mc_array[3][2].x = 300;
mc_array[3][2].y = 200;

 ↑または↓

var mc_array:Array = new Array();
mc_array[3]=[ , , new mark_mc()];
addChild(mc_array[3][2]);
mc_array[3][2].scaleX = 0.5;
mc_array[3][2].scaleY = 0.5;
mc_array[3][2].x = 300;
mc_array[3][2].y = 200;

2つ目の書き方のバリエーションは
場合に応じて無数にあります。


 

===解説(無視しても良い雑談混じりの話)======

驚かれることかもしれませんが
そもそも ActionScript には
(その他 JavaScript など ECMAScript や C++ や Java などにも)
正確(狭義)な意味での 二次元配列(多次元配列) など存在しないのです。
次元的に言えば一次元の配列までしか存在しません。

mc_array[3][2] みたいなのを
広義な意味合いで,
普通に 二次元配列(多次元配列) という言い方はしますし
それで間違いではないです。
しかし厳密に言うなら
それは 二段階配列(多段階配列/ジャグ配列) なのです。


ActionScript や Java などなどの配列には
そもそも一次元配列しかありませんが
配列の要素としてさらに配列を入れることができるため
(一次元配列はいくらでも入れ子にできるため),
その 多段階配列 をもって 多次元配列 として使っているだけです。



身近な逆例として
MS Excel の VBA などには 多次元配列 が存在します。
(VBA には 多段階配列 も存在します。)

例えば Excel VBA で

配列名 = Cells(開始行,開始列).Resize(最終行,最終列).Value

のようなコードを書けば
自動的に二次元配列ができます。

仮に

SheetArray = Cells(1, 1).Resize(5, 5).Value

のようなコードを書いたとするなら

MsgBox SheetArr(3, 2)

でも

MsgBox Cells(3, 2).Value

でも同じ「B3」セルの値が表示されます。

※ SheetArr(3, 2) です SheetArr(3)(2) ではありません
※ SheetArr(3, 2)←多次元,SheetArr(3)(2)←多段階


一方 ActionScript では

var mc_array:Array = new Array();

のようなコードを書いたとしても
一次元配列しかできないため
いきなり

mc_array[3][2]

などとアクセスされても
「そんなもの未定義だよ!」
というエラーになってしまうのです。



もっとも
ActionScript などの場合は
new Array() などと一々書かなくても
○○ = []
で自動的に 配列○○ ができるため
二次元目(狭義での二段階目)に
new Array() を書かない場合も出てきます。


◎ 二次元目(二段階目)に new Array() を書かない一般例↓

【例1】

var my_arr:Array = new Array();

my_arr.push(["00","01","02","03","04"]);
my_arr.push(["10","11","12","13","14"]);
my_arr.push(["20","21","22","23","24"]);
my_arr.push(["30","31","32","33","34"]);

trace(my_arr[3][2]); //→「32」が出力される



【例2】

var my_arr:Array = new Array();

for (var i:int = 0; i<=3; i++) {
my_arr[i] = [i + "0", i + "1", i + "2", i + "3"];
}

trace(my_arr[3][2]); //→「32」が出力される



【例3】(こんな書き方もできます)

var my_arr:Array = [[],[],[],[]];

for (var i:int = 0; i<=my_arr.length-1; i++) {
for (var j:int = 0; j<=3; j++) {
my_arr[i][j] = String(i) + j;
}
}

trace(my_arr[3][2]); //→「32」が出力される



上の【例1~3】は,
どれも一見
my_arr[0] = new Array();
my_arr[1] = new Array();
my_arr[2] = new Array();
my_arr[3] = new Array();
と書いていないように見えますが
書いていないように見えるだけで
実は書いているのと同じことなのです。




細かいことを書きましたが
ActionScript などで 二次元配列(多次元配列) という言葉を使うことは間違いではありません。
すごいプロの方でも普通に 二次元配列(多次元配列) という言葉を使用しています。
ですから言い方に気を付ける必要はありません。

ただ
多次元的(多段階的)な配列を作るのでしたら
配列の中に配列を定義(作成)しなければ
多次元的な配列はできないということです。
(理由:ActionScript には本当の意味での多次元配列は存在しないため一発では定義できないから)
(var my_arr = new Array(2); ←これでは要素数2の配列ができるだけ)

結論から書けば
単純に二次元目を配列定義していないからですね。
(一次元目の要素を配列定義していないからです。)

次のようにすれば良いでしょう。

var mc_array:Array = new Array();
//↓※ mc_array[3] を配列とする
mc_array[3] = new Array();
mc_array[3][2]=new mark_mc();
addChild(mc_array[3][2]);
mc_array[3][2].scaleX = 0.5;
mc_array[3][2].scaleY = 0.5;
mc_array[3][2].x = 300;
mc_array[3][2].y = 200;

 ↑または↓

var mc_array:Array = new Array();
mc_array[3]=[ , , new mark_mc()];
a...続きを読む

Q配列変数に重複のないランダムな数字を入れて行くには?

JavaScript初心者です。
配列にランダムな数字を入れたいのですが、

aRnd = new Array();
aRnd[0] = Math.floor(Math.random()*100);
aRnd[1] = Math.floor(Math.random()*100);
aRnd[2] = Math.floor(Math.random()*100);

のようにやると各配列にはランダムな数字が入りますが、重複が発生する可能性があります。これを重複が発生しないようにしたいのですが、どのようにすればいいのでしょうか?
なお、上記例では0~99までの数字を3つの配列にセットする方法となっていますが、配列数や数字の最大値は変更する可能性があるので、これも配慮したいと思います。
よろしくお願いいたします。

Aベストアンサー

アルゴリズム的なアドバイスしかできませんが、参考になればと思います。

値をaRnd[n]に入れた後に、aRnd[0]~aRnd[n-1]とanRnd[n]を比較していきます(IFとかforを使う)。
同じ値が見つかった場合、nを-1してもう一度実行しなおせばいけます。

Q【Flash As3.0 音データをインスタンス内にもってくる方法につ

【Flash As3.0 音データをインスタンス内にもってくる方法について】

WinXP
AdobeFlashCs4

現在音楽の再生ソフトを制作しており、その中で、
SoundMixer.computeSpectrumで音に反応するビジュアライザーを作ってます。

visualというインスタンスを作り、
その中に音反応用のプログラムを書きました。

メインの1フレーム目に音を読み込むための↓
var sndCh:SoundChannel;
var snd:Sound=new Sound();
snd.load(new URLRequest("music.mp3"))
と停止・再生。

visualというムービークリップの1フレーム目に
音反応。

実際動いているのですが、どうしてもnullのオブジェクト参照のプロパティーにアクセスすることはできませんのエラーが出てしまいます。

addEventListener(Event.ENTER_FRAME, onEnterFrame);
sndCh.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
visualのインスタンス内のスクリプト内で
sndChをうまく呼び出せてないことが原因というのはわかってるのですが
対処方法がわかりません。

ご教授いただけないでしょうか?
よろしくお願いいたします。

【Flash As3.0 音データをインスタンス内にもってくる方法について】

WinXP
AdobeFlashCs4

現在音楽の再生ソフトを制作しており、その中で、
SoundMixer.computeSpectrumで音に反応するビジュアライザーを作ってます。

visualというインスタンスを作り、
その中に音反応用のプログラムを書きました。

メインの1フレーム目に音を読み込むための↓
var sndCh:SoundChannel;
var snd:Sound=new Sound();
snd.load(new URLRequest("music.mp3"))
と停止・再生。

visualというムービークリップ...続きを読む

Aベストアンサー

snd.load(new URLRequest("music.mp3"))

↑が終わってから↓を実行すると、直ると思います。

addEventListener(Event.ENTER_FRAME, onEnterFrame);
sndCh.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);

Qランダム表示文字について

if ( open( IN,"hoge.txt" ) ) {
  @line = <IN>;
  close( IN );
} else {
  exit;
}

$random1 = @line[rand(@line)];
$random2 = @line[rand(@line)];
$randam3 = @line[rand(@line)];

テキストファイルから1行文字をランダムに表示するプログラムを書き実行できたのですが、このままだとrandom1,2,3の変数に同じものが入ってしまう可能性があります。
これで全て違うものが入るようなプログラムを書きたいのですが、そのようなことは可能でしょうか?

Aベストアンサー

if ( open( IN,"hoge.txt" ) ) {
  @line = <IN>;
  close( IN );
} else {
  exit;
}


splice()関数というのが使って実現してみました。
splice(@line, 5, 1) とすれば、@line,の5番目の1個分の要素を削除することを意味します。そしてこの関数は取り除かれた部分のリストを返します。
こちらで、勝手ながら$randam1等を$randam[1]と配列にしてしまえば、

for($i=1; $i<=3; $i++){

my $n = rand(@line);#乱数

$random[$i] = splice(@line,$n,1);

}

forループ使わないで、runner_h_aさんのソースの通りランダムに取得する行が3つくらいで少ない場合は、

$random1 = splice(@line,rand(@line),1);
$random2 = splice(@line,rand(@line),1);
$randam3 = splice(@line,rand(@line),1);

でいけると思いますが、動作確認はしてません。

if ( open( IN,"hoge.txt" ) ) {
  @line = <IN>;
  close( IN );
} else {
  exit;
}


splice()関数というのが使って実現してみました。
splice(@line, 5, 1) とすれば、@line,の5番目の1個分の要素を削除することを意味します。そしてこの関数は取り除かれた部分のリストを返します。
こちらで、勝手ながら$randam1等を$randam[1]と配列にしてしまえば、

for($i=1; $i<=3; $i++){

my $n = rand(@line);#乱数

$random[$i] = splice(@line,$n,1);

}

forループ使わないで、runne...続きを読む

QFlash AS3.0でPSD読込みは可能ですか?

お世話になります。
FlashのActionScript3.0を使ってPhotoshopのPSDファイルを読み込むことは可能でしょうか?
WEB上で条件に応じてFlash上に様々な画像(JPG)とPSDファイルを読み込んで合成して表示したいと考えています。
手動でFlashの「読み込み」機能を使ってPSDファイルを取り込めることはわかったのですが、条件に応じてPSDファイルを自動で取り込む方法を自分なりに探して見たのですが良く分かりません。そもそも不可能なのでしょうか?
画像(JPG)とPSDファイルを合成した全ての組合せをJPG形式で準備しておけば良いのでしょうけど、それは避けたいと考えています。
何か良い案があればご教授いただけると助かります。
手持ちのFlash、Photoshopのバージョンは共にCS4です。
よろしくお願い致します。

Aベストアンサー

不可能ではないですが、現実的ではありません。
簡単に方法を示すと、
1.PSDを読み込む(またはダウンロードする)
2.PSDのフォーマットを解析する(PSDのデータ構造に関する知識が必要。下記リンク参照)
3.Photoshopのフィルタ効果を自作する
4.最終的にできたデータからビットマップを起こす
となりますが、非常に低速な、負荷のかかる処理となるでしょう。
また、そこまで作るのに多大な工数を要すると思います。(最速でも数か月レベル)

もう少し何がしたいのかを具体的に説明できれば、
もっとベストな代替方法が見えてくるかもしれません。

参考URL:http://www.fileformat.info/format/psd/egff.htm

Q小文字、大文字、記号をランダム表示

このプログラムは英大文字をランダムに表示するプログラムなのですが、これを小文字と記号も合わさった形で出力されるように改造するにはどうしたらいいでしょうか。コードを添えて下さると助かります。

import java.util.Random;

public class Aruf{
public static void main(String[] args) {

//Randomクラスのインスタンス化
Random rnd = new Random();

//変数の宣言
int ran;
int a;
char c;

//10回繰り返す
for(int b=0;b<10;b++){
//0~25の乱数を作成
ran = rnd.nextInt(26);

//65を足して65~90にする
a = 65 + ran;

//charに型変換
c = (char)a;
//表示
System.out.print(c);
}
}
}

このプログラムは英大文字をランダムに表示するプログラムなのですが、これを小文字と記号も合わさった形で出力されるように改造するにはどうしたらいいでしょうか。コードを添えて下さると助かります。

import java.util.Random;

public class Aruf{
public static void main(String[] args) {

//Randomクラスのインスタンス化
Random rnd = new Random();

//変数の宣言
int ran;
int a;
char c;

//10回繰り返す
for(int b=0;b<10;b++)...続きを読む

Aベストアンサー

//0~51の乱数を作成
ran = rnd.nextInt(52);

if(ran <= 25){
 //65を足して65~90にする 大文字
 a = 65 + ran;
}
else{
 //71を足して97~122にする 小文字
 a = 97 - 26 + ran;
}

QフルFlash、swfファイルの読み込みについての考え方(as3.0)

フルFlash、swfファイルの読み込みについての考え方(as3.0)

こんにちは。
Flashのas3.0を始めて半年程度の者です。
長文ですが宜しくお願い致します。

下記のような構造のフルFLASHページを作りたいと考えております。

■大まかな階層構造
・index.html(opening.swfを100%で読み込む指定)
・opening.swf(最初に流れるアニメーション。最後のフレームに行くとmain.swfを読み込む指定)
・main.swf(フルFLASH)

/// opening.swfの最終フレームに記述 ///
stop();
var loader:Loader = new Loader();
var url : URLRequest = new URLRequest("main.swf");
loader.load(url);
stage.addChild(loader);

上記の記述でmain.swfを読み込むことは出来るのですが、
アニメーションのopening.swfを非表示にする方法が分かりません。

loader.addEventListener(Event.UNLOAD,・・・);
という記述でロードしたswfを非表示にする方法は分かるのですが、
opening.swfは直接index.htmlのタグに埋め込んでいる為、うまく機能しないのではと思っております。


■私が思いついた対策
・index.html(background.swfを100%で指定)
・background.swf(とりあえずhtmlに埋め込んでおくswf) ←コレを追加!!
・opening.swf(最初に流れるアニメーション。最後のフレームに行くとmain.swfを読み込む。)
・main.swf(フルFLASH)

上記の階層構造で、background.swfを常に背景感覚で表示させ、
opening.swfもmain.swfもloadで切り替えれば実現は出来るかと思います。

只、この方法が一般的に適切な方法なのかどうか疑問に思いました。
オープニングアニメーション ⇒ フルFLASHという流れをつくるには、どういう作り方が一般的なのでしょうか?
出来ればJSは絡ませず、htmlとflashの指定だけで完結出来ればと思っております。

考え方だけどもご教授頂ければ助かります。
何卒、宜しくお願いいたします。

フルFlash、swfファイルの読み込みについての考え方(as3.0)

こんにちは。
Flashのas3.0を始めて半年程度の者です。
長文ですが宜しくお願い致します。

下記のような構造のフルFLASHページを作りたいと考えております。

■大まかな階層構造
・index.html(opening.swfを100%で読み込む指定)
・opening.swf(最初に流れるアニメーション。最後のフレームに行くとmain.swfを読み込む指定)
・main.swf(フルFLASH)

/// opening.swfの最終フレームに記述 ///
stop();
var loader:Loader = new Loader();
var ur...続きを読む

Aベストアンサー

わざわざふたつのSWFの読み込みをコントロールしなくても、
opening.swfのアニメーションをひとつのムービークリップにしてルートに配置し、
main.swf読み込みと同時にvisibleで消しちゃえば良いんでないでしょうか。

一般的な手法というのはその時々によって異なりますので、
コレというのはありません。


人気Q&Aランキング

おすすめ情報