Isolate gli eventi come
Event.ENTER_FRAME
in un singolo gestore, quando è possibile.
Il codice può essere ulteriormente ottimizzato isolando l'evento
Event.ENTER_FRAME
della classe
Apple
in un singolo gestore. Questa tecnica consente di risparmiare risorse della CPU. L'esempio seguente illustra questo diverso approccio, in cui la classe BitmapApple non gestisce più il comportamento di movimento:
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;
}
}
Il codice seguente crea le istanze delle mele e ne gestisce il movimento in un unico gestore:
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;
}
}
}
Il risultato è un unico evento
Event.ENTER_FRAME
che gestisce il movimento, anziché 200 gestori che spostano ciascuno una mela. L'animazione può essere messa in pausa facilmente, il che può essere utile in un videogioco.
Ad esempio, un gioco semplice può utilizzare il seguente gestore:
stage.addEventListener(Event.ENTER_FRAME, updateGame);
function updateGame (e:Event):void
{
gameEngine.update();
}
Il passaggio successivo consiste nell'abilitare l'interazione delle mele con il mouse o la tastiera e richiede delle modifiche della classe
BitmapApple
.
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);
}
}
Il risultato è una serie di istanze
BitmapApple
interattive, come oggetti Sprite tradizionali. Tuttavia, le istanze sono collegate a una singola bitmap, che non viene ricampionata a seguito della trasformazione degli oggetti di visualizzazione.