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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow