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 );