ActionScript 3
Rita bitmappar
Sök…
Rita ett visningsobjekt i bitmappsdata
En hjälpfunktion för att skapa en bitmappskopia av ett objekt. Detta kan användas för att konvertera vektorobjekt, text eller komplexa kapslade Sprite till en platt bitmapp.
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;
}
Användande:
var txt:TextField = new TextField();
txt.text = "Hello There";
var bitmap:Bitmap = makeBitmapCopy(txt, true); //second param true to keep transparency
addChild(bitmap);
Rita ett visningsobjekt med eventuella koordinater för registreringspunkten
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);
}
En getBounds()
: För att getBounds()
ska returnera giltiga värden måste objektet ha scenåtkomst minst en gång, annars är värdena falska. En kod kan läggas till för att säkerställa att passerad source
har scen, och om inte, kan den läggas till scenen och sedan tas bort igen.
Animera ett sprite ark
Ett sprittark per definition är en bitmapp som innehåller en viss animation. Gamla spel använder spritark av rutnät, det vill säga varje ram upptar ett lika stort område, och ramar är inriktade vid kanterna för att bilda en rektangel, förmodligen med vissa platser oupptagna. Senare, för att minimera bitmappsstorleken, börjar sprittark "packas" genom att ta bort extra vitrum runt rektangeln som innehåller varje ram, men ändå är varje ram en rektangel för att förenkla kopieringsoperationerna.
För att animera ett sprite-ark kan två tekniker användas. Först kan du använda BitmapData.copyPixels()
att kopiera ett visst område på ditt sprite-ark till en visad Bitmap
, vilket ger en animerad karaktär. Den här metoden är bättre om du använder en visad Bitmap
som är värd för hela bilden.
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);
}
Den andra tekniken kan användas om du har en hel del Sprite
eller Bitmap
på displaylistan och de delar samma sprite ark. Här är målbufferten inte längre ett enda objekt, men varje objekt har sin egen buffert, så den rätta strategin är att manipulera bitmapData
egenskap. Innan du gör detta bör emellertid sprittarket skäras isär i individuella ramar.
public class Stuff extends Bitmap {
static var spriteSheet:Vector.<BitmapData>;
function displayFrame(frame:int) {
this.bitmapData=spriteSheet[frame];
}
// ...
}