Szukaj…


Narysuj obiekt wyświetlany w danych bitmapowych

Funkcja pomocnicza do tworzenia kopii bitmapowej obiektu. Można tego użyć do konwersji obiektów wektorowych, tekstu lub złożonych zagnieżdżonych duszka na spłaszczoną mapę bitową.

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

Stosowanie:

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

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

Narysuj obiekt wyświetlany z dowolnymi współrzędnymi punktu rejestracji

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

Uwaga dodatkowa: Aby getBounds() zwróciła prawidłowe wartości, obiekt musi mieć dostęp etapowy co najmniej raz, w przeciwnym razie wartości są fałszywe. Można dodać kod, aby upewnić się, że przekazane source ma etap, a jeśli nie, można go dodać do etapu, a następnie usunąć ponownie.

Animowanie arkusza sprite

Arkusz duszków z definicji jest bitmapą zawierającą określoną animację. Stare gry używają arkusza ikonek typu grid, co oznacza, że każda ramka zajmuje równy region, a ramki są wyrównane do krawędzi, tworząc prostokąt, prawdopodobnie z pewnymi spacjami niezajętymi. Później, aby zminimalizować rozmiar mapy bitowej, arkusze sprite zaczynają być „pakowane” poprzez usunięcie dodatkowych białych znaków wokół prostokąta zawierającego każdą ramkę, ale nadal każda ramka jest prostokątem, aby uprościć operacje kopiowania.

W celu animacji arkusza sprite można zastosować dwie techniki. Po pierwsze, możesz użyć BitmapData.copyPixels() aby skopiować określony region arkusza sprite do wyświetlanej Bitmap , tworząc animowaną postać. Takie podejście jest lepsze, jeśli używasz pojedynczej wyświetlanej Bitmap która obsługuje cały obraz.

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

Drugiej techniki można użyć, jeśli na liście wyświetlania znajduje się wiele Sprite lub Bitmap i mają one ten sam arkusz ikonek. W tym przypadku bufor docelowy nie jest już pojedynczym obiektem, ale każdy obiekt ma swój własny bufor, więc właściwą strategią jest manipulowanie właściwością bitmapData bitmaps. Jednak przed zrobieniem tego arkusz duszka powinien zostać pocięty na poszczególne ramki.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow