Поиск…


Нарисуйте экранный объект в растровые данные

Вспомогательная функция для создания растровой копии объекта. Это можно использовать для преобразования векторных объектов, текста или сложного вложенного Sprite в плоское растровое изображение.

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

Использование:

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

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

Нарисуйте экранный объект с любыми координатами точки регистрации

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

Замечание: для getBounds() для возврата допустимых значений объект должен иметь доступ к сцене хотя бы один раз, в противном случае значения являются фиктивными. Код может быть добавлен, чтобы гарантировать, что переданный source имеет этап, а если нет, его можно добавить на сцену, а затем удалить снова.

Анимация листа спрайтов

Лист спрайта по определению представляет собой растровое изображение, содержащее определенную анимацию. В старых играх используется лист спрайтов с типом сетки, т. Е. Каждый кадр занимает равную область, а кадры выравниваются по краям для формирования прямоугольника, возможно, с некоторыми незанятыми пространствами. Позже, чтобы минимизировать размер растрового изображения, листы спрайтов начинают «упаковываться», удаляя лишние пробелы вокруг прямоугольника, содержащего каждый кадр, но все же каждый кадр является прямоугольником, упрощающим операции копирования.

Чтобы оживить лист спрайта, можно использовать два метода. Во-первых, вы можете использовать BitmapData.copyPixels() чтобы скопировать определенный регион вашего листа спрайтов в отображаемый Bitmap , создавая анимированный символ. Этот подход лучше, если вы используете один отображаемый Bitmap рисунок, на котором размещается весь рисунок.

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

Второй метод можно использовать , если у вас есть много Sprite s или Bitmap s в списке отображения, и они имеют тот же спрайт лист. Здесь целевой буфер больше не является единственным объектом, но каждый объект имеет свой собственный буфер, поэтому правильная стратегия заключается в том, чтобы манипулировать свойством bitmapData растровых изображений. Однако перед тем, как это сделать, лист спрайта следует разделить на отдельные рамы.

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow