Gebeurtenissen vastleggen en terugkoppelen

U kunt gebeurtenissen vastleggen en terugkoppelen om gebeurtenishandlers tot een minimum te beperken.

In het gebeurtenismodel in ActionScript 3.0 werden de concepten gebeurtenissen vastleggen en gebeurtenissen terugkoppelen geïntroduceerd. U kunt gebeurtenissen terugkoppelen om u te helpen de uitvoeringstijd van ActionScript-code te optimaliseren. U kunt een gebeurtenishandler voor één object registreren in plaats van voor meerdere objecten en zo de prestaties verbeteren.

Denk bijvoorbeeld aan een game waarin gebruikers zo snel mogelijk op appels moeten klikken om deze te vernietigen. De game verwijdert elke appel van het scherm wanneer de speler erop klikt en voegt punten toe aan de score van de gebruiker. U zou de volgende code kunnen schrijven om de door elke appel verzonden MouseEvent.CLICK -gebeurtenis te signaleren:

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

De code roept de methode addEventListener() aan voor elke appel-instantie. Bovendien wordt de removeEventListener() -methode gebruikt om elke listener te verwijderen wanneer op een appel wordt geklikt. Het gebeurtenismodel in ActionScript 3.0 verschaft echter een vastleg- en terugkoppelingsfase voor bepaalde gebeurtenissen, zodat u ernaar kunt luisteren vanuit een bovenliggend InteractiveObject. Het resultaat is dat u de zojuist vermelde code kunt optimaliseren en het aantal aanroepen naar de methoden addEventListener() en removeEventListener() tot een minimum kunt beperken. In de volgende code wordt de vastlegfase gebruikt om naar de gebeurtenissen van het bovenliggende object te luisteren:

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

De code is eenvoudiger en aanzienlijk geoptimaliseerd, met slechts één aanroep naar de methode addEventListener() in de bovenliggende container. Listeners worden niet meer geregistreerd bij de appel-instanties en hoeven dus niet meer te worden verwijderd wanneer de gebruiker op een appel klikt. De onAppleClick() -handler kan verder worden geoptimaliseerd door het doorgeven van de gebeurtenis te stoppen, zodat de gebeurtenis zich niet voortzet:

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

De terugkoppelingsfase kan ook worden gebruikt om de gebeurtenis af te vangen, door false als de derde parameter door te geven aan de methode 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 );

De standaardwaarde voor de parameter van de vastlegfase is false , zodat u deze kunt weglaten:

container.addEventListener ( MouseEvent.CLICK, onAppleClick );