ActionScript 3
Rysowanie map bitowych
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];
}
// ...
}