プロが教えるわが家の防犯対策術!

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

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

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

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が見つからない時は、教えて!gooで質問しましょう!