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

Flash professional CS5を使用してAS3.0で記述しています。


メインのタイムラインにフレームラベルが二つ(main1とmain2)あります。
main1にはステージにムービークリップのmc1が,main2にはmc2が配置してあります。

さらに,
こういう書き方でいいのかわかりませんが;
mc1内にはフレームラベルsub1,sub2があります。
同様に,
mc2内にはフレームラベルpart1,part2があります。


sub1ではボタン(btn1)があり,押すとフレームラベルsub2に進むようになっています。(確認済み)


sub2にもボタン(btn2)が用意してあり押したらムービークリップmc2内のpart2に移動させたいと考えています。


フレームラベルsub2で

btn2.addEventListener(MouseEvent.CLICK, Click2);

function Click2(evt:MouseEvent):void{
MovieClip(parent).gotoAndStop("main2");
}
と記述すればメインタイムラインのフレームラベルmain2に移動することは確認しました。



しかしフレームラベルpart2へ移動するにどのように記述したらよいかわかりません。

MovieClip(parent).mc2.gotoAndStop("main2");
としてもやはりmc2が未定義なので無理なのでしょうか?
もしそうでしたらmain1の段階で定義しようかと思うのですが,その場合はどのように記述すればよいのでしょうか?


つまり,メインタイムライン上における後ろのフレームラベルの子のフレームラベルに移動したいです。
説明がうまくできないので図も載せます。
http://www1.axfc.net/uploader/Img/so/99986
よろしくお願いいたします。

A 回答 (1件)

Flash は


基本的にその時点で存在するものにしか命令できません。

メインタイムラインの「mc1」と「mc2」は同時に存在しないため
お互いに命令しあうことは基本的にできません。

あえてするなら次のような感じです↓

//---「mc1」フレーム "sub2" のスクリプト---
//「mc1」の再生を停止
stop();

//「btn2」にクリック時に実行するイベントリスナーを登録
btn2.addEventListener(MouseEvent.CLICK,Click2);

//関数 Click2 の定義
function Click2(evt:MouseEvent):void {
//親階層に毎フレーム時間実行するイベントリスナーを登録
MovieClip(parent).addEventListener(Event.ENTER_FRAME,gotoPart2);
//親階層をフレーム "main2" に進めて停止
MovieClip(parent).gotoAndStop("main2");
}

//関数 gotoPart2 の定義
function gotoPart2(evt:Event):void {
//親階層の「mc2」をフレーム "part2" に進めて停止
evt.target.mc2.gotoAndStop("part2");
//親階層の毎フレーム時間実行するイベントリスナーを削除
evt.target.removeEventListener(Event.ENTER_FRAME,gotoPart2);
}
//--------------------------------


ただし
Flash Player 10 以上用SWFをパブリッシュする必要があります。
(Flash Player 9 にはこれらができないバグ(仕様?)がある)
(同様のことは Flash Player 8 以下でもできるのでおそらく 9 だけのバグ)

「mc1」とその「parent」=「root」は同時に存在しているので
「mc1」から「root」にイベントリスナーを登録することはできます。
また
「root」は「mc2」と同時に存在しているので
「root」から「mc2」にgotoAndStop命令をすることはできます。

~~~日常生活での類似例~~~
私は 今日 家にいるが 明日 はいない。
弟は 明日 家にいるが 今日 はいない。
これでは明日
弟に対して 「犬の散歩をしろ」 と命令することができないので
今日も明日も家にいる母に
明日 弟に対して 「犬の散歩をしろ」 と命令してもらうことにした。
~~~~~~~~~~~~~~~


上の方法は Flash Player 10 ではできると言っても
不確実で危ない橋を渡るようなものですから
普通はあまりしないと思います。
 
 
 
スクリプトがバラバラになるのでわかりにくいかもしれませんが
以下のようにする方がもう少し確実だと思います。

「root」の フレーム "main1" 辺りに次のような変数を用意し,

var flag:Boolean = false;


「mc1」の フレーム "sub2" の Click2 を次のように変更し,

//関数 Click2 の定義
function Click2(evt:MouseEvent):void {
//親階層の flag の値を true にする
MovieClip(parent).flag = true;
//親階層をフレーム "main2" に進めて停止
MovieClip(parent).gotoAndStop("main2");
}


「root」フレーム "main2" に次のように書く。

//flagの値がtrueだったら
if (flag) {
mc2.gotoAndStop("part2");
}
    • good
    • 0
この回答へのお礼

素早い回答ありがとうございます。
この場合はやはりフラグなどを使わないとだめなんですね。。

大変よくわかりました。
他の方の質問に対する回答をよく拝見させてもらっていますが,例えなど説明が大変わかりやすくとても勉強になります。
また何かありましたらよろしくお願いいたします。


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

お礼日時:2010/11/13 18:00

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