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