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

Foi útil?

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:

  1. 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.

  2. Estender Sprite e adicione seu expedidor para o palco para que o estoque MouseEvent funcionará corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top