ActionScript 3
Dessin Bitmaps
Recherche…
Dessiner un objet d'affichage dans les données bitmap
Une fonction d'assistance pour créer une copie bitmap d'un objet. Cela peut être utilisé pour convertir des objets vectoriels, du texte ou des sprites imbriqués complexes en un bitmap aplati.
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;
}
Usage:
var txt:TextField = new TextField();
txt.text = "Hello There";
var bitmap:Bitmap = makeBitmapCopy(txt, true); //second param true to keep transparency
addChild(bitmap);
Dessine un objet d'affichage avec les coordonnées du point d'enregistrement
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);
}
Une note de côté: Pour que getBounds()
renvoie des valeurs valides, l'objet doit avoir accès à une étape au moins une fois, sinon les valeurs sont fausses. Un code peut être ajouté pour s'assurer que la source
transmise a une étape et, dans le cas contraire, il peut être ajouté à la phase puis supprimé à nouveau.
Animation d'une feuille de sprite
Une feuille de sprite par définition est une image bitmap contenant une certaine animation. Les anciens jeux utilisent une feuille de sprite de type grille, c'est-à-dire que chaque image occupe une région égale et que les cadres sont alignés par les bords pour former un rectangle, avec probablement des espaces inoccupés. Plus tard, afin de minimiser la taille du bitmap, les feuilles de sprite commencent à être "empaquetées" en supprimant les espaces blancs autour du rectangle qui contient chaque image, mais chaque image reste un rectangle pour simplifier les opérations de copie.
Pour animer une feuille de sprite, deux techniques peuvent être utilisées. Tout d'abord, vous pouvez utiliser BitmapData.copyPixels()
pour copier une certaine région de votre feuille d'image-objet sur une image Bitmap
affichée, produisant ainsi un personnage animé. Cette approche est préférable si vous utilisez un seul Bitmap
affiché qui héberge l'intégralité de l'image.
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 seconde technique peut être utilisée si vous avez beaucoup de Sprite
ou de Bitmap
sur la liste d'affichage et qu'ils partagent la même feuille de sprite. Ici, le tampon cible n'est plus un objet unique, mais chaque objet possède son propre tampon. La stratégie appropriée consiste donc à manipuler la propriété bitmapData
des bitmaps. Avant de le faire, cependant, la feuille de sprite doit être découpée dans des cadres individuels.
public class Stuff extends Bitmap {
static var spriteSheet:Vector.<BitmapData>;
function displayFrame(frame:int) {
this.bitmapData=spriteSheet[frame];
}
// ...
}