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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow