旅人が教える「旅に出たくなる映画」

ボタンクリック一回ですべてのMC再生停止
はできるのでしょうか?
もう一回押したら再生を再開したいのです。

何故、このような事をしたいかと言いますと、
FLASH内のあるボタンを押すと
ポップアップウインドウが開いてそこで
MPEGを再生したいのですが
FLASH自体が非常にアニメーションが多く、とても重いので、
MPEGがカクカクしてしまうのです。
そこでポップアップを開くときのボタンを押すのと同時に
FLASH内すべてのアニメーションを停止したいのです。

他の方法でも構いませんので
解決方法がありましたら是非おしえてください。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

ご質問に書かれている,その MC内 の動きというのは


ActionScriptによるアニメーションではなく,
タイムラインを使ったアニメーションで,stop(); で止まるという前提で回答します。

ActionScript で動かした動きなんて stop(); では止められませんから,
動かした方の責任で止めてください(笑)。


『stopAllSound』(全ての音を止める) という関数があるくらいだから,
『stopAllMC』 なんて物はないものか?
と思ってGoogleで 「stopAllMC」 と検索したら,日本語ページで1件だけヒットしました。
しかし,そのページはすでに消えている?ので,そのキャッシュからの引用です。

--- 引用 -----------------------------
//■sample for "for..in" loop
function stopAllMc () {
  for(var i in this) { //iは、オブジェクトのプロパティなどの文字列
    var child = this[i]; //this[i] は、値または参照値
    if(child instanceof MovieClip) { //インスタンスタイプがムービークリップならば
      child.stop();
    }
  }
}
--------------------------------------

さすがにキャッシュページのURLは書きにくいので,
詳細が必要でしたらそのページを検索して参考にしてください。

この for文 の書き方は,Flash ではあまり目にしませんが,VBA ではよく目にする形です。
Excel VBA のページで,あまり参考にはならないかもしれませんが…。
「★For Each...Next ステートメント」
http://www.sigoto.co.jp/excel/statement/state09. …



というわけで,
上の引用スクリプトをボタンのスクリプトとして,
また _root に関して通用するようにカスタマイズすると次のようになります。

--------------------------------------
on (release) {
for (var i in _root) {
var child = _root[i];
if (child instanceof MovieClip) {
child.stop();
}
}
// ココにmpeg再生のスクリプトを書く
}
--------------------------------------

しかし,これでは _root に対する 子(child)MC のタイムラインの動きしか止まりません。
もし,その 子(child)MC の中にさらに 子(child)MC があった場合は次のようになります。

--------------------------------------
on (release) {
for (var i in _root) {
var child = _root[i];
if (child instanceof MovieClip) {
child.stop();
for (var j in _root[i]) {
var grandchild = _root[i][j];
if (grandchild instanceof MovieClip) {
grandchild.stop();
}
}
}
}
// ココにmpeg再生のスクリプトを書く
}
--------------------------------------

コピペして「自動フォーマット」ボタンを使ってインデントをつけてもらえばわかりやすいですが,
かなり入れ子状になっています。
しかし,まだこれでは _root に対する 孫(grandchild)MC のタイムラインの動きしか止まりません。
もし,その 孫(grandchild)MC の中にさらに 子(child)MC があった場合は…

と,書いているときりがないので,もしそんな場合は考えてください。
同じ要領で行けますよ。
ちなみに
ひまご【曾孫】 は great-grandchild らしいので great_grandchild くらいをオブジェクト名に使って
さらにちなみに,
ひひまご【曾曾孫】 は知りませんので,super_great_grandchild くらいをオブジェクト名に使えば良いのではないでしょうか。
オブジェクト名なんてどうでもいい話ですけどね。

stop(); しか書いていませんが play(); も同じですからわかりますよね。


--- 動作環境及び注意 ----------------
以上のスクリプトは,
作成可能環境 Flash MX 以上
動作環境 Flash Player 6 以上
です。
ちなみに SWF を非圧縮でパブリッシュすると,Flash Player 5 でも閲覧可能ですが,
ボタンをクリックしたとたん,for文ループで無限ループに入り,フリーズしてしまいます。
今時 Flash Player 5 の方もいないとうので,大丈夫だと思いますが,
SWF は圧縮でパブリッシュして,
Flash Player 5 以下の方には閲覧をご遠慮頂く方が良いと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!!

いつもいつもすみません><
#2さんのやり方で出来ました。
わざわざ説明いただいてありがとうございます。

大変勉強になりました!

お礼日時:2006/05/25 17:34

#1です。



すみません,代返よろしいでしょうか。

> FLASH再生中に右クリックして
> 再生のチェックボックスのチェックをはずすと
> ムービーが止まりますよね?

Windows 環境と Mac環境で違うようです。
Windows 環境では,
再生のチェックボックスのチェックをはずすと
_root のタイムラインの動きしか止まらず,
MC 内の動きは動きっぱなしになりますが,
Mac では, _root のタイムラインの動きどころか,MC内の動きまで止まります。
また Mac 対応の全てのブラウザでそうなのかはよくわかりません。


> あれはなぜでしょう。

ブラウザか,OSか,
その環境対応の Flash Player の仕様でしょう。

> 右クリックメニューをカスタマイズできると思うので
> あれを使ってうまく出来ることもあるのでしょうか?

こういうことでしょうか↓?

--------------------------------------
// コンテキストメニュー作成
myMenu = new ContextMenu();

// コンテキストメニューアイテムオブジェクト作成
myMenu1 = new ContextMenuItem();

// キャプション名の設定
myMenu1.caption = "★全てストップ★";

// 動作する関数の指定
myMenu1.onSelect = stopAllMc;

// --動作するユーザ関数の定義--
// #2の方のAS無断引用です(謝)
function stopAllMc(mc:MovieClip) {
for (var obj in mc) {
if (mc[obj] instanceof MovieClip) {
mc[obj].stop();
stopAllMc(mc[obj]);
//再帰処理
}
}
}

// コンテキストメニューにアイテムを割り当て
myMenu.customItems.push(myMenu1);

// コンテキストメニューをメニューに割り当て
_root.menu = myMenu;
---------------------------------------

参考URL
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2149143
 ↑教えて!goo  ↓OKWave (同じです)
http://okwave.jp/kotaeru.php3?q=2149143
    • good
    • 0
この回答へのお礼

ほんとに何から何まですみません・・
マックと違うのですね。。
普通に考えたら単純そうな作業ですが
すべていっぺんに停止ってこんなに複雑なのですね^^
大変勉強になりました!

こんなに毎回詳しく書いてくれて
神様にしかみえません 笑

ありがとうございました!

お礼日時:2006/05/25 20:50

再帰処理を使えば子、孫、曾孫…のMCの動きを止めれますよ。


再帰処理というのは関数の中で自分自身を呼び出す処理のことです。

//----------------------------------------------
//関数 mc:ムービークリップ
function stopAllMc(mc:MovieClip) {
for (var obj in mc) {
if (mc[obj] instanceof MovieClip) {
mc[obj].stop();
stopAllMc(mc[obj]);//再帰処理
}
}
}
//関数呼び出し
stopAllMc(_root);//最初にMCを指定
//----------------------------------------------

MCの中にMCが見つからなくなるまでループするので全てのMCでstop()が実行されます。
ただし、最初に指定したMCの中を全て見て回るので効率が悪いです。

MCの数が決まっているならインスタンス名をつけて配列にして管理した方がいいかもしれません。

var mc_array = new Array();

//全てのmcを配列に入れる
mc_array[0] = _root.mc1;
mc_array[1] = _root.mc1.childmc1;
mc_array[2] = _root.mc2;

for (var i = 0; i<my_array.length; i++) {
my_array[i].stop();
}
    • good
    • 0
この回答へのお礼

ありがとうございます!
そのままやったら見事とまりました!!

一つお聞きしたいことがあるのですが、
FLASH再生中に右クリックして
再生のチェックボックスのチェックをはずすと
ムービーが止まりますよね?

あれはなぜでしょう。
右クリックメニューをカスタマイズできると思うので
あれを使ってうまく出来ることもあるのでしょうか?

お礼日時:2006/05/25 17:35

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QgotoAndPlayで反応がありません。

 ムービークリップ内のボタン(ボタンは複数存在しています)[プルダウンメニューを作成しました]に対して、
on (release) {
gotoAndPlay("フレーム番号");
}
と記述し、フレーム移動をさせようとしたのですが、
反応がありません。
Flashを使い始めてまだ間もなく、アクションスクリプトも初心者です。
フレームアクションは、キーフレームに設定しないといけないと参考書に書いてあったのですが、そうするとムービークリップ内のボタンには、gotoAndPlayの使用はまちがっているのでしょうか?

フレームアクションではないのですが、同じ部分に
on (release) {
getURL("**.html");
}
と記述すると問題がなく動きます。

過去の質問も読んでみたのですが、どの質問が自分の疑問に当てはまるかよくわかりません。
どなたかご教授願います。

以上の文章で理解しにくければ、追記致します。

Aベストアンサー

いくつか原因が考えられますが、1番怪しいのは移動先の指定の仕方です。
gotoAndPlay または gotoAndStop で、移動先をフレームの番号で指定する時は、

 gotoAndPlay( 2 );

このように、数字を " " でくくらずに記述します。
" " でくくってもエラーにならないのはなぜかと言いますと。

 gotoAndPlay( "menu_item1" );

このように指定すると、”menu_item1”というフレームラベルを持つフレームに移動、という意味になります。
つまり、" "でくくっても文法上は誤りではないのでエラーにはならないのですが、「 2 」というフレームラベルを持つフレームがない時はフレームの移動が正常に行われません。

Flash MX か MX 2004 をお使いの場合は、フレームを選択した状態で、「プロパティ」パネルを見てください。
左上の方に、<フレームラベル>と書かれている項目があるかと思います。
ここで何か名前を入力すると、選択したフレームに名前が付きます。この名前のことを”フレームラベル”といいます。

フレームラベルは gotoAndPlay や gotoAndStop の移動先として利用できます。
例えばゲームを作っていて、フレーム2からゲームが始まるとします。
フレーム2に”game_start”というフレームラベルを付けると、

 gotoAndPlay( 2 );



 gotoAndPlay( "game_start" );

は、同じ意味になります。
フレームを追加したなどの理由でゲームの始まりがフレーム2からではなくなった場合、フレーム番号を直接指定していた場合は、番号を書き直さなければなりません。
しかし、フレームラベルで指定していれば、フレームが移動しても、そのフレームとともにラベルも移動するので、スクリプトを直さなくても済みます。


もう1つの原因として考えられるのは、ボタンをムービークリップとして作っている場合です。
Flash MX からは、ムービークリップをボタンと同じように使えるようになりました。
が、ボタンとして使っているムービークリップに

 on(release)
 {
  gotoAndPlay( 2 );
 }

というアクションを書くと、ボタン用のムービークリップのフレーム2に移動する、という意味になります。
「プロパティ」パネルで、タイプを確認してみてください。左上の方にリストがありますが、ここが「ボタン」ではなく「ムービークリップ」になっている場合は、

 on(release)
 {
  _parent.gotoAndPlay( 2 );
 }

というように、gotoAndPlay の前に”_parent.”という記述が必要です。


ActionScript を設定できる場所は、

 ・タイムラインのフレーム(キーフレームが必要)
 ・ボタンのインスタンス
 ・ムービークリップのインスタンス

この3箇所です。
フレームに設定するアクションを”フレームアクション”、ボタンやムービークリップのインスタンスに設定するアクションを”オブジェクトアクション”といいます。
gotoAndPlay はフレームを移動するアクションですが、だからといって”フレームアクション”というのではありません。ボタンやムービークリップにも設定できます。

いくつか原因が考えられますが、1番怪しいのは移動先の指定の仕方です。
gotoAndPlay または gotoAndStop で、移動先をフレームの番号で指定する時は、

 gotoAndPlay( 2 );

このように、数字を " " でくくらずに記述します。
" " でくくってもエラーにならないのはなぜかと言いますと。

 gotoAndPlay( "menu_item1" );

このように指定すると、”menu_item1”というフレームラベルを持つフレームに移動、という意味になります。
つまり、" "でくくっても文法上は誤りではないのでエラーにはならな...続きを読む


人気Q&Aランキング

おすすめ情報