2011-12-14 1 views
0

のオフセット特定のオブジェクトの境界。私はこれを行う簡単なコードを使用しています...奇妙な私はカーソルが内に配置されているかどうか(私自身の正当な理由のために)チェックする必要があり、私は私のプロジェクトで起こって本当に奇妙な何か(フラッシュCS5.5とAIR 3 ...)</p> <p>を持つフラッシュ

if(mouseX > hsSlot1.x && mouseX < (hsSlot1.x + hsSlot1.width) && mouseY > hsSlot1.y && mouseY < (hsSlot1.y + hsSlot1.height)) 
    { 
     //My code 
    } 

これは、理論的には、完璧に動作するはずです!しかし、hsSlot1の視覚的な位置(画面上で表示されるように見える)とhsSlot1.xの間には約16のオフセットがあります。 y軸にも同様のオフセットがありますが、まだ測定していません。

これについて私が考えることができるのは、hsSlot1は、フィットするようにスケーリングされたボタン(1つの状態のみのボタン)のインスタンスです。しかし、私はそれがそうではないと考えています。なぜなら、数字はオブジェクト全体が現在のサイズでオフセットされていることを示しているからです。

悪魔は何をしていますか?

編集:私はこれを最初にやっていなかった別の方法を見つけました。事のこのタイプは、後にも問題がある可能性がありますしかし、答えはまだ...、高く評価されるだろう

答えて

2
頭に浮かぶものの

最初のカップルのための:グラフィックスのための

  1. 登録ポイントhsSlot1はちょうど左上ではありません。
  2. このコードをどのスコープから呼び出すのかはわかりませんが、hsSlot1が含まれていないコンテナから呼び出す場合は、少し離れた別のコンテナ内にある可能性があります。

はなぜこの(オブジェクトhsSlot1自体の中に)しようとしません:

派遣マウスが「上」であるhsSlot1からのイベントも:

if(mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height) 
{ 
    dispatchEvent(
     new Event("CUSTOM_ROLLOVER") 
    ); 
} 

、他の場所からそれを聞きます:

hsSlot1.addEventListener("CUSTOM_ROLLOVER", _reaction); 
function _reaction(e:Event):void 
{ 
    trace('Glorious success.'); 
} 

それは、あなたがどこかにグラフィックスを持っているように見えますが、それは登録ポイントの左上揃えではありません。

enter image description here

+0

範囲は間違いありません。あなたのコードを試してみてください... – CodeMouse92

+0

シンボル内のその特定の範囲は機能しませんでしたので、私はステージの範囲から同じことを試みました。 "if(hsSlot1.mouseX> = 0 && hsSlot1.mouseX <= hsSlot1.width && hsSlot1.mouseY> = 0 && hsSlot1.mouseY <= hsSlot1.height && hsSlot1.visible == true)"これは、シンボルの実際のサイズありがとう? – CodeMouse92

+2

時には、私のMovieClip内の子オブジェクトが(0,0)でなく、同様のタイプの問題が発生している場合があります。関係するすべてのオブジェクトを使ってMarty's#1を確認してください。 – ToddBFisher

1

簡単な答えは、あなたがこれに苦労してやっているということです、ので:私はちょうど私が何を意味するか理解するのに役立つかもしれないし、なぜそれがあなたのコードそれがない方法に影響を与えるまで描いたこの危険なダイアグラムオブジェクトのxおよびyおよびwidthおよびheightのプロパティは、必ずしもその境界に対応しているとは限りません。 Martyが指摘しているように、これは、オブジェクトの登録ポイント(オブジェクトのローカル座標空間の起点)が必ずしもオブジェクトのコーナーにある必要はないからです。さらに、スコープごとに何を行っているかによって、使用している方法によって、オブジェクトが拡大縮小されているか、回転されているかなどを考慮する必要があります。

ソリューション:

  1. あなたがやりたいために迅速かつ簡単な方法は、DisplayObject.hitTestPoint()です。これは、指定された(x、y)がクリップの境界ボックス内にあるかどうかを示します。オブジェクトの境界ボックスを確認したい場合は、3番目のパラメータにfalseを渡してください。スコープの問題を回避するには、グローバル座標空間で(x、y)を指定するので、マウスの位置を簡単にテストする方法は次のとおりです。

    myObject.hitTestPoint(stage.mouseX, stage.mouseY, false) 
    

    また、比較する前にローカル座標をグローバル空間に変換することもできます。

  2. オブジェクトの境界についてすべてを知る堅牢な方法は、DisplayObject.getBounds()を使用することです。 getBoundsに使用するスコープを明示的に指定することに注意してください。したがって、どのスコープについて知っておく必要があるかを明確に理解する必要があります。