2011-12-14 68 views
0

我有一些非常奇怪在我的项目正在进行(闪存CS5.5和AIR 3 ...)奇怪的偏移量在Flash

我需要检查(我自己很好的理由)光标是否位于内特定对象的边界。我正在使用一个简单的代码来做到这一点...

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

这理论上应该是完美的!然而,在hsSlot1的视觉位置(它出现在屏幕上的位置)和hsSlot1.x之间有一个偏移(我没有设置,请注意!)。 y轴上有一个类似的偏移量,但我还没有测量它。

我能想到的唯一的事情就是hsSlot1是一个按钮的实例(一个只有一个状态的按钮)被缩放以适合。但是,我不认为是这样,因为这些数字表明整个对象只是在当前的大小上进行偏移。

魔鬼正在发生什么?

编辑:我发现了另一种做法,开始时不工作。然而,答案仍然可以理解的,因为这种类型的东西可能是一个问题后,以及...

回答

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 2011-12-14 04:29:48

1

简单的答案是,你这个做硬盘的方式,因为对象的xywidthheight属性不一定对应于其边界。正如Marty指出的,这部分是因为对象的注册点(对象本地坐标空间的原点)不一定在对象的角落。此外,根据你在范围上做什么,你正在使用的方法可能需要考虑对象是否被缩放,旋转等等。

解决方案:

  1. 快速简便的方法,做你想要的是DisplayObject.hitTestPoint()。它告诉你一个给定的(x,y)是否落在剪辑的边界框内。如果您只想检查物体的边界框,请确保为第三个参数传递false。 (传递true会根据对象的实际形状检查x,y)。为了避免范围问题,可以在全局坐标空间中指定(x,y),因此测试鼠标位置的一种简单方法是:

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

    或者你当然可以在比较之前将局部坐标转换为全局空间。

  2. 了解对象边界的所有信息的可靠方法是使用DisplayObject.getBounds()。请注意,您明确指定了一个用于getBounds的范围,因此您需要清楚了解您需要了解的范围。