ActionScript MouseEvent.clone () не работает? - PullRequest
2 голосов
/ 08 апреля 2009

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

Ответы [ 3 ]

3 голосов
/ 08 апреля 2009

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

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

2 голосов
/ 27 ноября 2009

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

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

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

0 голосов
/ 11 марта 2013

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

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

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

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

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

...