• 締切済み

配列のシャッフル

MCの中のフレーム1にイラストA、フレーム2にイラストB、フレーム3にイラストCを置いてそれぞれボタン化(btnA、btnB、btnC)し、 そのMCをコピーしてタイムライン上に3つ配置して、ランダムに被らないように表示して、btnAをクリックすると、シャッフルしてランダムに再び表示するというのを1フレーム内でやりたいのですがどうしたらいいでしょうか? 配列のシャッフルを使うというのは分かったのですが、その後が分からなくて・・・ 環境はFLASH8です

  • Flash
  • 回答数1
  • ありがとう数2

みんなの回答

  • perse
  • ベストアンサー率74% (113/152)
回答No.1

MC └1フレーム目:btnA  2フレーム目:btnB  3フレーム目:btnC   というムービークリップをタイムライン上の1フレーム目に3つ配置。 それぞれbtnA,btnB,btnCが重複しない様にランダムに表示して btnAを押したらシャッフルすると言う事でしょうか? タイムラインに配置したムービークリップに mc0,mc1,mc2とインスタンス名をつけます。 タイムライン1フレーム目に以下のスクリプトを書きます //シャッフル関数 function shuffle() { //移動先フレームを配列で管理 var frame = new Array(1, 2, 3); //フレームArrayシャッフル for (var i = 0; i<frame.length; i++) { r = Math.floor(Math.random()*frame.length); temp = frame[i]; frame[i] = frame[r]; frame[r] = temp; } //表示 for (i=0; i<3; i++) { //表示するフレーム取得 f = frame[i]; //フレーム移動 _root["mc"+i].gotoAndStop(f); } } //初期表示用にシャッフル関数を呼ぶ shuffle(); //------------------------------------------------ btnAに以下のスクリプトを書きます。 on (release) { //タイムラインに記述した関数を呼ぶ _root.shuffle(); }

supertentu
質問者

お礼

やりたいことができました! 本当にありがとうございました

関連するQ&A

  • AS3のコードをシンプルに

    AS3のコードについてご教授お願いします。 下記のようなコードがあるとします。 btnA_mc.addEventListener(MouseEvent.CLICK,aClick); btnB_mc.addEventListener(MouseEvent.CLICK,bClick); btnC_mc.addEventListener(MouseEvent.CLICK,cClick); function aClick(e:MouseEvent):void { this.gotoAndPlay("A"); // trace("Aclick"); btnB_mc.addEventListener(MouseEvent.CLICK,bClick); btnC_mc.addEventListener(MouseEvent.CLICK,cClick); btnA_mc.removeEventListener(MouseEvent.CLICK,aClick); } function bClick(e:MouseEvent):void { this.gotoAndPlay("B"); // trace("Bclick"); btnA_mc.addEventListener(MouseEvent.CLICK,aClick); btnC_mc.addEventListener(MouseEvent.CLICK,cClick); btnB_mc.removeEventListener(MouseEvent.CLICK,bClick); } function cClick(e:MouseEvent):void { this.gotoAndPlay("C"); // trace("Cclick"); btnA_mc.addEventListener(MouseEvent.CLICK,aClick); btnB_mc.addEventListener(MouseEvent.CLICK,bClick); btnC_mc.removeEventListener(MouseEvent.CLICK,cClick); } btnA_mc.buttonMode = true; btnB_mc.buttonMode = true; btnC_mc.buttonMode = true; この中の、 btnA_mc.addEventListener(MouseEvent.CLICK,aClick); btnB_mc.addEventListener(MouseEvent.CLICK,bClick); btnC_mc.removeEventListener(MouseEvent.CLICK,cClick); のような、重複する部分を、配列か何かでまとめたいのですが、いまいち方法が分かりません。 ボタンAをクリックで、ボタンAは効かなくなる。ボタンBorCをクリックでボタンAが復活みたいな感じです。 宜しくお願いします。 flashCS3 ASはver3.0でお願いします。

    • ベストアンサー
    • Flash
  • スクリプトの記述について

    FlashMXでゲームを作成しています。 MCの、例えば5フレーム目が表示されているときに、メインタイムラインのクローズボタンをクリックするとその5フレーム目の画像が消えるというような スクリプトはどう書けばいいのでしょうか。 クローズボタン(インスタンス名close_btn)に、 on(release){ if(○○○○){ ~のようなものになると思うのですが。 MCはメインタイムラインに配置されていて、ダブルクリックすると MC独自のライムラインになったときの5フレーム目です。 ゲームはいわゆる脱出系で、この部分だけがわからずにいます。 MCのインスタンス名はabout1としています。

    • ベストアンサー
    • Flash
  • AS3.0でギャラリーのボタンの透明度を変えたい

    環境:MacOSX Flash CS5 AS3.0 写真がステージに読み込まれた際にその写真に該当するボタンの透明度を 50%にしたいと思ったのですが、うまくいかなくて困っています。 btnArr[imageNum].alpha = 0.5; 上記のスクリプトでいけるとおもったのですが、うまくいきません。。 別の写真がステージに配置された時には透明度を戻したいのですが 分からず困っています。 どなたかどうかよろしくお願いします。 // 写真のURLを保存する配列 var photoArr:Array // var btnArr:Array // 写真を自動的に変更するタイマー var imageTimer:Timer; // 大きな画像を読み込むローダー var bigImageLoader:Loader; // 現在表示されている画像の番号 var imageNum:Number = 0; //-------------------------------- // 初期化の処理 //-------------------------------- // 配列を設定する photoArr = new Array(); photoArr[0] = "c00.jpg"; photoArr[1] = "c01.jpg"; photoArr[2] = "c02.jpg"; photoArr[3] = "c03.jpg"; photoArr[4] = "c04.jpg"; // btnArr = new Array(); btnArr[0] = btnA; btnArr[1] = btnB; btnArr[2] = btnC; btnArr[3] = btnD; btnArr[4] = btnE; // タイマーを起動 startTimer(); // 大きな画像を読み込む loadImage(); // タイマーをスタートする function startTimer() { imageTimer = new Timer(1000, 0); imageTimer.start(); imageTimer.addEventListener(TimerEvent.TIMER, onTimerCalled); } // タイマーが呼ばれるたびに実行される function onTimerCalled(evt) { btnA.y -= 85; btnB.y -= 85; btnC.y -= 85; btnD.y -= 85; btnE.y -= 85; if(btnA.y <= 0){ btnA.y = 380; } if(btnB.y <= 0){ btnB.y = 380; } if(btnC.y <= 0){ btnC.y = 380; } if(btnD.y <= 0){ btnD.y = 380; } if(btnE.y <= 0){ btnE.y = 380; } imageNum+=1; if (imageNum >= photoArr.length) { imageNum = 0; } // 大きな画像を読み込む loadImage(); } //btn01をクリックした時の処理 btn01.addEventListener(MouseEvent.CLICK,xClick01); function xClick01(evt:Event):void { btnA.y -= 85; btnB.y -= 85; btnC.y -= 85; btnD.y -= 85; btnE.y -= 85; if(btnA.y <= 0){ btnA.y = 380; } if(btnB.y <= 0){ btnB.y = 380; } if(btnC.y <= 0){ btnC.y = 380; } if(btnD.y <= 0){ btnD.y = 380; } if(btnE.y <= 0){ btnE.y = 380; } imageNum+=1; if (imageNum >= photoArr.length) { imageNum = 0; } // 大きな画像を読み込む loadImage(); } //btn02をクリックした時の処理 btn02.addEventListener(MouseEvent.CLICK,xClick02); function xClick02(evt:Event):void { btnA.y += 85; btnB.y += 85; btnC.y += 85; btnD.y += 85; btnE.y += 85; if(btnA.y >= 381){ btnA.y = 40; } if(btnB.y >= 381){ btnB.y = 40; } if(btnC.y >= 381){ btnC.y = 40; } if(btnD.y >= 381){ btnD.y = 40; } if(btnE.y >= 381){ btnE.y = 40; } imageNum-=1; if (imageNum <= -1) { //photoArr.lengthを-1に変更 imageNum = 4; } // 大きな画像を読み込む loadImage(); } // 大きな画像を読み込む function loadImage() { // 新しい画像を読み込む var url = "gallery_img/"+photoArr[imageNum]; btnArr[imageNum].alpha = 0.5;//読み込まれた画像に該当するボタンの透明度を50%にする処理 var req = new URLRequest(url); bigImageLoader = new Loader(); bigImageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoad); bigImageLoader.load(req); mainTarget.addChild(bigImageLoader); } // 大きな画像が読み込まれたら実行される処理 function onImageLoad(eventObj) { bigImageLoader.alpha = 0; stage.addEventListener(Event.ENTER_FRAME, onFadeIn); } // フェードインをつける function onFadeIn(eventObj) { bigImageLoader.alpha += 0.1; } // フェードインの処理を取り除く if (bigImageLoader.alpha >= 1) { removeEventListener(Event.ENTER_FRAME, onFadeIn); }

  • AS3.0でフェードインできない

    まず制作環境ですが、 MacOSX Flash CS5 AS3.0 です。 下記スクリプト内の 「onFadeOut();」 が、効かずに困っています。 どなたかどうすればこの「onFadeOut();」が効く様になるか 教えていただけませんでしょうか? よろしくお願いいたします。 // 写真のURLを保存する配列 var photoArr:Array // var btnArr:Array // 写真を自動的に変更するタイマー var imageTimer:Timer; // 大きな画像を読み込むローダー var bigImageLoader:Loader; // 現在表示されている画像の番号 var imageNum:Number = 0; //-------------------------------- // 初期化の処理 //-------------------------------- // 配列を設定する photoArr = new Array(); photoArr[0] = "test01.swf"; photoArr[1] = "test02.swf"; photoArr[2] = "test03.swf"; photoArr[3] = "test04.swf"; photoArr[4] = "test05.swf"; // btnArr = new Array(); btnArr[0] = btnA; btnArr[1] = btnB; btnArr[2] = btnC; btnArr[3] = btnD; btnArr[4] = btnE; // タイマーを起動 startTimer(); // 大きな画像を読み込む loadImage(); // タイマーをスタートする function startTimer() { imageTimer = new Timer(2000, 0); imageTimer.start(); imageTimer.addEventListener(TimerEvent.TIMER, onTimerCalled); } // タイマーが呼ばれるたびに実行される function onTimerCalled(evt) { btnA.y -= 60; btnB.y -= 60; btnC.y -= 60; btnD.y -= 60; btnE.y -= 60; if(btnA.y <= 0){ btnA.y = 280; } if(btnB.y <= 0){ btnB.y = 280; } if(btnC.y <= 0){ btnC.y = 280; } if(btnD.y <= 0){ btnD.y = 280; } if(btnE.y <= 0){ btnE.y = 280; } onFadeOut(); // フェードアウトをつける function onFadeOut(eventObj) { bigImageLoader.alpha -= 0.1; } // フェードアウトの処理を取り除く if (bigImageLoader.alpha <= 0) { removeEventListener(Event.ENTER_FRAME, onFadeOut); //配置されている画像の削除 mainTarget.removeChild(bigImageLoader); } btnArr[imageNum].alpha = 1; // imageNum+=1; if (imageNum >= photoArr.length) { imageNum = 0; } // 大きな画像を読み込む loadImage(); } //btn01をクリックした時の処理 btn01.addEventListener(MouseEvent.CLICK,xClick01); function xClick01(evt:Event):void { btnA.y -= 60; btnB.y -= 60; btnC.y -= 60; btnD.y -= 60; btnE.y -= 60; if(btnA.y <= 0){ btnA.y = 280; } if(btnB.y <= 0){ btnB.y = 280; } if(btnC.y <= 0){ btnC.y = 280; } if(btnD.y <= 0){ btnD.y = 280; } if(btnE.y <= 0){ btnE.y = 280; } //ボタンの透明度を戻す処理 btnArr[imageNum].alpha = 1; imageNum+=1; if (imageNum >= photoArr.length) { imageNum = 0; } // 大きな画像を読み込む loadImage(); } //btn02をクリックした時の処理 btn02.addEventListener(MouseEvent.CLICK,xClick02); function xClick02(evt:Event):void { btnA.y += 60; btnB.y += 60; btnC.y += 60; btnD.y += 60; btnE.y += 60; if(btnA.y >= 281){ btnA.y = 40; } if(btnB.y >= 281){ btnB.y = 40; } if(btnC.y >= 281){ btnC.y = 40; } if(btnD.y >= 281){ btnD.y = 40; } if(btnE.y >= 281){ btnE.y = 40; } //ボタンの透明度を戻す処理 btnArr[imageNum].alpha = 1; imageNum-=1; if (imageNum <= -1) { //photoArr.lengthを-1に変更 imageNum = 4; } // 大きな画像を読み込む loadImage(); } // 大きな画像を読み込む function loadImage() { // 新しい画像を読み込む var url = "gallery_img/"+photoArr[imageNum]; //ボタンの透明度を戻す処理 btnArr[0].alpha = 1; btnArr[1].alpha = 1; btnArr[2].alpha = 1; btnArr[3].alpha = 1; btnArr[4].alpha = 1; //読み込まれた画像に該当するボタンの透明度を30%にする処理 btnArr[imageNum].alpha = 0.5; var req = new URLRequest(url); bigImageLoader = new Loader(); bigImageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoad); bigImageLoader.load(req); mainTarget.addChild(bigImageLoader); } // 大きな画像が読み込まれたら実行される処理 function onImageLoad(eventObj) { bigImageLoader.alpha = 0; stage.addEventListener(Event.ENTER_FRAME, onFadeIn); } // フェードインをつける function onFadeIn(eventObj) { bigImageLoader.alpha += 0.1; } // フェードインの処理を取り除く if (bigImageLoader.alpha >= 1) { removeEventListener(Event.ENTER_FRAME, onFadeIn); }

    • ベストアンサー
    • Flash
  • 配列演算子を使って変数を使いたい

    いつも、ありがとうございます。MAC OSX Flash8です。 ランダムで作った変数でムービークリップのタイムラインを使って複数のmcを複数の位置にランダムに配置しようとしています。 この時に、変数を使って階層の中のmcのインスタンス名にgo toを渡したいのですがうまくいきません。配列演算子の使い方がまだよくわかっていないためだと思います。スクリプトは以下のようです。 _root.shuffle.gotoAndStop(sfl[tim]) if (tim == 1) { _root.shuffle.shuffle+sfl[1].shiro+ichi[1].gotoAndStop(1) _root.shuffle.shuffle+sfl[1].shiro+ichi[2].gotoAndStop(nise[1]) _root.shuffle.shuffle+sfl[1].shiro+ichi[3].gotoAndStop(nise[2]) } 3種類のランダムで作った変数は、sfl[1] ichi[1] nise[1] です。 nise[1]はこのままで使えるようでした。たとえばshuffle1の1にsfl[1]をshiro1の1にichi[1]をあててランダムでできている数字を入れたいのですがどうしたらいいのでしょうか? よろしく、お願いします。

    • ベストアンサー
    • Flash
  • mcの中のタイムライン指定

    シーン1フレーム1にあるmcの中にボタンを配置してそれを押すと、シーン1フレーム2にあるmcの中のタイムラインの指定をしたいのですが、わかりません。誰か分かる方お教えください。 お願いします。

    • ベストアンサー
    • Flash
  • 特定のmcのフレームにきたときメインタイムライン制御

    AS初心者です。 今、メインタイムラインに配置したmc"main_mc"内のmc”mc1”の、 特定のフレームに来たとき メインタイムラインのフレーム移動をする、というスクリプトを書きたいのですが うまい行かずに困っています。 mc"mC1"のフレームアクションに _root.gotoAndPlay(20); と書きましたが、うまくいきません。 なんででんしょうか。。 もしお分かりのかたがいたらお教えいただけると幸いです 初歩的質問ですみません。。。 mac macbook os 10.4.11 flash cs4を使用しています。

  • FLASHの同一タイムラインで、複数のムービークリップを順に再生したい

    ムービークリップを複数作成しました。(名前を仮にa_mc, b_mc, c_mcとします。) このムービークリップを順に再生していきたいので、同一タイムライン上の 1フレーム目にa_mc 2フレーム目にb_mc 3フレーム目にc_mc と配置し、タイムラインの最後のフレームに this.stop(); とスクリプトを書きましたが、a_mcの再生が終わったところ(=1フレーム目)で停まってしまいます。 1フレーム目の後、2フレーム目以降(b_mcとc_mc)を続けて再生するには、どのようにすれば良いのでしょうか?

    • ベストアンサー
    • Flash
  • FLASH8のタイムラインのフレーム数は、16000までしか使えないのでしょうか?

    FLASH8のタイムラインのフレーム数は、16000までしか使えないのでしょうか? FLASH8にて、10分弱の長さのアニメーションを作ろうとしています。 30fpsで作成しているのですが、フレーム数が16000を過ぎた時点から、タイムラインの空白キーフレームに画像を挿入しても、普通は白丸が黒丸に変化するところ、白丸のままです。 それでも、ステージ上では、続けて配置できます。 しかし、パブリッシュすると、やはり16000フレーム目までしか、書き出されていません。 どこかの設定で、16000フレーム以降も、使用できるようにならないでしょうか? 初歩的な質問で申し訳ありませんが、よろしくお願いいたします。

  • 入れ替える処理

    プログラム初心者です。AS3.0で書いています 簡単な15面パズルを作りたいです。 15面パズルは解けない配置があるらしいので、ランダムではなく数字の入れ替えを100回くらい行いたいです。この入れ替えの処理をどう書けばいいのか教えてください スタートボタンを押したときに4つの隣接するマスをランダムに選び、入れ替えを行うようにすればいいらしいのですがどうやって書けばいいのかわかりません(端のマスは例外処理をいれる) できれば重複もなくしたいです よろしくお願いします メインタイムラインには mc1~mc16のムービークリップ mcのなかに入れ子で数字が入っています no1~no16のテキスト スタートボタン内のasです var i:int; var parentObject:Object=Object(parent); parentObject.sbtn.addEventListener(MouseEvent.CLICK,Mouse_Down); function Mouse_Down(event:MouseEvent):void { for( i = 1 ; i <= 16 ; i++ ) //カード番号の初期化、左上に1右下に16の規則的な配置 { Object(root)[ "mc" + i ]["no" + i].text = ""; } for( i = 1 ; i <= 16 ; i++) //配列の初期化クリア { //配列の初期化をクリアできる処理 } //ここにスタートボタンを押したときに4つの隣接するマスをランダムに選び、100回くらい入れ替えができる処理を入れたいです if( Object(root)[ "mc" + i ]["no" + i].text == 16 ) { Object(root)[ "mc" + i ]["no" + i].text = ""; //「no16」の表示をクリアして空のマスを作る Object(root).soeji = i; //数値をクリアした配列の「添え字」を保存 } }

    • ベストアンサー
    • Flash

専門家に質問してみよう