Ricerca…


Disegna un oggetto di visualizzazione in dati bitmap

Una funzione di supporto per creare una copia bitmap di un oggetto. Questo può essere usato per convertire oggetti vettoriali, testo o sprite nidificati complessi in una bitmap appiattita.

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;
}

Uso:

var txt:TextField = new TextField();
txt.text = "Hello There";

var bitmap:Bitmap = makeBitmapCopy(txt, true); //second param true to keep transparency
addChild(bitmap);

Disegna un oggetto di visualizzazione con qualsiasi coordinate del punto di registrazione

    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);
    }

Una nota a getBounds() : per getBounds() per restituire valori validi l'oggetto deve avere accesso allo stage almeno una volta, altrimenti i valori sono falsi. È possibile aggiungere un codice per assicurarsi che la source passata abbia una fase e, in caso contrario, può essere aggiunta allo stage e quindi rimossa nuovamente.

Animazione di un foglio sprite

Un foglio sprite per definizione è una bitmap che contiene una certa animazione. I vecchi giochi usano il foglio sprite di tipo griglia, cioè ogni frame occupa una regione uguale, ei frame sono allineati dai bordi per formare un rettangolo, probabilmente con alcuni spazi non occupati. Successivamente, al fine di ridurre al minimo la dimensione della bitmap, i fogli sprite iniziano ad essere "impacchettati" rimuovendo spazi bianchi extra attorno al rettangolo che contiene ciascun fotogramma, ma ogni fotogramma è ancora un rettangolo per semplificare le operazioni di copia.

Per animare un foglio sprite, è possibile utilizzare due tecniche. Innanzitutto, è possibile utilizzare BitmapData.copyPixels() per copiare una determinata area del proprio foglio sprite su una Bitmap visualizzata, producendo un personaggio animato. Questo approccio è migliore se si utilizza una singola Bitmap visualizzata che ospita l'intera immagine.

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);
}

La seconda tecnica può essere utilizzata se nella lista di visualizzazione sono presenti molti Sprite o Bitmap e condividono lo stesso foglio sprite. Qui, il buffer di destinazione non è più un singolo oggetto, ma ogni oggetto ha il proprio buffer, quindi la strategia corretta è di manipolare la proprietà bitmapData delle bitmap. Prima di farlo, tuttavia, il foglio sprite dovrebbe essere diviso in riquadri singoli.

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow