Flash中的奇怪偏移

时间:2011-12-14 04:17:24

标签: flash actionscript-3 actionscript air flash-cs5

我的项目中有一些非常奇怪的东西(Flash CS5.5和AIR 3 ......)

我需要检查(出于我自己的理由)光标是否位于特定对象的边界内。我正在使用一个简单的代码来执行此操作...

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是一个按钮的实例(一个只有一个状态的按钮),它被缩放以适合。但是,我不认为是这样,因为数字显示整个对象仅以其当前大小偏移。

魔鬼到底发生了什么?

编辑:我发现了另一种方法,一开始就没有工作。但是,仍然可以理解答案,因为这类事情后来也可能是个问题......

2 个答案:

答案 0 :(得分:2)

首先想到的几件事情:

  1. hsSlot1图形的注册点并非完全位于左上角。
  2. 我无法分辨你从哪个范围调用此代码,但是如果你从一个不包含hsSlot1的容器中调用它作为直接子代,那么它可能在另一个容器内略微偏离。
  3. 为什么不试试这个(在对象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

答案 1 :(得分:1)

简单的答案是,您正在以艰难的方式执行此操作,因为对象的xy以及widthheight属性不一定对应于它的界限。正如Marty所说,这部分是因为对象的注册点(对象的局部坐标空间的原点)不一定必须位于对象的角落。此外,根据您在范围方面所做的工作,您使用的方法可能需要考虑对象是否缩放,旋转等等。

解决方案:

  1. 使用DisplayObject.hitTestPoint()快速轻松地完成所需操作。这会告诉您给定的(x,y)是否落在剪辑的边界框内。如果您只想检查对象的边界框,请务必将false传递给第三个参数。 (传递true将检查对象的实际形状的x,y。)为了避免范围问题,在全局坐标空间中指定(x,y),因此测试鼠标位置的一种简单方法是:

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

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

  2. 了解对象界限的有效方法是使用DisplayObject.getBounds()。请注意,您明确指定了用于getBounds的范围,因此您需要清楚了解需要了解的范围。