• ベストアンサー

FlashのActionScriptについて。

ActionScriptについて、質問があります。 例えば, on (press){ _root.A.gotoAndPlay("5") } とシンボルに書いて動かします。 さらにシンボルの中にある、別のシンボル(たとえてBとします。)をうごかそうと更に、次のようにかきます。 on(press){ _root.A.B.gotoAndPlay("3") } フレームナンバーはなんでもいいのですが、 どうしてもシンボルBが言う事を聞いてくれません。 なにか間違いがあるのでしょうか? どうかFlashに詳しい方教えてください!!

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.7

#3です。 どうやら、AとBの両方でマウスイベントを利用していることが原因のようですね。 Bの親であるAでマウスイベントを検出しようとすると、A全体がヒット領域になります。BはAの一部ですから、Bの上でマウスを操作したとしても、Flash 内部ではAの上でのイベントと判断されます。Bに設定した on が正常に動作しないのは、このためだと思います。 BがAの中に存在する限り、B上でのマウスイベントを press や rollOver / rollOut イベントハンドラで検出するのは、まずアテにできないと思った方がいいかも知れません。 ここは1つ発想を変えて、他のイベントハンドラを利用して、擬似的に press や rollOver / rollOut を検出する方法を考えてみてはいかがでしょうか。 まずは簡単な、press のイベントから。 「ムービークリップがクリックされる」とは、  ・マウスのボタンが押された  ・マウスカーソルがムービークリップの上に重なっている この2点が条件です。 MovieClip のイベントに、マウスのボタンが押された時に発生する mouseDown があります。このイベントが発生した時、マウスカーソルがムービークリップに重なっていた場合だけ処理を行うようにすると、on(press) と似たような処理になります。 ムービークリップの上にカーソルがあるかどうかは、マウスカーソルの座標とムービークリップの衝突判定を取ることで判断できます。衝突判定には、hitTest というアクションを使います。 スクリプトにすると、こんな感じです。このスクリプトは、シンボルAの中のBのインスタンスに設定してください。  // 擬似 onPress 処理  onClipEvent(mouseDown)  {   //マウスボタンが押された時、カーソルと重なっていれば   //クリックと見なす   if( this.hitTest ( _root._xmouse , _root._ymouse , true) )   {    /* ここに press イベント発生時の処理を書く */   }  } (↑このスクリプトをコピーして使う場合は、各行頭のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) 次は rollOver と rollOut の処理です。 同じく hitTest を利用します。 ロールオーバーは当然ながら、マウスが動いた時にしか発生しません。となると、使えそうなイベントは、マウスが動いた時に発生する mouseMove です。 ロールオーバーの時もクリックと同じく、ムービークリップとカーソルが重なっているはずです。 ロールオーバーイベントは普通、ムービークリップにカーソルが乗った、その時1度しか発生しません。しかし、「 mouseMove イベントが発生し、かつ、カーソルとムービークリップが重なっていた」という条件だけで判断すると、ムービークリップの上でカーソルが動く度にイベントが発生してしまいます。 最初の1回だけ必要なら、「ロールオーバーを既に実行した」という情報をどこかに残しておいて、この情報を if 文で判断してから実行すればいいことになります。 そこで、この情報を保存する変数を、1つ用意します。同じシンボルから複数のインスタンスを使うことも考えると、Bのシンボルのタイムラインに用意した方がいいと思います。ここでは仮に、rollover_flg という名前にします。 この変数には true か false だけを入れることにします。ロールオーバーを実行済みの時 true 、それ以外の時は false です。最初は実行されていませんので、初期値には false を入れておきます。 つまり、ロールオーバーの条件とは、  ・マウスが動いた時、発生する  ・ムービークリップの上にカーソルがある  ・rollover_flg がfalse この3つです。 1度ロールオーバーを検出したら2度と検出できないようでは困ります。rollover_flg は、ロールアウトが発生した時に false に直して、再度検出できるようにしておきましょう。 ロールアウトもロールオーバー同様、マウスが動いた時に発生します。 ロールオーバーとの違いは、「マウスカーソルがムービークリップの上にない」ということです。この点を利用します。 単にムービークリップとマウスカーソルが重なっていないだけではなく、ロールオーバーが発生した後にしか、ロールアウトは発生しません。 ロールオーバーが発生したかどうかは、rollover_flg に情報が保存されています。 従って、ロールアウトの条件は、  ・マウスが動いた時、発生する  ・ムービークリップの上に、マウスカーソルが重なっていない  ・rollover_flg が true このようになります。 これらの考え方通りにスクリプトを組むと、大体、こんなところでしょうか。  // 擬似 onRollOver / onRollOut 処理  onClipEvent(mouseMove)  {   //マウスが動いた時、カーソルとムービークリップが重なっている場合   if( this.hitTest(_root._xmouse,_root._ymouse,true) )   {    //フラグが false の時、ロールオーバーと見なす    if( ! rollover_flg )    {     //ロールオーバーのフラグを立てる     rollover_flg = true;     /* ここに rollOver イベント発生時の処理を書く */    }   }   //マウスとムービークリップが重なっていなかった場合   else   {    //フラグが true の時、ロールアウトと見なす    if( rollover_flg )    {     //フラグをクリア     rollover_flg = false;     /* ここに rollOut イベント発生時の処理を書く */    }   }  } ざっと試しただけなので、何か穴があるかも知れません。不明な点や不具合がありましたら、補足してください。 長くなってすみませんでした。

hirosan_4
質問者

お礼

ながながありがとうございます。 すごく参考になりました。 また何かありましたらお願いします。 本当にありがとうございました。

その他の回答 (6)

  • UNAHO
  • ベストアンサー率57% (20/35)
回答No.6

デバッグについて その1 on(press){ _root.A.B.gotoAndPlay("3") } の on(press){ を on(release){ に変えてみる。イベントのトリガーが変わるのでこれで動けば・・・理由は今は割愛します。 その2 on (keyPress "<Up>"){ _root.A.B.gotoAndPlay("3") } を追加してみる。Aをクリック後↑キーを押して正常に動けばヒット領域が重なって機能していない可能性があります。 これで動かなければ、 _root.A.B.gotoAndPlay("3")以後の処理がおかしい。 ミススペルがある。(半角全角など) Aをクリックして移動した後のBにスクリプトの記述がない。 ということが考えられます。 ご参考までに。

hirosan_4
質問者

お礼

ありがとうございます。 試してみます。 ながなが、アドバイスをいただきまして本当にありがとうございます。 参考にさせていただきます。

  • UNAHO
  • ベストアンサー率57% (20/35)
回答No.5

的はずれかもしれませんが、 _root.A.gotoAndPlay("5") この"5"に移動した後も上記のスプリクトが残っている場合、それが優先されてBを受け付けないということではないでしょうか? もしそうなら、移動後のAのキーフレームのon(press)を削除してみて下さい。 ちなみにgotoAndPlayとgotoAndStopの使い分けは関係ありませんよね。

hirosan_4
質問者

補足

gotoAndPlayとgotoAndStopは関係ありませんでした。 なぜうまくうごかせないんでしょうね。 昨日から一日中悩んでいます。TT インスタンスもスクリプトも間違いがないのでしたら、他に原因はないでしょうか? (ちゃんと、シンボルの方にも、インスタンス名はつけてありますよ。笑) なにか、これが足りないんじゃないと思う方ぜひ、アイデアをください。 お願いします。

  • antai
  • ベストアンサー率38% (88/227)
回答No.4

シンボルという表現があいまいで今ひとつわかりませんが、ムービークリップに書き込むのではなく、ムービークリップ内に透明ボタンを置いて、それにスクリプトを書き込んではどうでしょうか。 そうすれば、とりあえず単純なものでしたら、ターゲット(?)を指定しなくてもいいので on(press){ gotoAndPlay(5); } って書いておくだけで動くと思いますが。 タイプがムービークリップだと、オンマウスイベントが使えませんよね?(また、的外れかな?) root-A┬透明ボタン(アクションスクリプト)      ├その他、色々…      └B┬透明ボタン(アクションスクリプト)         └その他、色々… こんな感じでとりあえず動きましたが、どうでしょう。(うまく表示されてるかな?) 一応A・Bの中でそれぞれ動きをつけてやってみましたが。

  • DPE
  • ベストアンサー率85% (666/776)
回答No.3

Aのシンボル内にあるBがクリックされた時、B自身のタイムラインを操作したいのであれば、Bのインスタンスに  on(press)  {   this.gotoAndPlay("3");  } で、いかがでしょうか。「3」がフレームラベルではなくフレームの番号なら、" " は外して下さい。 ターゲットパスを _root から書くと絶対パスになります。絶対パスであれば、スクリプトを書いた場所がメインのタイムラインであろうとボタンであろうと、また、シンボルAのタイムラインであろうと、場所に左右されることなくターゲットを指定できるはずです。 this にして正常に動作するようでしたら、ターゲットパスの記述に問題があると思われます。インスタンス名に誤りがないか、また、フレームラベルをご利用とのことですので、ラベルの大文字/小文字、全角/半角に誤りがないかなどを、確認してみて下さい。

hirosan_4
質問者

補足

ご解答ありがとうございます。 ためしてみたのですが、やはり 相対パスにしても動かないです。 (あとフレームラベルと書き込んでいたのですが、フレームナンバーでしたので、”ははずして試してみました。) もっと詳しく説明させていただきます。 シンボルA(movieClip)には以下のスクリプトをかきこんであります。 on(rollOver){ _root.aboutusbtn(シンボルAのインスタンス名).gotoAndPlay(2) } on(rollOut){ _root.aboutusbtn.gotoAndPlay(5) } on(press){ _root.aboutusbtn.gotoAndPlay(8) シンボルAがクリックして動くと、いくつかの項目のボタンが増える仕組みでつくりました。 さらに項目の一つ(シンボルB)をクリックして同じ動きをさせたかったので、シンボルA内に作ったシンボルBに以下のスクリプトを書きました。 on(rollOver){ _root.aboutusbtn.goaisatubtn(シンボルBのインスタンス名).gotoAndPlay(4) } on(rollOut){ _root.aboutusbtn.goaisatubtn.gotoAndPlay(7) } on(press){ _root.aboutusbtn.goaisatubtn.gotoAndPlay(6) } シンボルAの文字の後ろには、アクションしやすいように、 alfaを0%にした長方形のboardが敷かれています。 また、シンボルBもその長方形の上に出るようにしてあります。 なにか誤りがあるのでしょうか? わかりましたら、教えてください。

  • antai
  • ベストアンサー率38% (88/227)
回答No.2

とりあえず、ここを見る限りだとってことで回答します。 オブジェクトの指定に関しては、絶対パスを使っているので問題ないと思いますが(間違っていなければ)、ただ、gotoAndPlayの()の中の数字は、""が必要ないと思います。 フレームラベルで指定する場合は""が必要になってきますが。 ここを見ての回答なので、ちょっと的外れかもしれませんが。

hirosan_4
質問者

補足

解答ありがとうございます。^^ フレームラベルは実際には指定していますので、 記入しています。 シンボルAが作動して、シンボルBが現れたところで、Bをクリックしても動作しないのです。インスタンス名も合ってるんですけどね。 なにがわるいのか、ぼくもわかりません。 助けてください。TT

回答No.1

こんにちは。今簡単なのを作って実験してみたところ正常に動きますね。 確認ですが、シンボルBを動かすためのスクリプトはどこに書いていますか?うる覚えなのですが、シンボルA内のシンボルBにスクリプトを書いてもシンボルAが実行されると思います。一度メインのタイムライン上にあるシンボルAにスクリプトを記述して試してみて下さい。 ムービーの入れ子でのスクリプトの記述は少しルールがありましたので、それで動かないんだと思います。 そのルールについては他の方の回答を待ってください^^あまりちゃんと覚えてないんで・・・

hirosan_4
質問者

補足

解答ありがとうございます。参考になりました。 スクリプトをどこに書いてあるかなのですが、 シンボルBに書き込んであります。 それでは、だめということですね!? movieClipのシンボルを使っていて、Aが動いてからBが現れるため、シンボルAに書き込むことができません。 どなたか、良い解決策を教えてください。 hirosan