• ベストアンサー

FlashのActionScriptについて。

DPEの回答

  • ベストアンサー
  • 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
質問者

お礼

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

関連するQ&A

  • FlashのActionScriptについて

    FlashのActionScriptについて Flash CS4(AS2.0)を使用 Flashに関しては初心者で、色々な参考書を見ている中で、 AkutionScriptの書き方に色々なパターンがあって分からなくなりました。 アクションを書き込む際、 (1)専用のActionScriptのフレームを作成してそこに書く (2)ボタンインスタンスに書く (3)対象のシンボルのフレームに書く 上記3つの方法はそれぞれどのような違いがあるのでしょうか?又、どのようにして 使い分けするのでしょうか?

  • Flashでボタンをつくっているのですが、actionscriptをつ

    Flashでボタンをつくっているのですが、actionscriptをつかってボタンをクリックさせたいのですが、アクションパネルのところに「現在の選択範囲にアクションを割り当てることはできません。」と表示されてしまいます。 参考書に附属されているflaをみたところ、Actionscript1.0、2.0となっているのですが、作成しているのはActionscript3.0で作っています。 ====== on (release) { /*↑ボタンが押されて離されたら*/ _parent.gotoAndPlay("about"); /*↑「about」ラベルへ移動*/ } ====== このようなscriptをいれたいのですが、うまくいきません。 ムービークリップでボタンを作るまではできました。その後、何かが抜けているのかして上記のようなエラーがでます。 flash初心者のため、どういう風に書いて質問させていただいたらよいのかわからないのですが、参考flaと見比べたときに「シンボル定義」のなかにあるムービークリップがひとつたりませんでした。(このムービークリップは「navigation」というものですのでそれがありません。) 質問するにはあまりにも情報が少ないかもわかりませんが、何卒ご教授いただけると大変助かります。 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • FLASH、on (press)で…

    FLASH5を使用中です。 1フレーム目~3フレーム目ににあるボタンシンボルに on (press) { gotoAndPlay (2); } というアクションを書いています。 フレーム1~3には全てstopが書かれています。 マウスでクリックすると2フレーム目に移動するのですが、 その状態でもう一度クリックすると3フレーム目に移動してしまいます。 さらにもう一度クリックすると2フレーム目に戻ります。 これはどうしてなのでしょうか? どうすれば3フレーム目に移動させず、2フレーム目を繰り返す事ができるのでしょうか? 教えてください。お願いします。

  • 【flash】ムービークリップ内のフレームへのジャンプ

    flashの初歩的な質問で申し訳ないのですが、 ムービークリップ内でgotoが効きません。 「sumple」というムービーシンボルの中に配置したボタンシンボルを押し、 同じ「sumple」の中に名づけてある「a」というフレームに飛びたいのですがどうすればよろしいのでしょうか? 現状、ボタンを押したら行き先がわからないのか頭に帰ってきます。 アクションは on (release) { gotoAndPlay("a"); } です。 どこに何を足したら…いいんでしょうか… よろしくお願いします

  • FlashのActionScriptについて

    FlashのActionScriptについて質問です。 Yesか Noを選択する、診断テストみたいなフラッシュを作りたいのです。 1フレームには一番はじめの Yes Noが表示されています。 それのどちらかのボタンをクリックするまで、次のフレームに流れないようにするには、 1フレーム目にstop();でよいのでしょうか? それとも、sotoAndstopとかなのでしょうか? また複数のレイヤーがあるときstop();などのアクションスクリプトは 全部につけなければいけませんか?

  • 「ActionScriptでディレイみたいな制御」に関して

    こんにちは、初心者ですがお世話になりますm(__)m 使っているのは、Flash MXです(Ver6)主に書籍見ながら触っているところです。 【内容】 2フレーム目から、30フレーム目までモーショントゥイーンをいれてます。 30フレーム目にActionScriptにより、gotoAndPlay(2); で2フレーム目に戻して繰り返してます。 これを、30フレーム目に到達した際、10秒経過してからgotoAndPlay(2) で 移動させたいのですが、なかなかうまくいきません…。 ヒントみたいなので結構ですので、宜しければ返答のほうをお願い致します。

    • ベストアンサー
    • Flash
  • フレームラベルを使った複数指定について

          |1     |5   |10    |15   |20 レイヤー1 |▲*1*   |▲*2* |▲*3*   |▲*4* |▲*5* | レイヤー2 |●>--→|●--→|●>--→|●--→|●--→| レイヤー3 |●>--→|●--→|●>--→|●--→|●--→| レイヤー1にはフレームラベルが記入されています。 1フレーム目のレイヤー2のボタンは on(press){ gotoAndPlay("*1*"); gotoAndPlay("*2*"); } 1フレーム目のレイヤー3のボタンには on(press){ gotoAndPlay("*1*"); gotoAndPlay("*3*"); } としています。 こちらはきちんと正常に意図通りに動きます。 10フレーム目のレイヤー2には on(press){ gotoAndPlay("*3*"); gotoAndPlay("*4*"); } 10フレーム目のレイヤー3には on(press){ gotoAndPlay("*4*"); gotoAndPlay("*5*"); } としてみましたが、こちらは正常に動きません。 指定の仕方としては誤っているでしょうか? もし間違いでしたら正しい指定の仕方を教えてください。

    • ベストアンサー
    • Flash
  • Flashのセーブ機能の作り方

    こんにちは。はじめて質問させていただきます。 説明に不備がございましたら、申し訳ございません。 Flash暦は長くないのですが、 CS3 AS2.0を使用して、現在着せ替えを製作しております。 服や髪のアイコンを用意し、visibleを使ってアイコンをクリックで該当の箇所に 該当の服や髪を表示したり非表示にして着せ替えを作ることができました。 はじめは外部swfを読み込んでいたのですが、保存機能をつけたいため 上記のような仕様に変更いたしました。 しかし、保存がうまくできません。 1フレーム目にガチャへ、お家へ、アバターへといった選択肢を設け 2フレーム目にアバターを作っております。 2フレーム目には 「読み込み」「保存」ボタン 各アバターを表示させるためにクリックするアイコン「a1_1」「h1_1」 クリックで表示されるアバター画像「a1」「h1」 こちらを配置しております。 a1を髪と致しまして、h1をスカートにしています。 (2フレーム目)メインに ---------------------------- stop(); save=SharedObject.getLocal("sample"); ---------------------------- こちらを記入しており a1を表示させるためにクリックするアイコンには ---------------------------- on (release) { a1._visible=true; a1 = true; } ---------------------------- h1も同様にしてあります。 「保存」をボタンシンボルに変更し ----------------------- on(release){ _root.save.data.check=1; _root.save.data.a1=_root.a1; _root.save.data.h1=_root.h1; } ----------------------- 「読み込み」ボタンも同様にボタンシンボルに変更し ----------------------- on(release){ _root.a1 = _root.save.data.a1; _root.h1= _root.save.data.h1; } ----------------------- ちなみに表示される髪自体には ----------------------- onClipEvent(load){ _visible = false; } ----------------------- このような記載をしております。 アイコンクリックで画像の表示はされるのですが、 「保存」「読み込み」ができません。 いろいろ調べては見たのですが、どうしてもわかりませんでしたので 質問させていただきました。 どうか、アクションスクリプトに詳しい方ご回答よろしくお願いします。 また、もしこれを ---------------- on(press){ startDrag(this); } --------------- --------------- on(release){ stopDrag(); } --------------- これらを使って動かせるようにした場合 動かした状態を保存することなどはできるのでしょうか? また、外部swfを使った着せ替えの場合、保存はできないのでしょうか? 外部swfの場合アイコンには -------------- on (press) { _root.loadpoint2.loadMovie("he6.swf"); _root.loadpoint2.gotoAndPlay(1); } -------------- loadpoint2=空のムービークリップ he6.swf=髪型の配置してあるswf たくさん聞いてしまってすみません… ここでの質問も、Flashも初心者のため 情報不足でしたら大変申し訳ございませんが、 どうかご教授いただければと存じます。

    • ベストアンサー
    • Flash
  • このFLASHファイルが動かないわけは…。

              1  2  3  4  5  6  7  8  9  10 a         ●|●                          ※ボタン。「1」にthis stopが入ってます b         ●                             ※ムービー c         ●   |●|●                    ※「3」にthis stop。ボタン d               ●                        ※ムービー。シーン上の名前は「vision」 cのボタンに on(press){ _root.vision.gotoAndPlay(2); } on(press){ this.gotoAndPlay(3); } と入ってます。 dのムービークリップは           1  2  3  4  5  6  7  8  9  10 a         ●|●  > ● のような感じです。 ※「1」にthis stopが入ってます。 cのボタンをクリックしてもdのムービーがきちんと動きません。 どこがダメなのでしょうか?

  • Flash、ボタンが動かない!?

    Flashでコンテンツ制作中です。 ボタンが思うとおりに動きません。 まず、シーン1上に、レイヤー10枚400フレームほどでアニメーションを作っています。 まずは、あるボタンをクリックすると、他のフレームに移動するように作っています(移動はすべてフレームラベルをつけて移動しています)。 移動先はアニメーションなのでシンボルでアニメーションクリップ化しています。 そのアニメーションクリップはいくつかのボタンの集合体です。ボタンをクリックするとまた別のフレームに飛ばしたいのですが、うまく出来ません。 ボタン自体が動いていないわけではありませんでした。 on (release) {getURL("http://www.~~/");}にするとちゃんとページを表示します。 on (release) {gotoAndPlay("main");}とすると移動しません。 on (release) {gotoAndPlay("シーン 1", "main");} でもダメでした。 ラベルのスペル間違えではないとした場合、他に何かダメな理由が考えられることはありますか? よろしくお願いします。