AS3 e bugs com Tween

Quando estava programando a animação Flash que comentei anteriormente, encontrei um problema que acontecia quando disparava varias animações com a classe Tween do Flash.
Por algum motivo, as animações deixavam de executar no meio, e todo o posicionamento dos itens ficava errado.

Depois de buscar um pouco, encontrei num forúm da Adobe um comentário que dizia que o Garbage Collector do Flash excluía as instâncias da classe Tween que não estivessem referênciadas em nenhum lugar.

Um exemplo pode facilitar o entendimento.

Temos um MovieClip chamado mc e desejamos animar sua posição horizontal (x) , deslocando o mesmo da posição atual para + 100 pixels. Criamos então uma instância da classe Tween e passamos os parâmetros para o construtor.
new Tween(mc,'x',Regular.easeOut,x,x+100,0.6,true);
Logo após criada, esta instância já executaria a animação e terminado seu trabalho não existe mais nenhum motivo para manter uma referência da mesma. O problema ocorre durante a animação de x para x+100, se o processo de limpeza do coletor de lixo do Flash for disparado nesse período, nossa classe não está referênciada por ninguêm e portanto, elegível para ser descartada mesmo que esteja realizando alguma atividade.

Para resolver o problema, utilizei parte de um código que encontrei ( quando encontrar o link coloco aqui ), criei uma classe Singleton com o mesmo e pronto, temos uma forma de referênciar as instâncias de Tween sem nos preocupar com limpeza de memória antes do término da animação.

O uso da mesma é simples:

  1. Salve o script para o mesmo diretório da sua animação com o nome AntiGC.as.
  2. Adicione a chamada de importação no topo do seu script: "import AntiGC;"
  3. Requisite a instância do AntiGC: "aGC:AntiGC = AntiGC.getInstance();"
  4. Execute seu código de animação passando a instância para o AntiGC:
    aGC.addElement(new Tween(mc,'x',Regular.easeOut,x,x+100,0.6,true));

Até terminar a animação a instância de Tween será referênciada pelo AntiGC, evitando a exclusão da mesma da pilha de execução. Após isso a mesma é liberada para limpeza.

Você só não pode deixar de referênciar o AntiGC pois isso faria o mesmo, com todas as instâncias de Tween registradas serem elegíveis para limpeza.

Comentários

Karzin disse…
Puts !! Q bom q eu encontrei alguém com o mesmo problema que eu !! Ainda não testei sua solução não. Qnd eu testar, te dou um retorno.

valew
Karzin disse…
Puts !! perfeito !! Funcionou !!

Valew mesmo !!!
Unknown disse…
Man please, give me help, 'cause it's drivin' me crazy!
If I use that script inside another package, everything goes ok, but if I try that script inside the stage it occours the error:

trying to access a not acessible method addElement with static AntiGC

Please, help me at andrea_31@hotmail.it ....

Postagens mais visitadas deste blog

CFTV com Zoneminder e Linux

Take the blue pill.

mooUrl Ubiquity Command