Captura de eventos e animações

Utilize captura de eventos e bolhas para minimizar manipuladores de eventos.

O modelo de evento no ActionScript 3.0 introduziu os conceitos de captura de evento e de bolhas de evento. Você pode aproveitar a bolha de um evento para ajudá-lo na otimização do tempo de execução do código ActionScript. Você pode registrar um manipulador de evento em um objeto, ao invés de múltiplos objetos, para melhorar o desempenho.

Como exemplo, imagine criar um jogo no qual o usuário tem que clicar em maçãs o mais rápido possível para destruí-las. O jogo remove cada maçã da tela quando elas são clicadas e adiciona pontos a pontuação do usuário. Para ouvir o evento MouseEvent.CLICK acionado por cada maçã, você pode ficar tentado a escrever o seguinte código:

const MAX_NUM:int = 10; 
var sceneWidth:int = stage.stageWidth; 
var sceneHeight:int = stage.stageHeight; 
var currentApple:InteractiveObject; 
var currentAppleClicked:InteractiveObject; 
  
for ( var i:int = 0; i< MAX_NUM; i++ ) 
{ 
    currentApple = new Apple(); 
    currentApple.x = Math.random()*sceneWidth; 
    currentApple.y = Math.random()*sceneHeight; 
    addChild ( currentApple ); 
     
    // Listen to the MouseEvent.CLICK event 
    currentApple.addEventListener ( MouseEvent.CLICK, onAppleClick ); 
} 
  
function onAppleClick ( e:MouseEvent ):void 
{ 
    currentAppleClicked = e.currentTarget as InteractiveObject; 
    currentAppleClicked.removeEventListener(MouseEvent.CLICK, onAppleClick ); 
    removeChild ( currentAppleClicked ); 
}

O código chama o método addEventListener() em cada ocorrência de Maçã. Isto também remove cada ouvinte quando uma maçã é clicada, utilizando o método removeEventListener() . No entanto, o modelo de evento no ActionScript 3.0 fornece uma fase de captura e de bolha para alguns eventos, permitindo que você os escute de um InteractiveObject pai. Como resultado, é possível otimizar o código acima e minimizar o número de chamadas para os métodos addEventListener() e removeEventListener() . O código a seguir utiliza a fase de captura para escutar os eventos do objeto pai:

const MAX_NUM:int = 10; 
var sceneWidth:int = stage.stageWidth; 
var sceneHeight:int = stage.stageHeight; 
var currentApple:InteractiveObject; 
var currentAppleClicked:InteractiveObject; 
var container:Sprite = new Sprite(); 
  
addChild ( container ); 
  
// Listen to the MouseEvent.CLICK on the apple's parent 
// Passing true as third parameter catches the event during its capture phase 
container.addEventListener ( MouseEvent.CLICK, onAppleClick, true ); 
  
for ( var i:int = 0; i< MAX_NUM; i++ ) 
{ 
    currentApple = new Apple(); 
    currentApple.x = Math.random()*sceneWidth; 
    currentApple.y = Math.random()*sceneHeight; 
    container.addChild ( currentApple ); 
} 
  
function onAppleClick ( e:MouseEvent ):void 
{ 
    currentAppleClicked = e.target as InteractiveObject; 
    container.removeChild ( currentAppleClicked ); 
}

O código está simplificado e muito mais otimizado, com apenas uma chamada para o método addEventListener() no contêiner pai. Os ouvintes não são mais registrados nas ocorrências Maçã, portanto não há necessidade de removê-los quando uma maçã é clicada. O manipulador onAppleClick() pode ser melhor otimizado, se você interromper a propagação do evento fazendo com que ele não avance ainda mais:

function onAppleClick ( e:MouseEvent ):void 
{ 
    e.stopPropagation(); 
    currentAppleClicked = e.target as InteractiveObject; 
    container.removeChild ( currentAppleClicked ); 
}

A fase de bolha também pode ser utilizada para capturar o evento, transmitindo false como o terceiro parâmetro para o método addEventListener() :

// Listen to the MouseEvent.CLICK on apple's parent 
// Passing false as third parameter catches the event during its bubbling phase 
container.addEventListener ( MouseEvent.CLICK, onAppleClick, false );

O valor padrão para o parâmetro da fase de captura é false , portanto você pode omiti-lo:

container.addEventListener ( MouseEvent.CLICK, onAppleClick );