- ベストアンサー
ランダムで画像を表示させるには?
- FlashCS5の環境でアクションスクリプト3.0を使用して、複数の画像をランダムに表示させる方法を教えてください。
- 現在のスクリプトでは画像がループして切り替わってしまうため、1回のみランダムに画像を表示させたいです。
- おみくじのようにランダムに画像を表示し、最初に表示された画像で停止させる方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
おみくじみたいに1回のみ1枚をランダム表示をさせるだけでしたら スクリプトを改造するというほどのことでもないと思います。 単に var myTimer:Timer = new Timer(3000); この行↑を含む それ以下の行を全て消せば良いだけだと思います。 つまりわざわざ 「タイマーを使って 3000 ミリ秒間隔で randomShowMC() を実行する」 ということをしなければ良いだけでしょう。 この件に関しましては以上です。 ===================== > 又は、 > ムービーインスタンス「mc0」から「mc4」の画像をランダムで > 表示させ、最初に表示された、 > その画像で停止させるスクリプト ↓それは少々頭を使いますね↓ -------------------------------- //[0,1,2,3,4] という要素の配列 n_arr を作成 var n_arr:Array = new Array(0,1,2,3,4); //最初のMCを入れる変数の宣言 var first_mc:MovieClip; //関数 randomShowMC の定義 function randomShowMC(e:TimerEvent):void { //一旦 全MCを非表示にする for (var i:int=0; i<5; i++) { this["mc" + i].visible = false; } //もし配列の要素数が0でなければ if (n_arr.length != 0) { //配列の要素分の乱数を求める var rnd:int = Math.floor(Math.random() * n_arr.length); //配列から乱数要素を抜きとりその要素を取得 var n:int = n_arr.splice(rnd,1); //first_mc が未登録であれば if (first_mc == null) { //ランダムなMCを first_mc に登録 first_mc = this["mc" + n]; } //ランダムなMCを表示 this["mc" +n].visible = true; //もし配列の要素数が0であれば } else { //最初のMCを表示 first_mc.visible = true; //タイマーイベントを削除 myTimer.removeEventListener(TimerEvent.TIMER ,randomShowMC); } } //関数 randomShowMC を実行:初回実行 randomShowMC(null); //タイマーインスタンスを作成 var myTimer:Timer = new Timer(3000); //タイマーイベントをセット myTimer.addEventListener(TimerEvent.TIMER ,randomShowMC); //タイマースタート myTimer.start(); --------------------------------
その他の回答 (1)
- DPE
- ベストアンサー率85% (666/776)
配列変数を使ってみてはいかがでしょう。 次のように考えます。 配列変数にムービークリップ mc0 ~ mc4 の参照を入れ、配列変数の中身をランダムに並べ替えます。 この状態で配列変数の先頭から順に値を取り出していくと、mc0 ~ mc4 を、ランダムな順番でそれぞれ1回だけ参照できます。 配列変数のどの番号(インデックス)から値を取り出すのかを変数に記録し、1つ取り出すごとにこの変数の値を + 1 します。配列変数の最後の要素に達したら終了です。 スクリプトの一例です。 ステージにムービークリップのインスタンス mc0 ~ mc4 があるとします。 このスクリプトは、メインのタイムラインに記述してください。 字数の都合上、インデントを省略させていただきました。見辛くて申し訳ありませんが、コピーしてそのまま使えます。 //*** //再生する順番を管理する配列変数 //内容はムービークリップの参照 var clip_tbl:Array = new Array(); //現在の参照インデックス var inx:uint = 0; //タイマー var myTimer:Timer = new Timer( 3000 ); //再生するムービークリップを切り替える関数 function randomShowMC( eventObj:TimerEvent ):void { //配列変数の参照位置を更新 inx++; //次のムービークリップはあるか? //ある場合は、現在のムービークリップを非表示にして次を表示 if( inx < clip_tbl.length ) { clip_tbl[ inx - 1 ].visible = false; clip_tbl[ inx ].visible = true; } //ない場合はタイマーを停止 else { myTimer.stop(); } } //初期化関数 function Init():void { var i:int , rnd1:int , rnd2:int; var temp:MovieClip; //配列変数にムービークリップの参照を格納 for( i = 0 ; i < 5 ; i++ ) { clip_tbl[ i ] = this[ "mc" + i ]; //最初は全て非表示にする clip_tbl[ i ].visible = false; } //配列変数内のデータを20回シャッフル for( i = 0 ; i < 20 ; i++ ) { //要素を2つ、ランダムに選ぶ rnd1 = Math.floor( Math.random() * clip_tbl.length ); rnd2 = Math.floor( Math.random() * clip_tbl.length ); //選んだ要素の値を取り換える temp = clip_tbl[ rnd1 ]; clip_tbl[ rnd1 ] = clip_tbl[ rnd2 ]; clip_tbl[ rnd2 ] = temp; } //最初のムービークリップを表示 clip_tbl[ 0 ].visible = true; //タイマーをセット myTimer.addEventListener( TimerEvent.TIMER , randomShowMC ); myTimer.start(); } //初期化を実行 Init(); //*** 配列変数を使って重複のないランダムな並びを得る方法はいろいろあります。 上記のスクリプトでは簡単なところで、ランダムに選んだ2つを取り換えることを繰り返す方法を使っています。 それから、 > 表示後の画像が切り替わらずそのままで停止 とはもしや、先に表示された画像を非表示にせずに表示したまま残しておきたい、とのことでしょうか? その場合は、randomShowMC 関数内の clip_tbl[ inx - 1 ].visible = false; ↑ この1行をコメントにするか削除してください。 なお、最後の画像の後に最初に戻したい場合は、配列変数の最後に最初と同じ値をコピーしてしまうのが一番簡単だと思います。 Init 関数内の並べ替えの処理の後に //最初の要素を最後にコピー clip_tbl.push( clip_tbl[ 0 ] ); を追加してみてください。
お礼
DPEさん: ご回答有難うございます。 このやり方で出来ました…。しかも他のバリエーションまでアドバイスいただきまして有難うございました。色々と試す事ができました。お陰様で、かなり勉強になりました。 お忙しい中、本当に有難うございました。
お礼
BlurFiltanさん: ご回答有難うございました。 今回もとっても勉強になりました。 図解でさらに解り易くて勉強になりました。 >単に >var myTimer:Timer = new Timer(3000); >この行↑を含む >それ以下の行を全て消せば良いだけだと思います。 これだけで、おみくじみたいになりました。 さらには、バリエーションまで…有難うございました。 実際にやってみて出来ました。 お忙しい中、本当に有難うございました。