Buscar..


Dibuje un objeto de visualización en datos de mapa de bits

Una función auxiliar para crear una copia de mapa de bits de un objeto. Esto se puede usar para convertir objetos vectoriales, texto o Sprite anidados complejos en un mapa de bits aplanado.

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

Dibuja un objeto de visualización con cualquier coordenada de punto de registro

    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 al margen: para que getBounds() devuelva valores válidos, el objeto debe tener acceso al escenario al menos una vez; de lo contrario, los valores son falsos. Se puede agregar un código para asegurar que la source pasada tenga etapa, y si no, se puede agregar a la etapa y luego quitarse nuevamente.

Animando una hoja de sprites

Una hoja de sprites por definición es un mapa de bits que contiene una animación determinada. Los juegos antiguos utilizan hojas de sprites de tipo de cuadrícula, es decir, cada cuadro ocupa una región igual, y los bordes están alineados por los bordes para formar un rectángulo, probablemente con algunos espacios desocupados. Más tarde, para minimizar el tamaño del mapa de bits, las hojas de sprites se "empaquetan" eliminando espacios en blanco adicionales alrededor del rectángulo que contiene cada fotograma, pero cada fotograma es un rectángulo para simplificar las operaciones de copia.

Para animar una hoja de sprites, se pueden utilizar dos técnicas. Primero, puede usar BitmapData.copyPixels() para copiar una determinada región de su hoja de sprite en un Bitmap visualizado, produciendo un personaje animado. Este enfoque es mejor si utiliza un solo Bitmap mostrado que hospeda toda la imagen.

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 segunda técnica se puede utilizar si tiene muchos Sprite o Bitmap en la lista de visualización, y comparten la misma hoja de sprites. Aquí, el búfer de destino ya no es un solo objeto, sino que cada objeto tiene su propio búfer, por lo que la estrategia adecuada es manipular la propiedad bitmapData los mapas de bits. Sin embargo, antes de hacer esto, la hoja de sprites se debe cortar en marcos individuales.

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow