ActionScript 3
Dibujo de mapas de bits
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];
}
// ...
}