• 締切済み

Flash8 ムービークリップをランダムに表示(更新する度に順番を変更)

他の質問を確認させて頂いたのですが「更新する度に順番を変更」という部分で行き詰まり、今回質問させて頂きました。色々と調べたのですが、同じ質問が存在していたら申し訳ございません。 今回FLASHの作成で、1つのSWF内で3つのムービークリップ(mc_01、mc_02、mc_03)をランダムな順番で表示させたいというものです。ランダムに表示させるまでは、何とか行き着いたのですが、行き詰まったのは「更新の度に前回と順番が重複しない」ということです。 現在の状況は、下記の通りです。 mainというムービークリップに3つのムービークリップ(mc_01、mc_02、mc_03)をランダムに表示。 スクリプトは、下記の通りです。 var a = Math.floor(Math.random()*3)+1; main.attachMovie(["mc"+a], "mc", 0); 現状だと、更新する度にランダムに表示されますが、更新を押した際に、先頭が前回と同じムービークリップになってしまうことがあります。 (一回目の更新:mc_02 → mc_01 → mc_03) (二回目に更新:mc_02 → mc_03 → mc_01) この並びをアクションスクリプトで変えることは可能なのでしょうか?可能だとすれば、どのようなスクリプトを記述、もしくは参考にすれば良いでしょうか? 初心者な質問で申し訳ございませんが、宜しければどなたかご回答のほど宜しくお願い致します。

  • L410
  • お礼率0% (0/2)
  • Flash
  • 回答数2
  • ありがとう数0

みんなの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1 です。 SharedObject はネットゲームの得点などを "自分のPCに" 保存しておくものです。 また 複数の SWF どうしで情報を共有するときにも使います。 ローカルPCでも動作しますが,普通は "ネット上のコンテンツ" で使う物です。 「SharedObject」 と検索するだけで,"ネット上のサンプル" が見つかると思いますが。 http://www.google.co.jp/search?hl=ja&q=SharedObject&lr=lang_ja 要はクッキーです。 また, 実際にやってみて(今回はネット上にアップしてみて), わからない場合に質問する方が良いですよ。 実際にやってみるから "こそ" 初めてわかるのです。 実際にやってみないとわかりません。 (というか,返事を待ってる間に検証できます。)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

細かいことですが, main.attachMovie(["mc"+a], "mc", 0); でしたら, 「mc_01」「mc_02」「mc_03」ではなく, 「mc1」「mc2」「mc3」 が attachMovie されますね。 形としては 「mc1」「mc2」「mc3」 の方が良いので, 一応はこちらということを例に回答したいと思います。 しかし..., 今回の説明には配列を使いたいと思います。 配列やXMLなどを使う場合, ものの名前は 0 から始まる連番の方がスクリプトがシンプルになります。 したがってすみませんが, リンケージの識別子には,  「mc0」「mc1」「mc2」 と付けたムービークリップシンボルがあるものとして回答します。 (「mc1」「mc2」「mc3」だと妙なところで +1 や -1 が出てきてしまいます。) > 更新を押した際に、 > 先頭が前回と同じムービークリップになってしまうことがあります。 これを解決するには, 前回の先頭 を SWF 以外の別の場所に保存しておいて, 今回は 前回の先頭 とは違うランダムな値を得る必要がありますよね。 Flash の ActionScript のみで解決する場合, 前回の先頭 を別の場所に保存しておくのには SharedObject を使います。 スクリプトは次のようになります。 ------------------------------------------- // 「mc0」~「mc○」 の ○の数を設定(○によって変更) var num = 2; // 0~○ の要素を入れるための配列を作成 var arr = new Array(); // 配列要素に [0, 1, …, ○] を代入 for (var i = 0; i<=num; i++) { arr[i] = i; } // ローカルPCの SharedObject を参照または作成 var SO = SharedObject.getLocal("myNum"); // もし SharedObject 内に変数 lastData が存在すれば if (SO.data.lastData != undefined) { // 配列 から lastData 要素を抜きとる arr.splice(SO.data.lastData, 1); // ---次の2行はムービープレビュー検証用(不要)--- trace("前回の番号→ "+SO.data.lastData); trace("今回の番号→ "+arr+" のうちのどれか"); } // 配列の要素数分のランダムな整数を求める var a = Math.floor(Math.random()*arr.length); // main に 「mc?」 を attachMovie main.attachMovie(["mc"+arr[a]], "mc", 0); // arr[a] の値を SharedObject の lastData に保存 SO.data.lastData = arr[a]; ------------------------------------------- 「制御」→「ムービープレビュー」を繰り返してもらうと検証できると思います。 場合によって変える部分は  // 「mc0」~「mc○」 の ○の数を設定(○によって変更)  var num = 2; の部分みです。 「mc0」,「mc1」,「mc2」,「mc3」,「mc4」 の5つにしたい場合は var num = 4; と変更します。 他の値はこれによって自動的に変わります。 上記スクリプトの簡単な内容説明です。  // 「mc0」~「mc○」 の ○の数を設定(○によって変更)  var num = 2;  // 0~○ の要素を入れるための配列を作成  var arr = new Array();  // 配列要素に [0, 1, …, ○] を代入  for (var i = 0; i<=num; i++) {    arr[i] = i;  } これによって, [0, 1, 2] というデータの 配列 arr ができます。 変更を簡単にするためと, 2 という数を他でも使う可能性も考えられるためややこしく書いていますが, 最初のスクリプト全体では結局 num は1回しか登場しませんから, 上で抜粋した数行の部分を全て削除して var arr = [0, 1, 2]; のように,1行にしてもらってもかまいません。  // ローカルPCの SharedObject を参照または作成  var SO = SharedObject.getLocal("myNum"); これで, ローカルPCのどこかに 「○○.sol」 というファイルができて, その中に myNum というオブジェクト が作成されます。 「○○.sol」 の場所はまちまちです。 Windows の場合, C:\Documents and Settings\ユーザー名\Application Data\Macromedia\Flash Player\ 内の何処かに 「○○.sol」 ができます。 その辺を 「.sol」 などで検索して日付順などの表示にすると, 上で作成されたファイルが見つかると思います。 もし, すでに 「○○.sol」 が存在する場合は,何も作らずに参照するだけです。  // もし SharedObject 内に変数 lastData が存在すれば  if (SO.data.lastData != undefined) {    // 配列 から lastData 要素を抜きとる    arr.splice(SO.data.lastData, 1); もし, 「○○.sol」 内の myNum オブジェクト に, 変数 lastData が存在する場合のみ,配列の操作をします。 たとえば 「○○.sol」 内の オブジェクトmyNum 内の 変数 lastData に 1 という値が存在していたならば, 配列arrの 1 番要素を抜きとります。 arr = [0, 1, 2]; → arr = [0, 2]; 配列の要素は 0 からスタートします。 配列の 1 要素というのは,数えた場合 2つ目 の要素です。 この 0 か 2 のうちどちらかをランダムで取得します。 その後数行は, ご質問ですでに書かれていらっしゃる部分の変形ですから, 少し飛ばして最後の行の説明です。  // arr[a] の値を SharedObject の lastData に保存  SO.data.lastData = arr[a]; これでランダムに出した要素の値を 「○○.sol」 内に保存できます。 実際のローカルに 「○○.sol」 として保存されるのは Flash の SWF ファイルを閉じる瞬間です。 もしランダムに取得した値が 2 であるとすれば, 同じ SWF ファイルを次回開いたときに, SO.data.lastData の値が 2 になっています。 SO.data.lastData の値が 2 になっていると, 配列arrの 2 番要素が抜きとられます。 arr = [0, 1, 2]; → arr = [0, 1]; したがって,次回開いたとき, 0 か 1 のランダムな数が得られます。 参考になることがあるかもしれないURL Flashゲーム講座&ASサンプル集【配列とオブジェクトについて】 http://hakuhin.hp.infoseek.co.jp/main/as/disposition.html FN0204003 - SharedObject.getLocal() - Flash テクニカルノート http://www.fumiononaka.com/TechNotes/Flash/FN0204003.html

L410
質問者

補足

ご回答ありがとうございます。とても参考になりました。 一つずつ解説して頂いたので理解しながら作業が進められました。 本当にありがとうございます。 あと、すみません。似た内容の質問になってしまうのですが、 今回ご回答頂きましたスクリプトはローカル内でのみ有効なのでしょうか? var SO = SharedObject.getLocal("myNum"); この部分のスクリプトで作成されるmyNumをサーバーにアップすれば、 ローカルでなくても同じように動きますでしょうか? 今回も色々と調べさせて頂きましたが、サーバーにアップすると やはり前回のものと重複して表示されます。 getLocalとかかれているので少し気にもなっていたのですが… 度々の質問ですみません。お手数でなければご回答宜しくお願い致します。

関連するQ&A

  • 画面上にランダムでムービークリップを登場させたい

    5つのムービークリップをランダムで入れ替えて表示させ たいと思っています。 以前に下記URLの質問で詳しい回答がされていましたので、 説明の通りにやってみたのですがスクリプトのエラーで うまくいきません。 http://oshiete1.goo.ne.jp/qa1880922.html パブリッシュすると、 _root.attachMovie(["chara"+a], "chara", 0); の部分で「タイプが一致しません。」というエラーが でてしまうのです。 問題点を教えていただけませんでしょうか。 私の作業環境は、WindowsのFlash8です。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ランダム配置のムービークリップが固定配置のムービーに被ってしまいます。

    背景にランダムで星を無数に配置して瞬かせ、その上にキャラクターのムービークリップを配置しているのですが、星のレイヤーよりキャラのレイヤーを上にもってきても、星がキャラクターに被って表示されてしまいます。星の方のムービークリップに、 n=Math.round(Math.random()*1000); this.swapDepths(n); 以上の様にスクリプトで深度の設定をランダムに設定しているのですが、キャラクターの方にはどのように設定したら星が被らない様に深度の設定ができるのかわかりません。どうかよろしくお願い致します。

  • ランダムで画像を表示させるには?

    環境はFlashCS5で、アクションスクリプト3.0を使用しています。 5枚の画像(インスタンス名:mc0~mc4)をランダムで表示させるムービーを制作しているのですが、 下記のスクリプトですと、ランダムで画像が表示されるのですが、画像の切り替えがループになってしまって、次から次へとランダムで画像が切り替わります。フレーム1に下記のスクリプトを記述し、フレーム1にムービーインスタンス「mc0」から「mc4」を配置しています。 function randomShowMC():void { for (var i:int=0; i<5; i++) { this["mc" + i].visible = false; } var rnd:int = Math.floor(Math.random() * 5); this["mc" + rnd].visible = true; } randomShowMC(); var myTimer:Timer = new Timer(3000); myTimer.addEventListener(TimerEvent.TIMER ,function(){randomShowMC()}); myTimer.start(); このスクリプトを改良?改造?して、ランダムの画像が1回のみ…つまり、おみくじみたいに、(mc0~mc4の画像を)ランダムで1回のみ画像を表示させたいのです…表示後の画像が切り替わらずそのままで停止させたいのです。 又は、ムービーインスタンス「mc0」から「mc4」の画像をランダムで表示させ、最初に表示された、その画像で停止させるスクリプトを新規に記述しても構いませんので、ご指導・アドバイスをお願い致します…。 どなたか、解る方がいましたらランダム画像表示で1回表示のみのループしないスクリプトを教えてください。よろしくお願い致します…。

    • ベストアンサー
    • Flash
  • 特定のムービークリップの上で キラキラがランダムに発生

    お世話になります。 あともう少しのところでうまくいきません。 質問はタイトルの通りなんです。本や、サンプルをいろいろ研究して、 キラキラがランダムに発生するスクリプトを書いたんです。 何がしたいかというと、ムービークリップ「mc_stage」の上だけにキラキラをランダムに発生させたいんです。 sw = mc_stage._width; sh = mc_stage._height; level = 1; this.onEnterFrame = function() { if (Math.random()*10>9) { level++; newname = "Fwks"+level; Fwks.duplicateMovieClip(newname, level); this[newname]._x = Math.random()*sw; this[newname]._y = Math.random()*sh; } if (level>8) { this.onEnterFrame = undifined; } }; この形だと、mc_stageの幅と高さを取得するだけで、座標を取得していません。なので、ステージの左上からmc_stageのwidthとheightの範囲できらきらが発生してしまいます。 どうしたらきちんとmc_stageの上だけでランダムに発生させれますか?ぜひおしえてください!

    • ベストアンサー
    • Flash
  • Flashでムービークリップのランダム表示

    ActionScript初心者で過去ログを探してみたりもしたのですが、(探し方自体がヘタなのかもしれませんが(^_^;)・・・)わからなかったもので。 下記のFlashムービーで画面右半分に表示されている減速&加速して画面上を流れる球体のようなムービーを制作する場合。 http://www.kips-ps.com/main/ 例えば10数種類程度の下から上へと流れる、フレーム数の異なるモーショントゥイーンを含むムービークリップを作成して、それぞれをレイヤーに配置するーというような作業だけでできるのでしょうか? それともActionScriptからMCの表示・動作を制御したりしないと、それっぽく見えないものなのでしょうか? 質問そのものが拙い内容であるようにも思うのですが、よろしくお願いいたします。

  • ムービークリッププロパティの変更

    こんにちは。 ムービークリップA_mcをロールオーバーした時にムービークリップB_mcを表示ロールアウトした時にムービークリップB_mcを非表示にしたいのです。 まずはムービークリップB_mcの_alphaを100にするスクリプトを記述しようとしています。 B_mcはアニメーションですでに_alpha=0でステージにおかれています。 A_mcに on(rollOver){ _root.B_mc._alpha=100; } on(rollOut){ _root.B_mc._alpha=0; } と記述したのですが、表示されませんでした。 試しにと on(rollOver){ _root.B_mc._visible=true; } on(rollOut){ _root.B_mc._visible=false; } としてもだめでした・・・ すみません。原因がよくわからず対処方法もわかりません・・・何方かご教授頂けないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • 画像のランダム表示

    こんにちは。 フラッシュで、画像をランダムに表示させたいのですが、 スクリプトの書き方がわかりません。何方か教えていただけないでしょうか? 構成は ステージ上の【表示ゾーン(zon_mc)】ムービークリップの中に【バリ表示(bari_mc)】ムービークリップを作っています。 トップのステージのタイムラインとは別に画像を表示、非表示させたいのでこのような形になってます。 表示させたい画像は【bari】ファルダの中の【bali01.jpg】~【bali06.jpg】です。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • ムービークリップを特定の組み合わせでランダム再生

    Adobe Flash Pro CS6 でAction Script 3を使っています。 今現在複数あるループムービーを特定の組み合わせでランダム再生する方法を考えています。 使用するムービークリップの数は全部で5つです。 mcA,mcB,mcC,mcD,mcEと5つあります。クリップの再生時間はmcDのみが20フレームでほかはすべて10フレームです。これらのムービークリップをある程度のランダム性を持たせて特定の順番で再生したいのです。特定の順番は以下のとおりです。 mcA - mcB mcA - mcB - mcB mcC - mcD - mcE mcC - mcD - mcD - mcE mcC - mcD - mcD - mcD - mcE この四通りの再生方法でムービークリップをランダムで再生し続けたいのです。 それぞれのクリップはループになっているのでmcBからmcA or mcC、mcEからmcA or mcCに繋がってもシームレスに再生し続けられる感じになっています。 どういった方法を用いるのが最善でしょうか? 今現在一つのレイヤーに (mcA - mcB)( mcA - mcB - mcB )(mcC - mcD - mcE)(mcC - mcD - mcD - mcE)(mcC - mcD - mcD - mcD - mcE) と言った感じにすべてのムービークリップを再生する順番に配置して、それぞれの区切りでフレームラベルを用意して、配列にフレームラベルをすべて入れて、その配列とMath.randomを組み合わせてフレームラベルをランダムで選び、再生位置を飛ばして再生し続けていますが、これだとレイヤーの管理がしにくいのでいまいちしっくりきません。

    • ベストアンサー
    • Flash
  • ムービークリップの制御について

    スクリプト初心者です。 ムービークリップの制御について、まったくわからず困っています (1)シーン1、5フレーム目にムービークリップ、インスタンス名a_mc配置 (2)a_mcの中にb_mc配置。b_mcをクリックすると→a_mcの1フレーム目に移動。もう1度b_mcクリックすると→a_mcの10フレーム目に移動。もう1度b_mcをクリックすると→a_mcの1フレーム目に移動・・・と、 b_mcをクリックするごとにa_mcの1フレーム目、10フレーム目、1フレーム目・・繰り返す制御をしたいのですが。。 どなたか分かる方いましたら 教えてください!!

  • ムービークリップを動かす

    FLASH 5 を使っています。 ボタンを使ってムービークリップを動かそうとしています。 下記のように書いて、ボタンを押した時と 『 ↓ 』 キーを押した時に 『 ●●_MC 』 が -10 ずつ動いて -550 まできたら動かないようにしています。 on (press, keyPress "<Down>") { if (_root.●●_MC._y>=-550) { _root.●●_MC._y-=10; } } 但しこれだとボタンを押す度に -10 ずつ動きますが、何度も押さなければなりません。 『 ↓ 』 キーを押し続けた場合は連続で動きます。 ボタンを押し続けた場合にも、連続で -10 ずつ動かすにはどのように書いたら良いのでしょうか? 間抜けな質問をしているかとは思いますが、不慣れなものですので何卒宜しくお願い致します。

    • ベストアンサー
    • Flash