Davranışları yalıtma

Event.ENTER_FRAME olayı gibi olayları mümkün olduğunca tek bir işleyicide ayırın.

Kod, Apple sınıfındaki Event.ENTER_FRAME olayının tek bir işleyicide yalıtılmasıyla daha da en iyileştirilebilir. Bu teknik işlemci kaynaklarını korur. Aşağıdaki örnekte BitmapApple sınıfının hareket davranışını işlemediği farklı yaklaşım gösterilmektedir:

package org.bytearray.bitmap 
{ 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
     
    public class BitmapApple extends Bitmap 
    { 
        private var destinationX:Number; 
        private var destinationY:Number; 
         
        public function BitmapApple(buffer:BitmapData) 
        { 
            super (buffer); 
             
            smoothing = true; 
        } 
}

Aşağıdaki kod elmaları örnekler ve hareketlerini tek bir işleyicide işler:

import org.bytearray.bitmap.BitmapApple; 
 
const MAX_NUM:int = 100; 
var holder:Sprite = new Sprite(); 
 
addChild(holder); 
 
var holderVector:Vector.<BitmapApple> = new Vector.<BitmapApple>(MAX_NUM, true); 
var source:AppleSource = new AppleSource(); 
var bounds:Object = source.getBounds(source); 
     
var mat:Matrix = new Matrix(); 
mat.translate(-bounds.x,-bounds.y); 
 
stage.quality = StageQuality.BEST; 
 
var buffer:BitmapData = new BitmapData(source.width+1,source.height+1, true,0); 
buffer.draw(source,mat); 
 
stage.quality = StageQuality.LOW; 
     
var bitmapApple:BitmapApple; 
     
for (var i:int = 0; i< MAX_NUM; i++) 
{ 
    bitmapApple = new BitmapApple(buffer); 
     
    bitmapApple.destinationX = Math.random()*stage.stageWidth; 
    bitmapApple.destinationY = Math.random()*stage.stageHeight; 
     
    holderVector[i] = bitmapApple; 
         
    holder.addChild(bitmapApple); 
} 
 
stage.addEventListener(Event.ENTER_FRAME,onFrame); 
 
var lng:int = holderVector.length 
 
function onFrame(e:Event):void 
{     
        for (var i:int = 0; i < lng; i++) 
        { 
            bitmapApple = holderVector[i]; 
            bitmapApple.alpha = Math.random(); 
             
            bitmapApple.x -= (bitmapApple.x - bitmapApple.destinationX) *.5; 
            bitmapApple.y -= (bitmapApple.y - bitmapApple.destinationY) *.5; 
             
            if (Math.abs(bitmapApple.x - bitmapApple.destinationX ) < 1 &&      
                Math.abs(bitmapApple.y - bitmapApple.destinationY ) < 1) 
            { 
                    bitmapApple.destinationX = Math.random()*stage.stageWidth; 
                    bitmapApple.destinationY = Math.random()*stage.stageHeight; 
            } 
        } 
}

Sonuç, her elmayı hareket ettiren 200 işleyici yerine hareketi işleyen tek bir Event.ENTER_FRAME olayıdır. Animasyonun tamamı kolayca durdurulabilir; bu durum da bir oyunda kullanışlı bir özelliktir.

Örneğin, basit bir oyun aşağıdaki işleyiciyi kullanabilir:

stage.addEventListener(Event.ENTER_FRAME, updateGame); 
function updateGame (e:Event):void 
{ 
    gameEngine.update(); 
} 

Bir sonraki adım, elmaların fare veya klavye ile etkileşime girmesini sağlamaktır, bu da BitmapApple sınıfında değişiklikler yapılmasını gerektirir.

package org.bytearray.bitmap 
{ 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.Sprite; 
     
    public class BitmapApple extends Sprite 
    { 
        public var destinationX:Number; 
        public var destinationY:Number; 
        private var container:Sprite; 
        private var containerBitmap:Bitmap; 
         
        public function BitmapApple(buffer:BitmapData) 
        { 
            container = new Sprite(); 
            containerBitmap = new Bitmap(buffer); 
            containerBitmap.smoothing = true; 
            container.addChild(containerBitmap); 
            addChild(container); 
        } 
}

Sonuçta geleneksel Sprite nesnelerine benzer etkileşimli BitmapApple örnekleri elde edilir. Ancak, örnekler görüntüleme nesnelerinin yüzeyleri dönüştürüldüğünde yeniden örneklenmeyen tek bir bitmap’e bağlıdır.