ActionScript MouseEvent.clone() не работает?

Я столкнулся с проблемой при попытке повторной отправки события мыши в 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 правильно клонируются, что ставит меня в еще большую потерю относительно того, что здесь происходит.


person Not Sure    schedule 08.04.2009    source источник


Ответы (3)


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

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

person Alex Jillard    schedule 08.04.2009
comment
Я только что потерял еще больше уважения к Adobe из-за этой ошибки, которой уже почти год. Спасибо за ссылку. - person Not Sure; 08.04.2009
comment
Да, есть несколько таких ошибок. Это не влияет на многих людей, и обходной путь прост, поэтому я думаю, что они не беспокоятся. - person Alex Jillard; 08.04.2009
comment
Вероятно, больше похоже на то, что мы не можем заморачиваться с исправлением, и люди будут просто обойти это. Куриное яйцо :) - person Not Sure; 08.04.2009

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

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

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

person Damian    schedule 27.11.2009

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

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

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

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

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

person Andrew Traviss    schedule 10.03.2013