Estava programando no Flash, quando me vi com o seguinte problema: um objeto pai não passava o evento de botão para o filho. Isto é, um movie clip que tem associado um onRollOver, onRollOut ou onRelease captura todas as ações do mouse, dessa forma os botões que estão dentro dele não funcionam.
Minha primeira abordagem foi criar um movie clip por cima que mapeasse os botões, dessa forma ao clicar o mouse ele pegaria o evento. Mas esse movie clip tampa o objeto principal e estraga o evento onRollOver a ele associado.
Então, recorri à Deus. E Ele veio a mim. Encontrei esse site que explica o problema e sugere um par de soluções. Vou me ater a segunda porque é mais simples de implementar.
Para começar, porque o Flash age assim?
Quando é disparado um evento de botão, o Flash segue de objeto em objeto, tentando entregá-lo ao primeiro que puder lidar com ele. Ele segue a ordem de fora para dentro dos movie clips aninhados. Portanto o evento jamais chegará ao filho se o pai estiver associado a ele.
Não há maneira de alterar esse comportamento padrão com ActionScript 2. Não sei se existe jeito com AS3, porque como quero publicar o arquivo para versões antigas do Flash Player, nem fui atrás.
Então, o que fazer?
A solução proposta é usar, no lugar, os eventos onMouseDown, onMouseUp e onMouseMove para recriar o comportamento de um botão. Diferente dos eventos de botão, eles são passado a todos os objetos da cena. Assim, é necessário apenas checar se o mouse está sobre o botão quando clicado para disparar a ação, isso pode ser feito com um simples hitTest:
mc_pai.onRollOver = function (){
//comportamento do pai
}
mc_pai.mc_filho.onMouseUp = function (){
if (this.hitTest(_root._xmouse, _root._ymouse)){
//comportamento do filho
}
}
Limpo e eficiente, está superada a limitação do Flash em gerenciar esses eventos.
Comentários Recentes