Flash 闪光中的奇怪偏移

Flash 闪光中的奇怪偏移,flash,actionscript-3,actionscript,air,flash-cs5,Flash,Actionscript 3,Actionscript,Air,Flash Cs5,我的项目中有一些非常奇怪的事情(FlashCS5.5和AIR3…) 我需要检查(出于我自己的理由)光标是否位于特定对象的边界内。我用一个简单的代码来做这个 if(mouseX > hsSlot1.x && mouseX < (hsSlot1.x + hsSlot1.width) && mouseY > hsSlot1.y && mouseY < (hsSlot1.y + hsSlot1.height)) {

我的项目中有一些非常奇怪的事情(FlashCS5.5和AIR3…)

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

if(mouseX > hsSlot1.x && mouseX < (hsSlot1.x + hsSlot1.width) && mouseY > hsSlot1.y && mouseY < (hsSlot1.y + hsSlot1.height))
    {
        //My code
    }
if(mouseX>hsSlot1.x和&mouseX<(hsSlot1.x+hsSlot1.width)和&mouseY>hsSlot1.y和&mouseY<(hsSlot1.y+hsSlot1.height))
{
//我的代码
}
从理论上讲,这应该是完美的!但是,在hsSlot1的可视位置(屏幕上显示的起始位置)和hsSlot1.x之间有一个大约16的偏移量(请注意,我没有设置)。y轴上有一个类似的偏移,但我还没有测量它

对于这一点,我唯一能想到的是hsSlot1是一个按钮的实例(该按钮只有一个状态),该按钮被缩放以适合。然而,我不认为是这样,因为数字显示整个对象只是以其当前大小偏移

到底发生了什么事


编辑:我找到了另一种开始不起作用的方法。不过,如果您能给出一个答案,我们将不胜感激,因为这类事情以后可能也会成为一个问题……

首先想到的几件事:

  • hsSlot1
    图形的注册点不完全在左上角
  • 我不知道您从哪个范围调用此代码,但如果您从一个不包含
    hsSlot1
    的容器(作为直接子容器)调用此代码,则它可能位于另一个稍微偏离的容器中
  • 为什么不试试这个(在对象
    hsSlot1
    本身中):

    当鼠标在
    hsSlot1
    上时,从它发送一个事件:


    看起来您仍然有一些图形没有从左上角对齐到注册点。我刚刚绘制的这个狡猾的图表可能会帮助您理解我的意思,以及为什么它会以这种方式影响您的代码:


    首先想到的两件事:

  • hsSlot1
    图形的注册点不完全在左上角
  • 我不知道您从哪个范围调用此代码,但如果您从一个不包含
    hsSlot1
    的容器(作为直接子容器)调用此代码,则它可能位于另一个稍微偏离的容器中
  • 为什么不试试这个(在对象
    hsSlot1
    本身中):

    当鼠标在
    hsSlot1
    上时,从它发送一个事件:


    看起来您仍然有一些图形没有从左上角对齐到注册点。我刚刚绘制的这个狡猾的图表可能会帮助您理解我的意思,以及为什么它会以这种方式影响您的代码:


    简单的答案是,这样做很困难,因为对象的
    x
    y
    宽度
    高度
    属性不一定与其边界对应。正如Marty所指出的,这部分是因为对象的注册点(对象局部坐标空间的原点)不一定必须位于对象的拐角处。此外,根据您在范围方面所做的工作,您使用的方法可能需要考虑对象是否缩放、旋转等

    解决方案:

  • 要想做你想做的事,最简单快捷的方法就是使用。这将告诉您给定的(x,y)是否位于片段的边界框内。如果只想对照对象的边界框进行检查,请确保传递第三个参数的
    false
    。(传递true将对照对象的实际形状检查x,y。)为了避免范围问题,可以在全局坐标空间中指定(x,y),因此测试鼠标位置的一种简单方法是:

    myObject.hitTestPoint( stage.mouseX, stage.mouseY, false)
    
    当然,也可以在比较之前将局部坐标转换为全局空间

  • 了解对象边界的所有信息的可靠方法是使用。请注意,您显式地指定了一个用于getBounds的范围,因此您需要清楚地了解需要了解的范围


  • 简单的答案是,这样做很困难,因为对象的
    x
    y
    宽度
    高度
    属性不一定与其边界对应。正如Marty所指出的,这部分是因为对象的注册点(对象局部坐标空间的原点)不一定必须位于对象的拐角处。此外,根据您在范围方面所做的工作,您使用的方法可能需要考虑对象是否缩放、旋转等

    解决方案:

  • 要想做你想做的事,最简单快捷的方法就是使用。这将告诉您给定的(x,y)是否位于片段的边界框内。如果只想对照对象的边界框进行检查,请确保传递第三个参数的
    false
    。(传递true将对照对象的实际形状检查x,y。)为了避免范围问题,可以在全局坐标空间中指定(x,y),因此测试鼠标位置的一种简单方法是:

    myObject.hitTestPoint( stage.mouseX, stage.mouseY, false)
    
    当然,也可以在比较之前将局部坐标转换为全局空间

  • 了解对象边界的所有信息的可靠方法是使用。请注意,您显式地指定了一个用于getBounds的范围,因此您需要清楚地了解需要了解的范围


  • 符号内部的特定范围不起作用,所以我从舞台范围尝试了同样的事情。“如果(hsSlot1.mouseX>=0&&hsSlot1.mouseX=0&&hsSlot1.mouseY,有时我的MovieClips中的子对象不在(0,0)处,我就有了它。”即使代码看起来很好,也会出现类似类型的问题。请确保使用所有涉及的对象验证Marty的#1。接受,因为这可以最好地解释问题,并建议一种替代解决方案,而不是显而易见的解决方案
    myObject.hitTestPoint( stage.mouseX, stage.mouseY, false)