ActionScript 3
Bitmaps zeichnen
Suche…
Zeichnen Sie ein Anzeigeobjekt in Bitmap-Daten
Eine Hilfsfunktion zum Erstellen einer Bitmap-Kopie eines Objekts. Damit können Vektorobjekte, Text oder komplexe verschachtelte Sprites in ein abgeflachtes Bitmap konvertiert werden.
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;
}
Verwendungszweck:
var txt:TextField = new TextField();
txt.text = "Hello There";
var bitmap:Bitmap = makeBitmapCopy(txt, true); //second param true to keep transparency
addChild(bitmap);
Zeichnen Sie ein Anzeigeobjekt mit beliebigen Koordinaten des Registrierungspunkts
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);
}
Eine getBounds()
: Damit getBounds()
gültige Werte zurückgeben kann, muss das Objekt mindestens einmal Zugriff auf die Bühne haben. Andernfalls sind die Werte falsch. Ein Code kann hinzugefügt werden, um sicherzustellen, dass die übergebene source
über die Stufe verfügt. Andernfalls kann sie zur Stufe hinzugefügt und dann wieder entfernt werden.
Animieren eines Sprite-Sheets
Ein Sprite-Sheet nach Definition ist eine Bitmap, die eine bestimmte Animation enthält. Bei alten Spielen wird ein Sprite-Sheet mit Rastertyp verwendet, d. H. Jeder Frame belegt einen gleichwertigen Bereich, und die Frames werden an den Rändern so ausgerichtet, dass sie ein Rechteck bilden, wobei möglicherweise einige Felder nicht belegt sind. Um die Bitmapgröße zu minimieren, werden die Sprite-Sheets später "gepackt", indem zusätzlicher Leerraum um das Rechteck entfernt wird, das jeden Frame enthält. Dennoch ist jeder Frame ein Rechteck, um Kopiervorgänge zu vereinfachen.
Um ein Sprite-Sheet zu animieren, können zwei Techniken verwendet werden. Zunächst können Sie BitmapData.copyPixels()
um einen bestimmten Bereich Ihres Sprite-Sheets in eine angezeigte Bitmap
zu kopieren und einen animierten Charakter zu erzeugen. Diese Vorgehensweise ist besser, wenn Sie eine einzelne angezeigte Bitmap
, die das gesamte Bild hostet.
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);
}
Die zweite Technik kann verwendet werden , wenn Sie eine Menge haben Sprite
s oder Bitmap
s auf der Anzeigeliste, und sie teilen sich die gleiche Sprite Blatt. Hier ist der Zielpuffer nicht mehr ein einzelnes Objekt, aber jedes Objekt verfügt über einen eigenen Puffer. bitmapData
die richtige Strategie darin, die bitmapData
Eigenschaft der Bitmaps zu bitmapData
. Zuvor sollte das Sprite-Blatt jedoch in einzelne Rahmen geschnitten werden.
public class Stuff extends Bitmap {
static var spriteSheet:Vector.<BitmapData>;
function displayFrame(frame:int) {
this.bitmapData=spriteSheet[frame];
}
// ...
}