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]; 
    }
    // ...
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow