• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:同じMCが連続で再生されないようにランダム再生)

同じムービークリップのランダム再生方法と連続再生確率の下げ方

BlurFiltanの回答

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

#1です。 > この[0]はどういう働きをしているのでしょうか? その[0]は「配列の 0番 要素」を取り出すという働きをしています。 そもそも,その[0]を削除するとエラーが出ませんか? [お礼]で書かれている2つのスクリプトですが どちらとも Array クラスの splice() メソッドを使用していますよね。 この splice() メソッドの戻り値(=返り値)は「配列」なのです。  ↓これが「配列」 戻り値 = 配列.splice(抜き出す要素の開始番号,抜き出す要素数); ◎参考:ヘルプの「splice () メソッド」より  ~引用~ > AS3 function > splice(startIndex:int, deleteCount:uint, ... values):Array > …中略… > 戻り値 > Array - 元の配列から削除されたエレメントを含む配列です。 今回使った2つのスクリプトの場合, 抜き出す要素数は 1 つで戻り値は 1 つですから, その戻り値は,なんとなくの雰囲気で見れば, mcA または mcB または mcC のうちのいずれかになるように思えます。 しかし実は違っていて mcA または mcB または mcC のうちのいずれかを1つの要素とする「配列」が戻り値として返ってくるのです。 実際に欲しいのは「配列」ではなくて その中身の「要素」である「ムービークリップ」です。 それで その配列の 0番 要素であるムービークリップを取り出すために [0] を付けているわけです。 新規ドキュメントを作成し, メインのタイムラインのフレーム1に 次のようなスクリプトを書いて(コピペして), 「制御」→「ムービープレビュー」→「プレビュー」してみると, 理解が深まるかもしれません。 //--------------------------------------- //配列["あ","い","う"] の 1番 要素を抜き出し //変数 a に代入 var a = ["あ","い","う"].splice(1,1); //変数 a を出力 trace("a は何? →" + a); //変数 a のタイプを出力 trace("a のタイプは? →" + typeof(a)); //配列["あ","い","う"] の 1番 要素の 0番 要素を抜き出し //変数 b に代入 var b = ["あ","い","う"].splice(1,1)[0]; //変数 b を出力 trace("b は何? →" + b); //変数 a のタイプを出力 trace("b のタイプは? →" + typeof(b)); //--------------------------------------- ムービープレビューでの 上記スクリプト実行時の出力結果↓ --------------- a は何? →い a のタイプは? →object b は何? →い b のタイプは? →string --------------- trace() には, 数値 や 配列 などを自動的に文字列に変換するプログラムが内蔵されているため 便利で使いやすいのですが, その反面,単なる trace(変数名) では, 出力されたものが何であるのかわかりにくいことがあります。 そこで typeof 演算子 を使います。 すると,出力される変数のタイプがある程度わかるようになります。 ◎参考:ヘルプの「typeof 演算子」より  ~引用~ > 式の型 結果 > Array object > Boolean boolean > Function function > int number > Number number > Object object > String string > uint number > XML xml > XMLList xml 上記スクリプトの出力結果で 「a のタイプは? →object」 となりますが もっと細かく言えば a は Array(配列) なのです。 つまり var a = ["あ","い","う"].splice(1,1); では, 配列["あ","い","う"]の 1番 要素1つのみのを要素とする配列 ["い"] が, 変数 a に代入されるわけです。 一方 var b = ["あ","い","う"].splice(1,1)[0]; では, 配列["あ","い","う"]の 1番 要素1つのみのを要素とする配列 ["い"] の さらに 0番 要素である "い" が, 変数 b に代入されるわけです。 説明が長くなって 余計にややこしくなったかもしれませんが とにかく そういう意味の(配列の最初の要素を取り出す意味の) [0] です。 . 【重要ではない補足】========= もし最初の mc_arr.push(mc_arr.splice(int(Math.random()*(mc_arr.length-i)),1)[0]); の方で [0] を使いたくない場合は 次のようにしても良いかもしれません。 mc_arr = mc_arr.concat(mc_arr.splice(int(Math.random()*(mc_arr.length-i)),1)); ○.push(△) は, 配列 ○ の末尾に △ という要素を付け足す(押し込む) という意味になります。 □ = ○.concat(△) は 配列 ○ と 配列 △ とを連結して配列 □ を作成する という意味になります。 push() を使った現状でさえややこしいですが, concat() を使うとさらにややこしくなりますよね...。       ◎参考【イメージ図】↓ 「家」を「配列」,「棒人間」を「要素」だと思って見てください。

Fawkes
質問者

お礼

非常にわかりやすい解説でした。ありがとうございます。教えて頂いたスクリプトを分割して調べている時にエラーがでなかったのですが、あのときは配列を配列の中に入れている形になっていたようです。 それと最初の質問とは外れていってしまいますがもう一つだけ質問をさせてください。教えて頂いたtypeofを使ってみたんですが、このスクリプトを実行すると var a:String ="aaaa"; trace(typeof(a)); trace(a is String); trace(a is Object); 結果が string true true となります。なぜstrinオブジェクトgがStringとObjectでtureと判定されてしまうのでしょうか?

関連するQ&A

  • ムービークリップを特定の組み合わせでランダム再生

    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
  • Fpsを増減させても一定のスピードで再生する方法

    Adobe Flash Pro CS6 でAS3を使っています。 質問はタイトルの通りなんですが例えばルートにフラッシュの再生速度を速くしたり遅くしたりするFps変更スイッチと mcA,mcBと2つのムービークリップがあるとして mcAはFPS変更の影響をうけるようにし、逆にmcBはFps変更の影響をうけないように2つのムービークリップを同時に再生をしたいのです。そのときmcA,mcB両方とも1フレームも欠けることなく再生したいです。 自分で試してみた方法は、mcBの中の全フレームに stop();を記述しルートに function mc_Play():void { mcB.play(); } setInterval(mc_Play,200); と記述して再生スピードを強制的に固定する方法を試したのですが、Fps変更ボタンを押してFps変更を行うときに、setIntervalで制御しきれていないのかもしれませんが、微妙にmcBの再生速度が遅くなったり速くなったりと変化してしまいます。何か他に良い方法はありませんでしょうか?例ではムービークリップの数を少なくしていますが実際のプロジェクトファイルでは、ムービークリップの数は20以上ありそれぞれが10フレーム以上の長さのアニメーションファイルを持っています。その20以上あるムービークリップの数個だけFPS増減の影響をうけないように再生速度を固定したいのです。

  • ムービークリップをボタン操作でランダムに再生

    Adobe Flash Pro CS6 でAction Script 3を使っております。 現在、異なるムービークリップを一つのボタンの操作でランダムに再生する方法を検討しております。 使用するムービークリップの数は全部で8つでございます。 これらはAfter effect で製作後adobe Media EncoderにてFLVに変換しております。 これらを同じものを連続で再生しないように、 そして一つのボタンをクリックするたびにムービークリップの再生が始まりますが、押さない限りはムービークリップの最初の画像で止まっているようにしたいのです。 例えば、ムービークリップの先頭に丸があって、それが徐々に四角になるムービーがあるとしますと、そこにあるボタンをクリックしない限りは写っているのは丸のままですが、 クリックをしたら四角に変化し、 そして次のムービークリップへ移動し、 そこでもまた最初と同じようにボタンをクリックしない限り始まらないというものにしたい次第でございます。 この場合、どういった方法を用いるのが最適でしょうか? お答え頂ければ幸いにございます。

  • 2つのMC(ドラッグで移動可能)から等しい距離にMCを配置したい

    ドラッグで移動可能な二つのムービークリップMCAとMCBから等しい距離の位置に三つ目のムービークリップMCCを配置したいです。 MCCはMCA、MCBがドラッグで移動されると、MCAとMCBへの距離が等しい位置(厳密に等しくなくても良い)に移動させたいです。(結果、3つのムービークリップは一直線上に並ぶ) オーサリングツールは『ParaFla!』ActionSctiptは1.0相応で以下の様に作ってみましたが、いつまで経っても落ち着かないので改善したいです。 ※スクリプトのスペースは全角で記述。 ※ベクトルの計算に『HAKUHIN's home page』で公開されているライブラリを使用しました。 http://hakuhin.hp.infoseek.co.jp/main/as/vector.html ■ライブラリの取り込み _root上に配置したスクリプトに #FILE "vec2d.as" と記述。 ■MCA、MCB _root上にMCAを深度0、[固定]で配置。 _root上にMCBを深度1、[固定]で配置。 MCAとMCBにテキストで●を配置。 MCAとMCBに以下スクリプトを記述。 on (press){  this.startDrag(); // ドラッグを開始する } - on (release, releaseOutside){  this.stopDrag (); // ドラッグを解除する } ■MCC _root上にMCCを深度2に配置。 MCCにテキストで●を配置し、以下スクリプトを記述。 onClipEvent (enterFrame){  c_to_a = _root.Vec2dCreate(_root.MCA._x-_x,_root.MCA._y-_y);  c_to_b = _root.Vec2dCreate(_root.MCB._x-_x,_root.MCB._y-_y);  length_c_to_a=_root.Vec2dLength(c_to_a);  length_c_to_b=_root.Vec2dLength(c_to_b);  if(length_c_to_a > length_c_to_b){   long=c_to_a;  }else{   long=c_to_b;  }  pos_c = _root.Vec2dCreate(_x,_y);  long=_root.Vec2dNormalize(long);  long=_root.Vec2dScale(long, 5);  pos=_root.Vec2dAdd(pos_c,long);  _x=pos.x;  _y=pos.y; } 上記のようにして作成したものを以下に置きます。 http://carken.web.fc2.com/osiete/test.html 動かしてみると、いつまでたっても、細かく動いて止まってくれません。 厳密に同じ距離でなくても良く、ある程度見た目にOKかなってところで止まるようにしたいです。 アドバイスありましたら、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ビットマップデータのメモリ使用量について

    Adobe Flash CS6 AS3を使用しています。 ライブラリにpng連番画像を読み込みそれをムービークリップ内に配置し、そのムービークリップをメインのタイムラインにおくという形でフラッシュを作っているのですが、これではメモリ使用量が大きくなりすぎるのでなんとかしたいと思っています。 例えばmcAというムービークリップの内部にライブラリにインポートしたA01からA10という10枚の連番png画像を10フレーム分並べます。そして同じくムービークリップmcBの内部にライブラリにあるB01からB10という10枚の連番png画像を同じく10フレーム分並べます。その二つのmcをメインのタイムラインに配置します。これでmcAとmcBの10フレーム分のアニメが再生されますが、mcAかmcBどちらか片方だけを表示するようボタン操作ができるようにしています。ここで問題なのですが、例えばmcAを表示しているときにmcBは可視性を切って非表示にしていますが、メモリ使用量が減りません。こういった時に非表示にしているムービークリップのために確保したメモリーを開放する、といったことはできないのでしょうか?removeChildなどを実行してもメモリ使用量はまったく減りませんでした。 連番画像とそれを収めるムービークリップの数が増えれば増えるほどメモリ消費量が増えていってしまうので困っています。表示されていない内部にビットマップデータを配置してあるムービークリップのメモリーを開放するよい解決策がありましたら教えてください。 それと少し話がそれますが、ライブラリにあるビットマップイメージををリンケージしそのビットマップイメージをaddChildでステージに読み、そのビットマップイメージをdisposeで削除した場合にメモリーが開放されるのを確認しましたが、今の自分のやりかたよりこういった別の方法からフラッシュを作っていったほうがメモリー使用量を抑えられたりするのでしょうか?もっと効率の良い方法がありましたらそちらも教えてていただけると助かります。宜しくお願いします。

  • flashのランダム再生

    flash8で質問です。 5つのswfをランダムに読み込み、 5番目までいったらまた、ランダムにはじめから再生したいです。 ランダムで5つまで再生終わったらはじめからループという考え方でいいのでしょうか? ***************************** 外部にswfが5つおいてあります。 (外部ムービーの名前は1.swf、2.swfのように数字の番号の名前ではありません。) ///main.fla/// 配列にして (1.swf、2.swf、3.swf、4.swf、5.swf)をランダムで取り出し、 .load_mcに読み込む。 ランダムに1~5までのムービーの再生が終わったらまた ランダム再生を繰り返す。 というようなflashを作りたいです。 どうすればいいでしょうか。

    • ベストアンサー
    • Flash
  • swfを連続再生したいです

    Flashを作成しているのですが、別々に作成したswfを連続で再生しなければならなくなりました。 flaファイルは2つともあります。内容が複雑で容易に1からライブラリに読み込んで、結合するのが困難です。出来れば1つめのFlashからActionScript等で、次のFlashを連続で再生出来ればと思います。 なにかよいアドバイスがあれば教えてください。 なお、作成ソフトはCS5 proです。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • Flash cs4 ランダム再生

    Flash初心者です。 やりたいことはホームページ上でアニメーションを再生させる際に、複数パターンのアニメーションをページをリロードするたびにランダムに切り替えるということです。 Flashにてアニメーションのタイムラインを複数パターンつくり、ランダム再生をActionScriptで制御するものを作成したいと思います。 アニメーションのタイムラインを作成しムービーシンボルとしたものを複数作成し、それをシーン1のタイムラインにて各フレームに配置して、1フレーム目にActionScriptにてgotoAndStop(ランダムフレームの記述?);とすればいいのかなと思っているのですが、正しいでしょうか? 現状ではアニメーションのムービーシンボルは必要なパターンだけ作成しました。 シーン1のタイムラインに配置まではしたのですが、ActionScriptの記述が素人なものでさっぱりわかりません。 どなたか教えていただけませんか? 自分なりにやってみたのですが、ランダム関数(?)以前にgotoAndStop()すら思うようにいきませんでした。 Flashはcs4を使用しております。ActionScript3.0のプロジェクトにして添付画像のように1フレーム目に gotoAndStop(10); としてみたのですが、パブリッシュしたswf ファイルは真っ白のまま何も動いてくれません。 gotoAndstop(10); としてみたらstopせずにタイムラインを再生しているようで、各アニメーションの最初のフレームだけが切り替わるものになってしまいました。 ともにコンパイルエラー 1180:未定義である可能性が高いメソッドgotoAndstopの呼び出しです といわれます。 ActionScriptが2.0と3.0とどちらがいいのかもわかってない状態ですが、ご教授願います。

    • ベストアンサー
    • Flash
  • ウェブサイト(ホームページ)で音楽(BGM)を連続ランダム再生したいのですが。。。

    はじめまして。 この度個人のウェブサイトを開くに当たりまして、音楽(BGM.mid)を流すのですが、その方法についてご質問があります。 連続再生方法と、ランダム再生をどうにかして一緒に出来ないものかと考えております。 詳しくいうと、ウェブの入り口からメニューに入って音楽を流すのですが、入るとランダムで音楽が流れ、2回ほどループした後に違う曲がまた流れ出すといった感じを考えています。 今の所、メニューに入るとランダムで1曲流れて、次の曲に行かずそれで終わってしまっております。 どのサイトを見ても、ランダム方法か同じ曲の連続再生しか載っていません。 色々な曲をランダムで何曲も流す、というのが希望なので、タグを作ってくださる方はいないでしょうか? もしくは載っているサイトを教えていただきたいです。 ずっと探したり試行錯誤してるのですが、なかなか突破口が見つかりません。 よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • Flash swfのランダム再生

    こんにちは。今回はswfのランダム再生に関して質問させていただきます. 使っているバージョンはFLASHCS3/AS2.0です. たくさんのランダム再生に関する質問を参考に進めていたのですが,どうしても自分の理想通りにならないので質問させていただきました. やりたいこと. →btn というボタンをクリックして,mcに3種のswfを3連続ランダム再生したい. 自分で試してつくってみたところ,btnをクリックすると確かにランダムに3種のswfを選択しているようなのですが,選択した1種のswfを永遠に再生するだけになってしまいます.もちろんbtnをクリックするたびにランダムに再生してほしいのですが,3種のswfを3連続再生してほしいのです(重複可). 「3連続再生したあと実行をやめる」というASもわかりません. どうかご回答願います.