hitTestPoint не дает правильных результатов - PullRequest
1 голос
/ 27 сентября 2010

У меня есть фрагмент ролика, к которому я добавил слушателя MouseEvent.MOUSE_OUT.

movieclip.addEventListener(MouseEvent.MOUSE_OUT, removeMovieClip);

Теперь логика состоит в том, чтобы удалить видеоклип на MOUSE_OUT и добавить его на сцену на MouseOver другой кнопки.Предполагаемая функциональность похожа на слайдер, показывающий некоторую информацию

В этом случае срабатывание MouseEvent.MOUSE_OUT не всегда работает должным образом.Когда я быстро убираю мышь из движущегося зажима , она срабатывает .Если я уйду очень медленно , он не сработает и, следовательно, видеоклип останется на сцене.

В чем может быть проблема?.

Обновление: Я забыл упомянуть, что использую hitTestPoint , чтобы проверить, находится ли мышь вне MovieClip .В большинстве случаев, если я медленно перемещаю мышь, hitTestPoint не дает правильных результатов (ложно), что она находится за пределами мувиклипа, и, следовательно, я не могу удалить объект.

Обновление 2: Позвольте мне перефразировать вопрос.Я думаю, что перепутал объяснение.
События мыши работают правильно.

movieclip.addEventListener(MouseEvent.MOUSE_OUT

срабатывает правильно, и я нахожусь в методе обработки события.Теперь, когда я пытаюсь выяснить, вышел ли я из этого фрагмента ролика, возникает проблема.

private function removeObj(eve:Event):void
{
    var e:MouseEvent = MouseEvent(eve);
    if (m_wishlistImage)
    {
        var InsideSlot:Boolean = eve.currentTarget.hitTestPoint(e.stageX, e.stageY);
        if(!InsideSlot){

При медленном перемещении мыши из объекта InsideSlot остается верным, и, следовательно, поток кода не входит в условие if, и, следовательно, я не могу удалить объект.

Во время трассировки e.stageX Я вижу, что он часто показывает координаты, которые не совсем там, где находится мышь, когда она выдвигается (показывает точку внутри слота).Такое поведение чаще всего проявляется, когда я медленно выезжаю.

В чем может быть причина?

Ответы [ 4 ]

4 голосов
/ 28 сентября 2010

Убедитесь, что ваша позиция мыши находится в сцене координаты (НЕ координаты вашего дочернего мувиклипа).

Другими словами, убедитесь, что вы используете stage.mouseX, stage.mouseY, в отличие от неявного использования локальных переменных-членов внутри фрагмента ролика (что даст положение мыши относительно фрагмента ролика).

hitTestPoint требует указания точки в качестве координат сцены.

1 голос
/ 28 сентября 2010

Что ж, эту проблему можно решить, если вы замените свой код MouseEvent.MOUSE_OUT на событие Event.ENTER_FRAME.Вы должны использовать его, потому что перемещения мыши иногда не регистрируются в слушателях событий мыши, а также потому, что частота кадров swf обычно слишком высока для отслеживания движений мыши, поэтому используйте Event.ENTER_FRAME.

И я сталкивался с такой проблемой раньше.Поэтому добавьте слушатель на сцену следующим образом:

addEventListener (Event.ENTER_FRAME, removeMovieClip)

Теперь, прежде чем удалять объект или movieClip из контейнера, поставьте проверки также как

public function removeMovieClip(evt: Event): void

{

If (ParentClip.contains (ChildClip)) ParentClip.removeChild (ChildClip) ..

}

1 голос
/ 27 сентября 2010

вместо этого попробуйте прослушать событие MouseEvent.ROLL_OUT.

0 голосов
/ 28 сентября 2010

Если для свойства MovieClip mouseChildren не установлено значение false, вполне вероятно, что вы инициируете событие MOUSE_OUT до того, как ожидаете, в зависимости от содержимого MovieClip.

...