ActionScript 3
Disegno di bitmap
Ricerca…
Disegna un oggetto di visualizzazione in dati bitmap
Una funzione di supporto per creare una copia bitmap di un oggetto. Questo può essere usato per convertire oggetti vettoriali, testo o sprite nidificati complessi in una bitmap appiattita.
function makeBitmapCopy(displayObj:IBitmapDrawable, transparent:Boolean = false, bgColor:uint = 0x00000000, smooth:Boolean = true):Bitmap {
//create an empty bitmap data that matches the width and height of the object you wish to draw
var bmd:BitmapData = new BitmapData(displayObj.width, displayObj.height, transparent, bgColor);
//draw the object to the bitmap data
bmd.draw(displayObj, null, null, null, null, smooth);
//assign that bitmap data to a bitmap object
var bmp:Bitmap = new Bitmap(bmd, "auto", smooth);
return bmp;
}
Uso:
var txt:TextField = new TextField();
txt.text = "Hello There";
var bitmap:Bitmap = makeBitmapCopy(txt, true); //second param true to keep transparency
addChild(bitmap);
Disegna un oggetto di visualizzazione con qualsiasi coordinate del punto di registrazione
public function drawDisplayObjectUsingBounds(source:DisplayObject):BitmapData {
var bitmapData:BitmapData;//declare a BitmapData
var bounds:Rectangle = source.getBounds(source);//get the source object actual size
//round bounds to integer pixel values (to aviod 1px stripes left off)
bounds = new Rectangle(Math.floor(bounds.x), Math.floor(bounds.y), Math.ceil(bounds.width), Math.ceil(bounds.height));
//to avoid Invalid BitmapData error which occures if width or height is 0
//(ArgumentError: Error #2015)
if((bounds.width>0) && (bounds.height>0)){
//create a BitmapData
bitmapData = new BitmapData(bounds.width, bounds.height, true, 0x00000000);
var matrix:Matrix = new Matrix();//create a transform matrix
//translate if to fit the upper-left corner of the source
matrix.translate(-bounds.x, -bounds.y);
bitmapData.draw(source, matrix);//draw the source
return bitmapData;//return the result (exit point)
}
//if no result is created - return an empty BitmapData
return new BitmapData(1, 1, true, 0x00000000);
}
Una nota a getBounds()
: per getBounds()
per restituire valori validi l'oggetto deve avere accesso allo stage almeno una volta, altrimenti i valori sono falsi. È possibile aggiungere un codice per assicurarsi che la source
passata abbia una fase e, in caso contrario, può essere aggiunta allo stage e quindi rimossa nuovamente.
Animazione di un foglio sprite
Un foglio sprite per definizione è una bitmap che contiene una certa animazione. I vecchi giochi usano il foglio sprite di tipo griglia, cioè ogni frame occupa una regione uguale, ei frame sono allineati dai bordi per formare un rettangolo, probabilmente con alcuni spazi non occupati. Successivamente, al fine di ridurre al minimo la dimensione della bitmap, i fogli sprite iniziano ad essere "impacchettati" rimuovendo spazi bianchi extra attorno al rettangolo che contiene ciascun fotogramma, ma ogni fotogramma è ancora un rettangolo per semplificare le operazioni di copia.
Per animare un foglio sprite, è possibile utilizzare due tecniche. Innanzitutto, è possibile utilizzare BitmapData.copyPixels()
per copiare una determinata area del proprio foglio sprite su una Bitmap
visualizzata, producendo un personaggio animato. Questo approccio è migliore se si utilizza una singola Bitmap
visualizzata che ospita l'intera immagine.
var spriteSheet:BitmapData;
var frames:Vector.<Rectangle>; // regions of spriteSheet that represent frames
function displayFrameAt(frame:int,buffer:BitmapData,position:Point):void {
buffer.copyPixels(spriteSheet,frames[frame],position,null,null,true);
}
La seconda tecnica può essere utilizzata se nella lista di visualizzazione sono presenti molti Sprite
o Bitmap
e condividono lo stesso foglio sprite. Qui, il buffer di destinazione non è più un singolo oggetto, ma ogni oggetto ha il proprio buffer, quindi la strategia corretta è di manipolare la proprietà bitmapData
delle bitmap. Prima di farlo, tuttavia, il foglio sprite dovrebbe essere diviso in riquadri singoli.
public class Stuff extends Bitmap {
static var spriteSheet:Vector.<BitmapData>;
function displayFrame(frame:int) {
this.bitmapData=spriteSheet[frame];
}
// ...
}