Странное смещение во Flash - PullRequest
0 голосов
/ 14 декабря 2011

В моем проекте происходит что-то действительно странное (Flash CS5.5 и AIR 3 ...)

Мне нужно проверить (по моим собственным причинам), находится ли курсор в границах определенного объекта. Я использую простой код для этого ...

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

Это, теоретически, должно работать идеально! Тем не менее, есть смещение (и я НЕ установил, заметьте!) Около 16 между визуальной позицией hsSlot1 (где она начинается на экране) и hsSlot1.x. Аналогичное смещение по оси Y есть, но я еще не измерял его.

Единственное, о чем я могу подумать, это то, что hsSlot1 - это экземпляр кнопки (с одним состоянием только в этом), который был масштабирован для соответствия. Однако я не думаю, что это так, потому что цифры показывают, что весь объект просто смещен в его текущем размере.

Что, черт возьми, происходит?

РЕДАКТИРОВАТЬ: Я нашел другой способ сделать это, который сначала не работал. Тем не менее, ответ все равно будет оценен, так как этот тип вещей может стать проблемой позже ...

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Первые две вещи, которые приходят на ум:

  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

1 голос
/ 15 декабря 2011

Простой ответ заключается в том, что вы делаете это сложным образом, потому что свойства x и y и width и height объекта не обязательно соответствуют его границам. Как отмечает Марти, это отчасти связано с тем, что точка регистрации объекта (источник локального координатного пространства объекта) не обязательно должна быть в углу объекта. Кроме того, в зависимости от того, что вы делаете в области видимости, используемый вами метод может потребоваться для учета того, масштабируется ли объект, поворачивается и т. Д.

Решения:

  1. Быстрый и простой способ сделать то, что вы хотите, с помощью DisplayObject.hitTestPoint(). Это говорит вам, попадает ли данный (x, y) в ограничивающую рамку вашего клипа. Обязательно передайте false для третьего параметра, если вы просто хотите проверить ограничивающий прямоугольник объекта. (Передача true проверит x, y относительно фактической формы объекта.) Чтобы избежать проблем с областью действия, вы указываете (x, y) в глобальном координатном пространстве, поэтому один из простых способов проверить местоположение мыши состоит в следующем:

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

    Или, конечно, вы можете преобразовать локальные координаты в глобальное пространство перед сравнением.

  2. Надежный способ узнать все о границах объекта - использовать DisplayObject.getBounds(). Просто имейте в виду, что вы явно указываете область, используемую для getBounds, поэтому вам необходимо иметь четкое представление о том, о какой области вы должны знать.

...