Olayı dıştan içe ve içten dışa tetikleme

Olay işleyicilerini en küçük hale getirmek için olayı dıştan içe ve içten dışa tetikleme işlevini kullanın.

ActionScript 3.0’daki olay modeli, olayı dıştan içe ve içten dışa tetikleme kavramlarına giriş niteliğindedir. Bir olayın içten dışa tetiklenmesinden faydalanmak ActionScript kod çalışma zamanını en iyileştirme konusunda size yardımcı olabilir. Performansı arttırmak için birden çok nesne yerine tek bir nesneye olay işleyicisi kaydedebilirsiniz.

Örnek olarak, kullanıcının elmaları yok etmek için üzerlerini en hızlı şekilde tıklatmak zorunda olduğu bir oyun yarattığınızı düşünün. Oyun tıklatılan her elmayı ekrandan çıkarır ve kullanıcının puanını yükseltir. Her bir elma tarafından gönderilen MouseEvent.CLICK olayını dinlemek için aşağıdaki kodu yazmak isteyebilirsiniz:

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

Kod, her bir Apple örneğinde addEventListener() yöntemini çağırır. Ayrıca bir elma tıklatıldığında removeEventListener yöntemini kullanarak her bir dinleyiciyi çıkarır. Ancak ActionScript 3.0’daki olay modeli bazı olaylar için üst InteractiveObject öğesinden dinlenebilecek bir olayı dıştan içe ve içten dışa tetikleme aşaması sağlar. Sonuç olarak yukarıdaki kodu en iyileştirmek ve addEventListener() ve removeEventListener() yöntemlerine yapılan çağrı sayısını azaltmak mümkündür. Aşağıdaki kod üst nesneden olayları dinlemek için olayı dıştan içe tetikleme aşamasını kullanır:

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

Yalnızca üst kapta addEventListener() yöntemine yapılan bir çağrı ile kod basitleştirilmiş ve en iyileştirilmiştir. Dinleyiciler artık Apple örneklerine kayıtlı olmaz ve böylelikle bir elma tıklatıldığında onları çıkarmaya gerek kalmaz. onAppleClick() işleyicisi, olayın yayılımını durdurarak ve daha ileri gitmesini engelleyerek daha da en iyileştirilebilir.

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

İçten dışa tetikleme aşaması, addEventListener() yönteminin üçüncü parametresi olarak false değerini ileterek olayı dıştan içe tetiklemede kullanılabilir:

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

Olayı dıştan içe tetikleme aşaması parametresinin varsayılan değeri false olur böylelikle bu parametreyi çıkarabilirsiniz:

container.addEventListener ( MouseEvent.CLICK, onAppleClick );