• ベストアンサー

hitTestについて教えてください

var hit = mc.hitTest(_root._xmouse, _root._ymouse); if (hit) { ・・・・ } クリップ上にマウスオーバーしている時に、if分の処理を行うコードを上記のように書きました。 マウスがクリップにマウスオーバーした状態で、ステージ外へと移動するとif分が実行され続けます。 マウスがステージ外へ出たことを知ることは可能でしょうか教えてください。

  • Flash
  • 回答数1
  • ありがとう数3

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

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

マウスカーソルがステージ外に出た場合、 ステージ外に出る直前の座標値が保持されたままその値は変わらなくなるため、 ActionScript2.0 以下の Mouseクラス などでは、普通は検知できません。 しかし、 ボタン もしくは ムービークリップ の、 on(rollOut) または ○○.onRollOut=function(){} を使用すると 検知することができます。 他のコミュニティで、すみませんが↓。 「なぜなにGAC-二つのMCの距離が近づくとアニメーションをスタートする」 http://www.gac.jp/article/index.php?stats=question&category=19&id=22308&command=msg ※→「回答003のリンク先のサンプル」 上のサンプルでは、 背景(haikei)はムービークリップになっていて、  _root.haikei.onRollOut = function() {     mouse_flag = false;     kao._x = -1000;  }; で、マウスがステージ外にあるときは、 フラグをfalseにして代替カーソル(顔:kao)を非表示にしています。 面倒ですが、ムービー全体をこのことを基準にして作成する必要があります。 つまり、普通にボタンなどの配置はできません。 もしボタンなどを配置する場合は、 このステージ外検知用ムービークリップのロールアウトを常に意識して作成&コーディングする必要があります。 --------- ActionScript3.0 になると、 Mouse クラス の Event.MOUSE_LEAVE というものが使えるらしく、 これでマウスがステージ外へ出たことを検知できるようです(私は未検証)。 「Mouse - ActionScript 3.0 コンポーネントリファレンスガイド」 http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/ui/Mouse.html > 6.タイプが MOUSE_LEAVE の 4 番目のイベントリスナーが、関連する >  mouseLeaveHandler() メソッドと共に追加されます。このメソッドは、 >  ポインタがステージを離れると呼び出され、 >  mouseOutHandler() に新しい mouseMove リスナーオブジェクトを渡します。 >  これにより、ポインタが実質的に削除されるため、 >  ポインタがステージ上に残ることはありません。

infotown
質問者

お礼

ご回答いただきありがとうございます。 たいへん詳しい説明、ありがとうございます。 サンプルをご紹介いただきありがとうございます。 リンク先のサンプルとても勉強になります。 ステージ全体にムービークリップを配置し、onRollOut/onRollOverでステージ上にマウスがあるか判定する方法はとても分かりやすくて参考になります。 ありがとうございます。

関連するQ&A

  • マウス 追従 範囲外

    マウスを追いかけるMCを以下のように設定しましたが、 MCが動いている範囲外にマウスがいるときは追いかけるのを やめにしたい場合どのように記述すればよろしいでしょうか。  onClipEvent (mouseMove) { if (_root._xmouse >左 && _root._xmouse <右) { this._x = _root._xmouse; } if (_root._ymouse >上&& _root._ymouse <下) { this._y = _root._ymouse; } } 範囲外にマウスがいるときは定位置にmcを表示させるか、 表示を消したいです。 ちなみにmcが動く範囲の指定方法はネット上から探してきました。 別の方法でもっと適した記述があれば教えてください。

  • ムービークリップの領域をシェイプの形状にしたい

    よろしくお願い致します。 ムービークリップにマウスオーバーするとムービークリップが再生し、マウスアウトすると逆再生するというものを作っています。 ここで、ムービークリップのマウスオーバーする領域を矩形ではなく、見たままの形(シェイプの形状)だけに指定するにはどうすれば良いでしょうか? 現在の状況は、マウスオーバーさせるムービークリップに onClipEvent (load) { this.stop(); } onClipEvent (enterFrame) { if (this.hitTest(_root._xmouse, _root._ymouse, false)) { this.nextFrame(); } else { this.prevFrame(); } } のアクションを書いています。 自分なりに調べたところ、「shapeFlag?というものを使うらしい?」というのは分かったのですが、どう使えば良いのかさっぱり分かりません・・ どなたかご指導頂けないでしょうか。 どうぞよろしくお願い致します。

    • ベストアンサー
    • Flash
  • マウスを追いかける

    ムービークリップがマウスを追いかけるというようにしたいのですが、追いかけるムービークリップが別のシンボルの中にあると座標がずれるようで、このずれをなくしたいのですがどのようにすればよいのでしょうか? 詳しくは、シーン1にシンボル(ただの図形と追いかけてほしいムービー:mc1)を置いて、mc1に下記のスクリプトを書きました。 -------------------------------------------- onClipEvent (load) { _root.mc1.startDrag(true); x = _root._xmouse; y = _root._ymouse; } onClipEvent (enterFrame) { _x += (_root._xmouse-_x)/4; _y += (_root._ymouse-_y)/4; } --------------------------------------------

    • ベストアンサー
    • Flash
  • hitTest(_root._xmouse, _root._ymouse, true)が有効になりません

    WinXP,Flash8pro,photoshopCS2,IllustratorCSで オーサリングしています。 フォトショとイラレでPNG画像を作成し、 Flash8Proに読み込んでステージに配置し、 MCに変換してから hitTestスクリプトで hitTest(_root._xmouse, _root._ymouse, true)としようとしていますが、 hitTest(_root._xmouse, _root._ymouse, false)で 処理されてしまいます。 FireWorksで作成したFireWorksPNG形式だと 正常にTrueで動作します。 フォトショやイラレのPNGでは透過部分を判別し、True判定できないのでしょうか? また、どのようにしたらフォトショやイラレのPNGを Trueで処理できるのでしょうか。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Flash
  • 移動範囲を指定したい

    マウスを追いかけるMC1の追いかける範囲を指定したいのですがうまくいきません; 細かい指定としては↓ (1)画面の下1/5ぐらいのMC2の中にはMC1は入れない (2)マウスがMC2の中にある時はMC1はy座標は変化なし x座標はマウスを追いかける(つまり、横にしか動かない) (3)マウスがMC2から出てきたら、再びMC1はマウスを追いかける 現状としては ------------------------------------------- onClipEvent (enterFrame) { if (this.hitTest(_root.ki.kusa)){ _x += (_parent._xmouse-_x)*0.1; this._y += 0; }else{ _x += (_parent._xmouse-_x)*0.1; _y += (_parent._ymouse-_y)*0.1; } } ------------------------------------------- これでは、マウスがMC2から出てきた時に、MC1がMC2から離れないという様になってしまうのですがどうすればいいでしょうか??

  • 複数のmcに同じイベントを記述したら、1つしか反応しない

    うまくいかない原因がわからず困っています。 画面上の複数のmcに同じイベントを記述しました。 内容はシンプルで、「mc01にマウスがのったらフレームf01に移動する、 マウスが離れたらフレームstartに戻る」というものです。 mc02はf02へ、mc03はf03へ移動というふうにします。 これをmc01からmc07まで順番に書いていったところ mc07は反応するのですが、あとの6つが反応しません。 mc07の記述を消すとmc06が反応するようになり、 どうやら一番最後に記述している部分しか反応しないようです。 これ↓がそれぞれのmcに書いてるASです。 ---------------------------------------------------------- onClipEvent (enterFrame) { if (_root.mc01.hitTest(_root._xmouse,_root._ymouse,1)) { _root.gotoAndPlay("f01"); } else { _root.gotoAndPlay("start"); } } ---------------------------------------------------------- ちなみにFlash8使用、プレイヤー8でパブリッシュしてます。 どうぞよろしくお願いします。

    • ベストアンサー
    • Flash
  • 線の描画

    使用ソフトはFlashMX2004でMacOSXを使用しています。 線の描画なんですが、他の動きとの関係で マウス位置より85上に線を描画→描画の度に新しいMCを作る→最初に作られたMCから透明になって消える という流れを目指して制作しています。 表現の関係上、btとリンケージ名をつけたボタンを1度押し、離した時に描画位置を指定し、再びボタンを押した時に描画終了という動きをさせたいと思い、以前頂いたサンプルに手を加え var osi = 0; canvases = 0; bt.onPress = function() { canNum++; if (osi == 1 &&_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { _root.createEmptyMovieClip("can"+canvases, canvases); _root["can"+canvases]._alpha = 50; _root["can"+canvases].lineStyle(4, 0xffffff); _root["can"+canvases].lineTo(_root._xmouse, _root._ymouse-85); _root["can"+canvases].onEnterFrame = function() { this._alpha--; if (this._alpha<1) { this.removeMovieClip(); } }; updateAfterEvent(); canvases++; osi = 0; }; bt.onRelease = function() { if (osi == 1 &&_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { _root["can"+canvases].moveTo(_root._xmouse, _root._ymouse-85); } } }; というスクリプトをくみましたが描画されません。 私が手を加えた箇所が間違っているのでしょうか。 一応試行錯誤はしてみたんですが解決策が見当たらず・・・。 間違っていましたらご指摘お願いします。 また、解決策がありましたらご教授お願いします。 このスクリプトがてを加える前の状態です。 this.stop(); canNum = 0; var osi = 0; canvases = 0; bt.onPress = function() { canNum++; if (_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { mX = _root._xmouse; mY = _root._ymouse; osi = 1; } else { osi = 0; } }; bt.onRelease = function() { if (_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { if (osi>0) { _root.createEmptyMovieClip("can"+canvases, canvases); _root["can"+canvases]._alpha = 50; _root["can"+canvases].lineStyle(4, 0xffffff); _root["can"+canvases].moveTo(mX, mY); _root["can"+canvases].lineTo(_root._xmouse, _root._ymouse-85); _root["can"+canvases].onEnterFrame = function() { this._alpha--; if (this._alpha<1) { this.removeMovieClip(); } }; updateAfterEvent(); canvases++; osi = 0; } } }; 長くなってしまい申し訳ありません。

  • hitTestのロールアウト判定

    auのスライド式メニューなんですが、あれってボタンの中にボタンが入っていますよね?過去記事を読んだところ、「ボタンが重なり合った領域でマウス操作すると手前のインスタンスしかイベントを受け取れない」ので「hitTestを使う」とありました。ただ、ちょっと問題が・・ --問題点--- _________________________ |      |mc|mc|mc|mc| |  余白  | | | | | |      | | | | |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ こんな感じなんですが、swfに余白のある左側に出た場合はrollOut処理が働くのですが、余白のない「上、右、下」に出た場合に、処理が働かないんです。on()で記述した場合にはどの方向からでもrolloutするのに何故ダメなのでしょうか? --ActionScript--- onClipEvent (load) {  totalNum=4;leftX=20;rightX=320;mcPos=rightX;speed=5;  function mcSet(myNum){   var i=1;   while(i<=myNum){_parent["cont"+i+"_mc"].setMove("left");i++;}   while(i<=totalNum){_parent["cont"+i+"_mc"].setMove("right");i++;}  }  function setMove(dir) {   if(dir=="left"){mcPos=leftX;}else if(dir=="right"){mcPos=rightX;}   this.onEnterFrame=xMove;  }  function xMove(){   nextX=this._x+(mcPos-this._x)/speed;   if(Math.abs(mcPos-nextX)>0.1){this._x=nextX;   }else{this._x=mcPos;this.onEnterFrame=undefined;}  }  function init(){   var i=1;   while(i<=totalNum){    _parent["cont"+i+"_mc"].setMove("right");i++;   }  } } onClipEvent(enterFrame){  if(this.hitTest(_root._xmouse, _root._ymouse, true)){this.mcSet(1);}else{init();} }

    • ベストアンサー
    • Flash
  • マウスカーソルに応じたmcのスクロール(ループ型)

    マウスカーソルに応じて、複数配置してるmcがカーソルに合わせてスクロールして、ステージからはみ出したら、はみ出した側のステージの反対から出てくるっていうscriptを作ったのですが、うまくいきません。ループしてくれないんです。 ---- _root ---------------------- menu.mcというのがあり、そのmcの中にmenu01.mc、menu02.mc、menu03.mc・・・という感じでmcが配置してあります。menu.mc自体に別のスクリプト掛けてるので、こういう形にしてます。 ---- _root>menumc ---------------------- menu01.mcなどそれぞれのmenuのmcが入ってます。 さらに、それぞれのmcの中にscroll.mcというのをおき、そのscroll.mcにscriptが書いてあります。 ---- _root>menu.mc>menu01.mc 内scroll.mcのscript------ _visible = false; center = Stage.width/2; halfWidth = _parent._width/2; this.onEnterFrame = function() {  with(_parent){  //Scroll Speed   if (_root._xmouse<=180 || (_root._xmouse>250) && (_root._xmouse<=429)) {    moveX = (center-_root._xmouse)/15;   }else if(_root._xmouse>180 && _root._xmouse<=250){    moveX = 0;   }   _x = _x+moveX;   //Return Scroll   if(_x > Stage.width+halfWidth){    _x -= _width+Stage.width;   }else if(_parent._x < -halfwidth){    _x += _width+Stage.width;   }  } }; --------------------- で、これだときちんと思ったような動きでスクロールはするんですが、ただループしてくれないんです。しかもスクロールする毎にそれぞれのmcの間隔がずれてる気がします。最悪の場合だと、mcの上に別のmcが重なったりしてます。 なぜ、このような現象になってしまうのでしょうか?

  • ゲージと連動したムービークリップのアニメーションを動かす方法

    アクションスクリプト初心者です。 サンプルでいただいたムービーを参考に、ファイルを作成しなければならないのですが、うまく動かなくて困っています。 画面に横に長い帯(ゲージ)を置き、その上をマウスで横にスライドさせると、ムービークリップの中のアニメーションがマウスの動きと連動して動くというアニメーションなのですが、うまく動きません。 サンプルでいただいたファイルの帯(ゲージ)の部分、(これもムービークリップです) には -------------------------------------------- onClipEvent (mouseMove) { if (this.hitTest(_root._xmouse, _root._ymouse, true)) { _root.pressure.gotoAndStop(Math.round(((_root._xmouse)/12))); } } -------------------------------------------- と入っていました。 他には、STOPしか入っていませんでした。 数値を変えてみたりしたのですが、アニメーションの途中から動いたり、うまく連動してくれません。 どうやら、サンプルでいただいたムービーと、ファイルサイズが違うことと、新たに作成するファイルは、帯(ゲージ)を画面の右側に置かなければいけないところがうまくいかない原因のひとつかと、わからないながらに思っているのですが・・・; 環境は、Windows2000、FLASHMX2004です。 どなたか、よろしくお願いします。m(__)m

専門家に質問してみよう