Isolieren von Verhalten

Ereignisse wie Event.ENTER_FRAME sollten nach Möglichkeit in einer einzelnen Prozedur isoliert werden.

Sie können den Code noch weiter optimieren, indem Sie das Event.ENTER_FRAME -Ereignis in der Apple -Klasse in einer einzelnen Prozedur isolieren. Durch diese Technik werden CPU-Ressourcen eingespart. Das folgende Beispiel zeigt dieses Verfahren, bei dem die BitmapApple-Klasse nicht mehr für das Verhalten der Bewegung zuständig ist:

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

Der folgende Code instanziiert die Äpfel und verarbeitet ihre Bewegung in einer einzelnen Prozedur:

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

Daraus ergibt sich ein einzelnes Event.ENTER_FRAME -Ereignis zur Verarbeitung der Bewegung anstelle von 200 Prozeduren zur Bewegung der einzelnen Äpfel. Die ganze Animation kann problemlos angehalten werden, was besonders in einem Spiel nützlich sein kann.

In einem einfachen Spiel kann beispielsweise die folgende Prozedur zum Einsatz kommen:

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

Im nächsten Schritt muss die Interaktion der Äpfel mit der Maus oder der Tastatur implementiert werden. Dazu sind Änderungen an der BitmapApple -Klasse erforderlich.

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

Dadurch entstehen interaktive BitmapApple -Instanzen, ähnlich wie herkömmliche Sprite-Objekte. Die Instanzen sind jedoch mit einer einzelnen Bitmap verknüpft, die nicht neu berechnet wird, wenn die Anzeigeobjekte transformiert werden.