AS3でのマウスイベント受け渡しについて

このQ&Aのポイント
  • AS3でのマウスイベント受け渡しについての質問です。親オブジェクトと子オブジェクトのイベントリスナーの処理方法を教えてください。
  • AS3でのマウスイベント受け渡しについての質問です。子オブジェクトのイベントリスナーと親オブジェクトのイベントリスナーをどのように記述すればよいか教えてください。
  • AS3でのマウスイベント受け渡しについての質問です。子オブジェクトと親オブジェクトのマウスイベントの処理方法について教えてください。
回答を見る
  • ベストアンサー

AS3でのマウスイベント受け渡しについて

Actionscript3についての質問です。 どちらもSpriteクラスの親オブジェクトと子オブジェクトがあり、 ・MOUSE_OVERとMOUSE_OUTは親オブジェクトのイベントリスナーに処理をさせたい(子のaddやremoveを行うので)。 ・CLICKは子オブジェクトのリスナーに処理させたい。 という場合、どのように記述すればよいのでしょうか。 今のところ、子はmouseEnabledをfalseにして、親のクリックイベント処理でマウス座標からどの子がクリックされたのか(子は複数あります)を切り分ける方法しか思いつきません。 しかし、子が単純な形ではないのでこの方法では厳しいです。 他に何か良い方法は無いでしょうか。

  • L1L
  • お礼率100% (7/7)
  • Flash
  • 回答数1
  • ありがとう数3

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

hitTestPoint 「インスタンスと点の当たり判定を調べる」 http://hakuhin.hp.infoseek.co.jp/main/as3/container.html#CONTAINER_07 ↑これは説明のためのサンプルですから addEventListener(Event.ENTER_FRAME,function(event){ のように ENTER_FRAME を使用しています。 こういう非効率な方法をとるのではなくて, 親を CLICK するタイミングで当たり判定をすれば良いと思います。 ※ActionScript3.0 作成環境ではないため私は全く検証できませんが。

L1L
質問者

お礼

ありがとうございます。 その方法で解決しました。

関連するQ&A

  • 複数インスタンスに共通するイベント処理の方法

    こんにちは。 ActionScript3.0でサイト制作を行なっています。 マウスイベントのイベントリスナーを複数のボタンに登録する際に、 ループ処理によって登録できないか考えました。 例えば、 menu.buttonHome.addEventListener(MouseEvent.MOUSE_OVER, homeOver); menu.buttonAbout.addEventListener(MouseEvent.MOUSE_OVER, AboutOver); 上記は違うインスタンスにマウスオーバーのイベントを登録しておりますが、 記述にある「Home」「About」以外は全て共通の書式ですので、この部分だけ文字列を置き換えて処理できないでしょうか? 例えば、配列に「Home」「About」「Contact」のような文字列を格納し、上記イベントリスナーの指定の文字列だけを置き換えるという方法です。 また、上記のような文字列の置き換え以外にイベント処理の記述を簡略化する方法がありましたら是非ご教授ください。 宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • CLICKイベントと、MOUSE_DOWNイベント

    AS3です。 CLICKイベントと、 MOUSE_DOWN、MOUSE_UPイベント って 併用できないのでしょうか? 画像のギャラリーを作っています。 クリックしたときに、ボタンの色が一瞬変わって、 ギャラリーの画像も変わるものを作ろうとしています。 addEventListener(MouseEvent.MOUSE_DOWN, mDown, false, 0, true); addEventListener(MouseEvent.MOUSE_UP, mUP, false, 0, true); addEventListener(MouseEvent.CLICK, mClick, false, 0, true); こうすると、 mDown、mUPのハンドラ関数は実行されるのですが mClickのハンドラ関数は無視されます。 併用できない場合、上記のことを達成するには どのようにみなさん書かれているのでしょうか? ご存知の方いらっしゃいましたら、 何卒よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • AS3.0でマウスボタンの状態を調べたいのですが、良い方法はないでしょうか

    AS3.0になって、releaseOutsideに相当するものがなく、マウスボタンが領域外で離されたことを取得できず困っています。 いろいろ調べてみたんですが、良い方法が見つかりません。 作っているのはドラッグ&ドロップのスクリプトです。 startDrag()した後、領域外で離されたときにもstopDrag()できるように、stageに対してMOUSE_UPをリスナー登録しています。 my_mc.stage.addEventListener(MouseEvent.MOUSE_UP,onMouseUp); function onMouseUp(event:MouseEvent):void { my_mc.stopDrag(); my_mc.stage.removeEventListener(MouseEvent.MOUSE_UP,onMouseUp); } 通常はこれでうまくいくんだと思いますが、今作っているものには、ステージに選択可能テキストフィールドがあります。 ドラッグ中にそのテキストフィールドの上でマウスボタンを離すと、stageにMOUSE_UPイベントが発生しないようで、stopDrag()が働かず、マウスボタンを離していても、my_mcがくっついてきてしまいます。 ソーテック社の「Flash ActionScript3.0入門ノート」を購入してAS3.0の勉強をしているのですが、そのドラッグ&ドロップのパッケージ(SimpleDrag2.as)でも、選択可能テキストフィールドを置くと、同じ不具合が出てしまいます。 AS2.0では、releaseOutsideを使っていてうまくいきました。 マウスボタンの状態を取得する方法があれば、ENTER_FRAMEで状態を見張って、stopDrag()することもできると思うのですが、状態を取得する方法が見つかりません。 AS3.0で確実にstopDrag()できる方法をご存知でしたら、教えてください。 よろしくお願いいたします。

  • スクリーン座標上でのmouse_eventでのマウスの動き

    御世話様です。 mouse_eventコマンドを使って、スクリーン座標のドラックする範囲を選択しているのですが、選択した範囲が座標で指定した部分より広くなってしまいます。 プログラムは以下の通りです。原因わかる方がいれば ご教授ください。よろしくお願い致します。 (開発環境 Windows2000 Visual Basic6.0) Private Sub Command1_Click() 'ドラッグの自動化 Dim x As Long Dim y As Long 'zahyoux(1.0):選択範囲右下のx座標 'zahyoux(0.0):選択範囲左上のx座標 'zahyoux(1.1):選択範囲右下のy座標 'zahyoux(0.1):選択範囲左上のy座標 'ドラッグする範囲(横) x = zahyoux(1, 0) - zahyoux(0, 0) 'ドラッグする範囲(縦) y = zahyoux(1, 1) - zahyoux(0, 1) 'ドラッグする始点にマウスを移動 Call SetCursorPos(zahyoux(0, 0), zahyoux(0, 1)) 'マウスの左ボタンをクリック Call mouse_event(MOUSEEVENTF_LEFTDOWN,0 ,0, 0, 0) '左ボタンを押したまま移動 Call mouse_event(MOUSE_MOVED, ax, ay, 0, 0) '左ボタンを上げる Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) End Sub

  • as3 e.currentTargetの階層へのアクセス

    as3 e.currentTargetの階層へのアクセス 例えば、 mc.addEventListener(MouseEvent.CLICK, test); function test(e:Event):void { trace("e.currentTarget.x"); } これで、x座標は表示できると思うのですが、 親mc、子mcChild←のような階層のムービークリップの場合、 mc.addEventListener(MouseEvent.CLICK, test);(mc.mcChildではなく) でリスナーを登録した状態で、 関数側でmcChildのx座標を操作することはできるのでしょうか? イメージとしては、 mc.addEventListener(MouseEvent.CLICK, test); function test(e:Event):void { trace("e.currentTarget[ここに子へのパス].x"); } ご教授お願いいたします。

    • ベストアンサー
    • Flash
  • [AS3]ループするたびに変数等は新規生成される?

    Actionscript3.0 Adobe Flash Professional CS5 いつもお世話になっております。 独学でActionscript3.0を触っています。 基本的なことですが、調べても思っている答えが出てこないので質問させてください。 for文やシーンのジャンプなどによって、いわゆるループ処理をするたびに、「var」で生成されている変数やインスタンスはどんどん増えていくものなのでしょうか。 たとえば今私が作っているものですが シーン2にムービークリップ「botan1」~「botan4」があります。 どれかをクリックしたら、シーン3ないし4に飛びます。行き先はランダムで決めています。 そしてシーン3・4にある「戻る」ボタンをクリックしたらシーン2に戻ってくる仕組みです。 実際に実行した場合、シーン2に var Flag:int; var botan1:MovieClip=new MovieClip(); botan1.addEventListener(MouseEvent.CLICK,botan1Push) function botan1Push(e:MouseEvent){ gotoAndPlay(3);//実際はランダムに飛ぶ trace("ボタン1が押されました"); } //以下略 と書いてあったとして、初回実行時にFlagやムービークリップが生成され、またイベントリスナも生成されますよね。 そしてbotan1をクリック→シーン3に飛ぶ→シーン2に戻ってきたときに 新たにFlagやMC、イベントリスナは作成されたりするのでしょうか。 それとも、上書きでもされるのでしょうか。 変数やムービークリップだけでなく、「var urlReq:URLRequest=new URLRequest("URL");」などのURLリクエストやローダーについても気になります…。 AS3について調べていると、メモリ開放…とか、要らなくなったリスナはremove…とか書いてあるので、 もしシーンに戻るたびに生成されているならば、40回くらいループする上実際は上記よりももっと沢山生成するので、その容量たるや…?といった感じです。 本当に初歩的な質問で恐縮なのですが、どなたかご教授ください。。 (PrivateやPublicの違いすら分かっていません…)

    • ベストアンサー
    • Flash
  • 配列に入れたムービークリップのマウスイベントについて

    こんにちは。 actionscript3.0にて制作をしております。 FLASH CS4上にテキストフィールドが入ったムービークリップが予め作成してあり、 それを「box_mc」という名前でライブラリに登録しております。 box_mcを配列に格納し、それぞれにマウスイベントで横に10移動する処理を割り当てたく 下記の様な文法で作成しましたが、ランタイムエラー「#1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。」とエラーが表示されてしまいます。 それぞれの配列に正しくマウスイベントを割り当てるにはどうしたら良いでしょうか? var boxArray:Array = new Array(); for (var i:int = 0; i < 3; i++) { boxArray[i] = new box_mc(); // ボックス // マウスオーバーイベント boxArray[i].addEventListener(MouseEvent.MOUSE_OVER, function (event:MouseEvent):void { boxArray[i].x = 10; }); } お手数では御座いますが、ご教授いただけると幸いです。 宜しくお願い申し上げます。

    • ベストアンサー
    • Flash
  • イベントに独自引数を渡したい。

    ACTIONSCRIPT3.0で、外部ファイルを読み込ませる処理を行っているのですが、読み込み完了時の関数に独自の引数を渡すことは不可能なのでしょうか? var j:int = 100; var myArray:Array; for(var i=0;i<j;i++){  myArray[i] = new Loader();  myArray[i].load(new URLRequest(別の配列に入っている文字列のURL))  myArray[i].contentLoaderInfo.addEventListener(Event.INIT,myfunc); } function myfunc(e){イベント発生時の処理} のように、多数のイベント処理を書くときに配列のインデックスによって処理を分けたいのですが、上の例だとイベント発生時の関数であるmyfuncの引数は規定オブジェクトなので独自のものが渡せません。 いまは別にグローバルな配列を作成して処理をしているのですが、メモリ常駐になることや、オブジェクト指向として気に入らない状態です。 イベントが発生したオブジェクトの名前をキーにすることも考えましたが、どの道スマートではない。なにか方法はないものでしょうか? また、言語仕様的にやむをえないのでしょうか?

    • ベストアンサー
    • Flash
  • イベントリスナの削除

    あるオブジェクトとそれ以外のいくつかのオブジェクトを含むドキュメントがあります。 そのドキュメント全体のうち、例えば、すべてのa要素に対して、clickイベントを追加したとします。 また、そのドキュメントのうち「あるオブジェクト」だけを非同期通信によって差し替えます。 この時、差し替えられる前の「あるオブジェクト」に登録されたイベントが残ったまま、新しいオブジェクトに差し替えられてしまいます。 これを何度も繰り返していくことで、UAは悲鳴を上げているようなのです。(具体的には、ページ内リンクを辛そうにしています) 解消するには、『「あるオブジェクト」だけを非同期通信によって差し替え』る直前に、「あるオブジェクト」に登録されたイベントをすべて破棄すればいいと思うのです。 ですが、登録されたイベントの一部は引数を与える必要があったため、 Obj.addEventListener(eType, (function(arg) {  return function(event)  {   //こう書くと、argにaが、eventにイベントオブジェクトが渡される  } })(a), false); このような記述をしており、関数名がありません。 そこで、あるオブジェクトに対して、登録されたイベントをすべて破棄する、良い方法があればご教授頂きたく、質問させていただきます。 よろしくお願いいたします。

  • 登録済みイベントリスナーの情報を取得したい

    子画面に別機能をロードするようなページを作成しており、その子画面がオンロードで登録したイベントリスナーをクローズの際に削除するような仕組みにしています。 この処理を行う際、登録済みのリスナー情報を取得できる方法があれば知りたいのですが、方法がわかりません。 (無ければ無いで、管理マネージャーのような仕組みを作成しようと思っています。) よろしくお願いします。

専門家に質問してみよう