Вопрос

Я столкнулся с проблемой при попытке переотправка события мыши в ActionScript 3, к чему я, признаться, немного недоверчив.Я сузил это до MouseEvent.clone() метод оказался, ну, совершенно сломанным.Следующий обработчик событий:

    private function handleMouseMove( evt : MouseEvent ) : void
    {
        trace("mousemove", evt.stageX, evt.stageY);
        var newEvt : MouseEvent = evt.clone() as MouseEvent;
        trace("mousemoveclone", newEvt.stageX, newEvt.stageY);
    } 

Результат: до бесконечности:

mousemove 167 206 
mousemoveclone 0 0

Это соответствует тому, что получал код, на который я перенаправлял MouseEvent, отсюда и моя гипотеза о неработающей функции клонирования.

Это прямо противоречит тому, что должно произойти в связанной документации, если только я что-то не пропустил.Я совершенно не понимаю, что я сделал (или не сделал), что могло вызвать такое поведение.Неужели ребята из AS3 забыли прочитать собственные документы по Event.clone()?

Я могу обойти это, используя вместо этого функциональные объекты для моего конкретного случая использования, но я бы предпочел не делать этого.Есть идеи?

Редактировать: Члены localX и localY, кажется, клонируются правильно, что еще больше запутывает меня в том, что здесь происходит.

Это было полезно?

Решение

Это известная ошибка.Вы можете увидеть отчет об ошибке здесь: http://bugs.adobe.com/jira/browse/FP-343

Однако все остальное должно быть клонировано.Вы всегда можете просто назначить stageX и stageY вручную, пока ошибка не будет исправлена.

Другие советы

Я понимаю, что эта тема неактивна уже 7 месяцев, но хочу немного обновить ее — она все еще активна в FP10 и Flex4.Это также произойдет, если вы повторно отправите событие.то есть:

private function mouseListener( e:MouseEvent ):void
{
    dispatchEvent( e );
}

этот вызов sendEvent() кажется эквивалентом clone(), поэтому для stageX и stageY установлено значение 0.

Это довольно старый вопрос, но он возник, когда я искал решение в Google, и то, что здесь, просто недостаточно полно.

Причина, по которой это не было «исправлено», заключается в том, что оно работает так, как задумано.Значения stageX и stageY вычисляются при вызове метода получения с использованием цели события для преобразования localToGlobal.Это необходимо для того, чтобы числа оставались верными, даже если целевой объект изменил положение, масштаб или поворот с момента отправки события.

Если вам действительно нужно повторно отправить MouseEvent с правильными значениями stageX и stageY, у вас есть два варианта:

  1. Создайте собственный подкласс MouseEvent, который переопределяет методы получения stageX и stageY.Вы можете либо сохранить исходную цель и выполнить вычисления localToGlobal самостоятельно, либо сохранить статические значения для stageX и stageY, используя значения, которые имеются при клонировании исходного события.

  2. Расширьте Sprite и добавьте на сцену диспетчер, чтобы стандартный MouseEvent работал правильно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top