ActionScript 3
Bitmaps tekenen
Zoeken…
Teken een weergaveobject in bitmapgegevens
Een helpfunctie om een bitmapkopie van een object te maken. Dit kan worden gebruikt om vectorobjecten, tekst of complexe geneste Sprite's om te zetten in een afgeplatte bitmap.
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;
}
Gebruik:
var txt:TextField = new TextField();
txt.text = "Hello There";
var bitmap:Bitmap = makeBitmapCopy(txt, true); //second param true to keep transparency
addChild(bitmap);
Teken een weergaveobject met eventuele coördinaten van het registratiepunt
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);
}
Een kanttekening: om getBounds()
geldige waarden te retourneren, moet het object ten minste één keer getBounds()
hebben, anders zijn de waarden nep. Een code kan worden toegevoegd om ervoor te zorgen dat de doorgegeven source
een fase heeft, en zo niet, dan kan deze worden toegevoegd aan de fase en vervolgens weer worden verwijderd.
Een sprite-blad animeren
Een sprite sheet is per definitie een bitmap die een bepaalde animatie bevat. Oude spellen gebruiken sprite sheet van het rastertype, dat wil zeggen dat elk frame een gelijk gebied beslaat en frames worden uitgelijnd door de randen om een rechthoek te vormen, waarschijnlijk met enkele open ruimtes. Later, om de bitmapgrootte te minimaliseren, worden sprite-bladen "ingepakt" door extra witruimte rond de rechthoek te verwijderen die elk frame bevat, maar toch is elk frame een rechthoek om het kopiëren te vereenvoudigen.
Om een sprite sheet te animeren, kunnen twee technieken worden gebruikt. Eerst kunt u BitmapData.copyPixels()
om een bepaald gebied van uw sprite-blad naar een weergegeven Bitmap
te kopiëren, waardoor een geanimeerd karakter ontstaat. Deze aanpak is beter als u een enkele weergegeven Bitmap
die de hele afbeelding host.
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);
}
De tweede techniek kan worden gebruikt als er veel Sprite
's of Bitmap
's op de displaylijst staan en ze delen hetzelfde sprite-blad. Hier is de doelbuffer niet langer een enkel object, maar elk object heeft zijn eigen buffer, dus de juiste strategie is om de bitmapData
eigenschap van de bitmaps te manipuleren. Voordat u dit doet, moet het sprite-vel echter in afzonderlijke frames worden gesneden.
public class Stuff extends Bitmap {
static var spriteSheet:Vector.<BitmapData>;
function displayFrame(frame:int) {
this.bitmapData=spriteSheet[frame];
}
// ...
}