dポイントプレゼントキャンペーン実施中!

こんにちは。今回はswfのランダム再生に関して質問させていただきます.
使っているバージョンはFLASHCS3/AS2.0です.
たくさんのランダム再生に関する質問を参考に進めていたのですが,どうしても自分の理想通りにならないので質問させていただきました.

やりたいこと.
→btn というボタンをクリックして,mcに3種のswfを3連続ランダム再生したい.

自分で試してつくってみたところ,btnをクリックすると確かにランダムに3種のswfを選択しているようなのですが,選択した1種のswfを永遠に再生するだけになってしまいます.もちろんbtnをクリックするたびにランダムに再生してほしいのですが,3種のswfを3連続再生してほしいのです(重複可).
「3連続再生したあと実行をやめる」というASもわかりません.

どうかご回答願います.

A 回答 (3件)

とりあえず,


ActionScriptなどを離れて動作の流れを考えてみます。

  ボタンがクリックされる
      ↓
  ------------------------------
  ランダムな外部SWF(仮称A)をロードする
  そしてカウント用変数の値を 1 にする
      ↓
  外部SWF(仮称A)がロード&再生される
      ↓
  外部SWF(仮称A)の再生が終了する
  ------------------------------
      ↓
  ------------------------------
  もしカウント用変数の値が3未満であれば
  ランダムな外部SWF(仮称B)をロードする
  そしてカウント用変数に1をプラスする
      ↓
  外部SWF(仮称B)がロード&再生される
      ↓
  外部SWF(仮称B)の再生が終了する
  ------------------------------
      ↓
  ------------------------------
  もしカウント用変数の値が3未満であれば
  ランダムな外部SWF(仮称C)をロードする
  そしてカウント用変数に1をプラスする
      ↓
  外部SWF(仮称C)がロード&再生される
      ↓
  外部SWF(仮称C)の再生が終了する
  ------------------------------
      ↓
  後は何かしても良いし,しなくても良い。

ActionScriptを離れて別の言語を使うとしても,
流れはだいたい上のようになります。

一番難しく,場合によってはできない(不確定)な部分がありますが,
それはどこかおわかりになりますか?

「3連続再生したあと実行をやめる」という部分ではありませんよ。
それは,
回数を指折り数えて3回になればそれ以上ロードしなければ良いだけです。

難しい,または不可能なのは次の部分です。

  外部SWF(仮称A)の再生が終了する
  外部SWF(仮称B)の再生が終了する
  外部SWF(仮称C)の再生が終了する

つまり,
「外部SWFの再生が終了するのを検知する」
という部分が最難関で場合によっては不可能です。
なぜ不可能な場合があるかと言うと,
そもそも 「外部SWFの再生は終了しない」 ものもあるからです。
→例:アナログ時計やデジタル時計のSWF
  例:HPでよく見るメニューなどナビゲーション系SWF

私は外部SWFの作成者ではありませんから,
外部SWFがどんなムービーなのか全くわかっていない状況です。
可能か不可能かなど私は判断できません。


外部SWFがそういうものではなく,
_root(シーン1 などメインのタイムライン)を使った昔からある素朴なアニメーションである場合に限っては,
 「最終フレーム到達=再生終了」
ですから,次のようにすればできます。

外部SWFをロードする親SWFと同じフォルダに
外部SWF「1.swf」,「2.swf」,「3.swf」があるものとします。

親SWF(親FLA)には,
「loadMC」 というインスタンス名を付けたムービークリップと
「loadBTN」 というインスタンス名を付けたボタンがあるものとします。

「loadMC」 や 「loadBTN」 が存在するフレームに,
次のように書けばそれなりのものができます。

/////////////////////////////////////////////////////////////////////
// カウント用変数 cnt の宣言
var cnt:Number;

// 「loadBTN」クリック時の動作定義
loadBTN.onRelease = function():Void {
//
// このボタンのボタン機能を無効にする(重複クリック禁止策)
this.enabled = false;
// loadMC に ランダムな1~3.swf をロード
loadMC.loadMovie((Math.floor(Math.random()*3)+1)+".swf");
// カウント用変数 cnt を 1 にする
cnt = 1;
//
_root.onEnterFrame = function():Void {
// loadMC の再生フレームが最終フレームに達した場合
if (loadMC._currentframe>1 && loadMC._currentframe == loadMC._totalframes) {
//
// もし cnt が 3 未満であれば
if (cnt<3) {
// loadMC に ランダムな1~3.swf をロード
loadMC.loadMovie((Math.floor(Math.random()*3)+1)+".swf");
// カウント用変数 cnt に 1 をプラスする
cnt++;
} else {
// loadMCから外部SWFをアンロード
loadMC.unloadMovie();
// loadBTNボタンのボタン機能を有効にする
loadBTN.enabled = true;
// この onEnterFrame を削除
delete this.onEnterFrame;
}
}
};
};
/////////////////////////////////////////////////////////////////////


上のスクリプトにある,
 // このボタンのボタン機能を無効にする(重複クリック禁止策)
 this.enabled = false;
とか,
 // loadMCから外部SWFをアンロード
 loadMC.unloadMovie();
とか,
 // loadBTNボタンのボタン機能を有効にする
 loadBTN.enabled = true;
は,適当に勝手に付けてみただけです。
不要であれば取っても問題はないと思います。


> 3種のswfを3連続再生してほしいのです(重複可).

ということですから重複はします。
重複しない確率は 2/9 です。
だいたいの場合(9回クリック中 7回ぐらい)は同じSWFが重複出没します。


繰り返しますが,上のことができるのは,
外部SWFが_rootのタイムラインを用いた素朴なアニメーションであって,
なおかつ最後のフレームに到着することが「ムービー終了」である場合です。

アナログ時計などActionScriptで動かしたものに "限らず",
ムービークリップ内のタイムラインを使ったアニメーションムービーであっても上のスクリプトは使えません。

また,_rootのタイムラインを用いたアニメーションであっても,
最終フレームに到達することなく途中のフレームで折りかえし再生したり,
途中のフレームでストップする場合は知りません。

「外部SWFの再生が終了するのを検知する」
ここがわからないと(どういう条件か明記されないと)本当は回答できないご質問です。



------ ------ ------ ------

と以上のように書いてみましたが...

> 3種のswfを揃える人物はFlash操作ができない人を想定
> 3種のswfをそろえるだけで3種3連続ランダム再生できるには
> どうしたらいいでしょうか????

その条件では基本的に不可能ではないでしょうか。
どんな SWF をそろえられるかわかったものではありません。

ActionScript を使用したSWF などをそろえられてしまった場合は,
ムービーの最後が検知できないどころか,
別の SWF にロードしたその時点で _root や Stage や _x _y などが変わりますから,
「表示されない」「動かない」「暴走する」「フリーズする」などのことは当たり前に起こります(起こらない方が稀)。

また 外部SWF のパブリッシュしたバージョンも,
ロード親と一致させておかなければ変になって当たり前です。

ちなみに,
「1.swf」「2.swf」「3.swf」 を FlashPlayer7以下のSWFにパブリッシュして,
メインのSWFをFlashPlayer8のSWFしたところ,
上のスクリプトを使っても,
> 選択した1種のswfを永遠に再生するだけになってしまいます.
これと同じ現象が起きました。


『3種のswfを揃える人物』 に,
 「用意する SWF は 必ず _root のタイムラインを使用した最終フレームをムービー終了とするムービーであること。」
 「また用意する SWF は FlashPlayer○ 用にパブリッシュしたSWFを使用すること。」
などと条件を付けておけば大丈夫なのかもしれませんが,
『Flash操作ができない人』 であれば,
上の条件は何のことかさっぱりわかりませんね。

外部JPEGロードだと,その辺は関係ないので楽です。
Flash素材でも,
外部JPEGをロードする素材ばかりで,
外部SWFをロードする素材というのは普通はありません。
外部SWFが予測できませんし,不具合が起こることは目に見えてわかります。
    • good
    • 0
この回答へのお礼

まずは返事が遅くなったことをおわびします.
ネットがしばらくつながらないトラブルに見舞われていました(汗)

そして,たくさんのアドバイスありがとうございます!!!
教えてくださったスクリプトで大成功しました!!!!!!
自分でもこれを成功させるにはかなり多くの壁があるのは感じていたのですが,どうにか工夫して第三者にも使ってもらえるものをつくろうと制作している次第です.

とっっっっても役立ちました.ありがとうございました.

お礼日時:2008/11/03 20:19

#1です。



補足ありがとうございます。が、今一つ理解できていません。

>3種のswfを揃える人物はFlash操作ができない人を想定して

FLASHの操作は、私の示した方法でもbtnと言うボタンをクリックするだけですが? (前提がそう書かれていますよね)
そして、アトランダムに1~6のSWFを表示させ、自動で最後に止める(つまりループさせない)と、言うことです。

>「3連続再生したあと実行をやめる」というASもわかりません.

と、おっしゃっているので、簡単なスクリプトしか示しませんでした。
各swfに変数をつけて、最後にランダムに次を再生、ただし1度読み込んだswfは変数で判断して、再生しない。というASは、if文を書けばできます。

この回答への補足

> A・B・Cのswfを各パターンでつないで、

と書かれた部分を私はFlashを用いて
「AAA」「ABB」「ABC」「ACC」「BBB」「CCC」
のswfを作るのかと解釈しました.

しかしsuzukoさんがおしゃっていたのは,
ASでこの6パターンにくくることを意味していたのでしょうか??

理解が足らなくてすいません.

補足日時:2008/11/04 22:03
    • good
    • 0

A・B・Cのswfを各パターンでつないで、1~6として一番最後に



this.stop();

とフレームにアクションを書く。

この回答への補足

ご回答ありがとうございます。

その方法も考えたのですが、3種のswfを揃える人物はFlash操作ができない人を想定して制作しています。

ですから、3種のswfをそろえるだけで3種3連続ランダム再生できるにはどうしたらいいでしょうか????

suzukoさんにはせっかく簡潔にご回答いただいたのに、注文が多くて申し訳ないです。

どうぞよろしくお願いします。

補足日時:2008/10/30 18:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!