プロが教える店舗&オフィスのセキュリティ対策術

上手く説明出来ないのですが、
ムービークリップのメニューを作ろうとしています。

マウスオーバーで全部のムービーが止まる様にしたくて、
一つのムービークリップに全部のムービークリップのメニューをまとめ、選択すると
ーーーーーーーーーーーーーーーーここから
シーン=シーン1,レイヤー=menu,フレーム マウスイベントはボタンインスタンスでのみ使用できます。
シーン=シーン1,レイヤー=menu,フレーム マウスイベントはボタンインスタンスでのみ使用できます。
ーーーーーーーーーーーーーーーーここまで
とエラーになってしまいます。

だからといってメニュー一つ一つに

on(rollOver){
stop();
}
on(rollOver){
play();
}

を記述しても、マウスオーバーしているメニューだけが止まって、
他のメニューは動いてぐちゃぐちゃになってしまいます。


ひとつのメニューをマウスオーバーするだけで他全部のムービークリップも停止、
マウスをはずすと同じ所から動きだす事って出来ますか?
いい方法がありましたら教えて下さい。

A 回答 (2件)

インスタンスのタイプを[ボタン]にせず、[ムービークリップ]に変換します。



インスタンスに適当な名前を付けます。

例 btn01 , btn02 , btn03 , btn04

メインフレームにスクリプトを書きます。

btn01.onRollOver = btn02.onRollOver = btn03.onRollOver = btn04.onRollOver = function()
{
 stop();
}

btn01.onRollOut = btn02.onRollOut = btn03.onRollOut = btn04.onRollOut = function()
{
 play();
}
    • good
    • 0
この回答へのお礼

ryo2501様
お答え頂きありがとうございます!
記述も少なく簡単そうなのでやってみたいと思います(^^)

いろんなやり方があって勉強になります。

お礼日時:2008/11/25 19:16

エラーが出る件に関しましては,


いったいどんな操作をされたのかよくわかりませんが,
とにかく,
「フレームに on(○○) という onハンドラ を書いたから」
というのが理由でそのエラーが出ます。

onハンドラ はボタンインスタンス自体,もしくはムービークリップインスタンス自体にしか書けません。
元々Flash 5 までは ボタンインスタンス自体 にしか書けなかったので(ボタンのみが持つイベントハンドラだったので),
エラーメッセージが 「マウスイベントはボタンインスタンスでのみ使用できます。」 と出てきます。

このエラーは本題とはほとんど関係がないので,この件は置いておきます。



本題のご質問は,
ムービークリップをたくさん用意して,
それらのムービークリップ内のタイムラインの動きを一斉に止めたり動かしたりする方法ということですよね。

これは単純に,
それらのムービークリップ1個1個にその指示をしなければなりません。
スクリプトの書き方によっては,
簡単になる(短くなる),大変になる(長くなる)はありますが,
結局どんなスクリプトを書いても,
「1個1個に指示をする」 ということには変わりありません。

例えば シーン1 などメインのタイムライン(_root)に,
20個のムービークリップがあったとします。

その場合,個々のムービークリップに20通り別々のインスタンス名を付けます。

インスタンス名は半角英文字から始まっていて
全体的に半角英数文字であればたいてい何でも問題はありません。

ただ,スクリプトを簡単にするには,
インスタンス名を「文字列+連番数字」という形の名前にしておく方が良いです。

例えば 20個のムービークリップに,
「myMC1」,「myMC2」,「myMC3」,…,「myMC20」
と命名します。
命名は,各ムービークリップ1個ずつを選択して,
下のプロパティインスペクタの左の方の,
 [ <インスタンス名> ]
とグレー文字になっている部分に myMC1 などを書いて行きます。
(1個ずつです。まとめて選択するのではなく1個ずつ選択して命名です。)
順番はどうでも構いません。
動かしたり止めたりするムービークリップ全てに書き忘れがないように書きます。

そして,
全てのムービークリップを再生させたり停止させたりするインスタンス(ムービークリップもしくはボタン)に,
次のように書きます。

----------------------------------------
// このインスタンスにロールオーバーしたとき
on (rollOver) {
// 変数 i を 1~20 で 1 ずつ加算しながらループ
for (i=1; i<=20; i++) {
// _root の myMC1~20 を停止
_root["myMC"+i].stop();
}
}
// このインスタンスからロールアウトしたとき
on (rollOut) {
// 変数 i を 1~20 で 1 ずつ加算しながらループ
for (i=1; i<=20; i++) {
// _root の myMC1~20 を再生
_root["myMC"+i].play();
}
}
----------------------------------------

「何にロールオーバーしたとき」 に実行すべきかを考えると,
「全てのムービークリップを再生させたり停止させたりするインスタンスにロールオーバーしたとき」
に実行すべきとなります。
ちゃんと考えて "狙ってスクリプトを書く" ことが大切です。

そして,そのときに,
「全てのムービークリップを再生させたり停止させたりする」 のです。


for文が出てきています。
もし for文 がわからない場合は,
「ActionScript for文」 などとGoogleなどで検索するか,
次のページなどの解説を読んで理解してみてください。

「FLASHアクションスクリプト入門編 for文」
http://isvalid.jp/actionscriptLab/ASlesson/actio …


_root["myMC"+i].stop();
などにある [ ] を,配列アクセス演算子 と言います。
もしこれもわからない場合は,
「配列アクセス演算子」 とGoogleなどで検索してみてください。
http://www.google.co.jp/search?hl=ja&q=%E9%85%8D …


最初にも書きましたが,
for文を使っても使わなくても,結局すること(PCにさせること)は同じです。

// 変数 i を 1~20 で 1 ずつ加算しながらループ
for (i=1; i<=20; i++) {
// _root の myMC1~20 を再生
_root["myMC"+i].play();
}

と書いても良いですし,
次のように1つずつ書いてもかまいません。

// _root の myMC1 を再生
_root.myMC1.play();
// _root の myMC2 を再生
_root.myMC2.play();
// _root の myMC3 を再生
_root.myMC3.play();
// _root の myMC4 を再生
_root.myMC4.play();
// _root の myMC5 を再生
_root.myMC5.play();
// _root の myMC6 を再生
_root.myMC6.play();
// _root の myMC7 を再生
_root.myMC7.play();
// _root の myMC8 を再生
_root.myMC8.play();
// _root の myMC9 を再生
_root.myMC9.play();
// _root の myMC1 を再生
_root.myMC1.play();
// _root の myMC10 を再生
_root.myMC10.play();
// _root の myMC11 を再生
_root.myMC11.play();
// _root の myMC12 を再生
_root.myMC12.play();
// _root の myMC13 を再生
_root.myMC13.play();
// _root の myMC14 を再生
_root.myMC14.play();
// _root の myMC15 を再生
_root.myMC15.play();
// _root の myMC16 を再生
_root.myMC16.play();
// _root の myMC17 を再生
_root.myMC17.play();
// _root の myMC18 を再生
_root.myMC18.play();
// _root の myMC19 を再生
_root.myMC19.play();
// _root の myMC20 を再生
_root.myMC20.play();

書き方が違うだけでしていることは同じです。
CPUを使う度合もほぼ同じくらいだと思います。
ファイル容量やメモリを考えると for文 の方がほんの少し良いかもしれませんが,
差はそのくらいのことです。

for文 に似たものに for..in文 というものもあります。
これを使うとインスタンス名を付けなくて済むというメリットはありますが,
これでも結局することは同じですし,
「狙った物を狙い通りに動かす」という感覚がなくなるので,
とりあえずはキッチリとインスタンス名を付けて狙った通りに for文 で動かすか,
または1個1個に対して1行1行指示することをお薦めします。



なお,
次のようにすると for文 使用でも実行に制限をかけることができます。

----------------------------------------
// このインスタンスにロールオーバーしたとき
on (rollOver) {
// 変数 i を 1~20 で 1 ずつ加算しながらループ
for (i=1; i<=20; i++) {
// i が 3 で割りきれなかったときだけ実行
if (i%3 != 0) {
// _root の myMC1~20 を停止
_root["myMC"+i].stop();
}
}
}
// このインスタンスからロールアウトしたとき
on (rollOut) {
// 変数 i を 1~20 で 1 ずつ加算しながらループ
for (i=1; i<=20; i++) {
// _root の myMC1~20 を再生
_root["myMC"+i].play();
}
}
----------------------------------------
  
    • good
    • 0
この回答へのお礼

ありがとうございます!
少々難しそうですがやってみます(^^)

お礼日時:2008/11/23 14:52

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