• 締切済み

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) この並びをアクションスクリプトで変えることは可能なのでしょうか?可能だとすれば、どのようなスクリプトを記述、もしくは参考にすれば良いでしょうか? 初心者な質問で申し訳ございませんが、宜しければどなたかご回答のほど宜しくお願い致します。

みんなの回答

  • 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とかかれているので少し気にもなっていたのですが… 度々の質問ですみません。お手数でなければご回答宜しくお願い致します。