ActionScript MouseEvent.clone () estiver quebrado?
-
05-09-2019 - |
Pergunta
Eu tenho que correr em um problema a tentativa de redespacho eventos de mouse em ActionScript 3, que estou reconhecidamente um pouco incrédulo sobre. Eu reduzi-lo ao MouseEvent.clone()
método aparecendo, assim, completamente quebrado. O seguinte manipulador de eventos:
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);
}
Os resultados na seguinte saída, ad infinitum:
mousemove 167 206
mousemoveclone 0 0
este correspondências o que o código que foi redespacho o MouseEvent para recebia, daí a minha hipótese da função clone quebrado.
Esta é diretamente contraditório com o que a documentação associada indica deve acontecer, a menos que eu tenha perdido alguma coisa. Eu estou em uma perda inteira, como o que eu fiz (ou não fez) que poderia causar esse comportamento. Será que os caras AS3 realmente se esqueça de ler os seus próprios documentos em Event.clone()
?
Eu posso contornar isso em vez de usar objetos de função para o meu caso de uso específico, mas eu prefiro não. Alguma idéia?
Editar:. Os membros localX e localY estão a ser devidamente clonada que parece, o que me coloca em ainda mais de uma perda sobre o que está acontecendo aqui
Solução
Isso é um bug conhecido. Você pode ver o relatório de bug aqui: http://bugs.adobe.com/jira/ Navegar / FP-343
Tudo o resto deve ter clonado embora. Você sempre pode apenas atribuir stageX e stageY manualmente até que o erro seja corrigido.
Outras dicas
Eu percebo esta discussão é de 7 meses dormente, mas apenas para atualizar isso um pouco - isso ainda está ativo no FP10 e Flex4. Isso também acontece se você reexpedição do evento. ou seja:.
private function mouseListener( e:MouseEvent ):void
{
dispatchEvent( e );
}
que dispatchEvent (call) parece ser o equivalente de um clone (), de modo que o stageX e stageY estão definidas para 0
Esta é uma questão bastante antiga, mas foi o que surgiu quando eu Googled por uma solução, e que está aqui não é apenas o suficiente abrangente.
A razão que esta não foi "fixo" é porque ele está funcionando como deveria. Os valores stageX e stageY são calculados quando você chamar o getter, usando-alvo do evento para fazer a conversão localToGlobal. Isso é necessário para que os números permanecem correta mesmo se o objeto alvo mudou de posição, escala ou rotação desde que o evento foi enviado.
As suas duas opções se você realmente precisa reexpedição um MouseEvent com valores stageX e stageY corretas são:
-
Crie uma subclasse personalizada de MouseEvent que substitui os getters stageX e stageY. Você pode armazenar o alvo original e fazer o cálculo localToGlobal mesmo ou você pode armazenar valores estáticos para stageX e stageY usando os valores que estão lá quando você clonar o evento original.
-
Estender Sprite e adicione seu expedidor para o palco para que o estoque MouseEvent funcionará corretamente.