【问题标题】:Strange Offset in FlashFlash中的奇怪偏移
【发布时间】:2011-12-14 04:17:24
【问题描述】:

我的项目中发生了一些非常奇怪的事情(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 是一个按钮的实例(一个只有一个状态的按钮),它被缩放以适应。但是,我不认为是这样,因为数字表明整个对象只是在其当前大小处偏移。

这到底是怎么回事?

编辑:我发现了另一种起初不起作用的方法。但是,仍然会感谢您的回答,因为这种类型的事情以后也可能会成为问题......

【问题讨论】:

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


    【解决方案1】:

    首先想到的几件事:

    1. hsSlot1 的图形注册点不完全位于左上角。
    2. 我不知道您从哪个范围调用此代码,但如果您从不包含 hsSlot1 作为直接子代的容器中调用它,那么它可能位于另一个容器中稍微偏离。

    为什么不试试这个(在对象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.');
    }
    

    您的图形似乎仍然在注册点的左上角不合理。我刚刚绘制的这个狡猾的图表可能会帮助您理解我的意思以及为什么它会以这种方式影响您的代码:

    【讨论】:

    • 符号内部的那个特定范围不起作用,所以我从舞台范围尝试了同样的事情。 “if(hsSlot1.mouseX >= 0 && hsSlot1.mouseX = 0 && hsSlot1.mouseY
    • 有时我会遇到我的 MovieClip 中的子对象不在 (0,0) 处并且发生类似类型的问题,即使代码看起来不错。确保用所有涉及的对象验证 Marty 的 #1。
    • 接受了,因为这最好地解释了问题,并提出了一种替代解决方法,而不是显而易见的 .hitTestPoint(),这是我现在使用的。
    • 出人意料地发现,我解决了我原来的算法,无需解决方法!因此,很抱歉,但我已将接受的答案改为我自己的答案,以确保读者能看到它。
    • 由于某种原因,人们认为我的回答不值得,所以我将其删除。这再次被接受。很抱歉造成混乱。
    【解决方案2】:

    简单的答案是,您这样做很困难,因为对象的xywidthheight 属性不一定对应于它的边界。正如 Marty 所指出的,这部分是因为对象的注册点(对象本地坐标空间的原点)不一定必须在对象的角落。此外,根据您在范围方面所做的事情,您使用的方法可能需要考虑对象是否被缩放、旋转等。

    解决方案:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多