AS3 Blitting — копируйте пиксели, получая часть исходного изображения

Я пытаюсь нарисовать что-то на экране, а затем скопировать это на растровое изображение, которое находится на сцене.

Я делал это раньше с процедурно нарисованной формой, такой как круг, но когда я использую элемент библиотеки, большинство исходных пикселей обрезаются.

вот мой код - в другой функции растровый объект добавляется на сцену, и я вижу, что copyPixels работает, но, как я уже сказал, копирует только некоторые пиксели. Я пробовал играть с прямоугольником, но пока безуспешно.

var s:StarAsset = new StarAsset();

        s.x = e.stageX;
        s.y = e.stageY;
        s.scaleX = e.pressure * 10;
        s.scaleY = e.pressure * 10;
        s.rotation = Math.random() * 360;



        var bms:BitmapData = new BitmapData(s.width + 6, s.height + 6, true, 0x00000000);
        bms.draw(s);

        var srect:Rectangle = new Rectangle();
        srect.width = s.width + 6;
        srect.height = s.height + 6;

        var destpoint:Point = new Point(s.x, s.y);
        bmcontainer.copyPixels(bms, srect, destpoint, null, null, true);

person Servet    schedule 14.07.2012    source источник


Ответы (1)


Использование звездного актива:

звездный актив

И предполагая, что вы копируете растровое изображение холста на сцене:

var canvas:BitmapData = new BitmapData(600, 600, true, 0x0);
var bitmap:Bitmap = new Bitmap(canvas, PixelSnapping.AUTO, true);
addChild(bitmap);

Эта реализация будет создавать экземпляр вашего StarAsset, рисовать его в BitmapData, а затем случайным образом преобразовывать масштаб, положение и поворот для каждой копии, нарисованной на холсте:

makeStars();

function makeStars():void
{
    // get the star asset
    var s:StarAsset = new StarAsset();

    // copy star asset to bitmap data
    var bd:BitmapData = new BitmapData(s.width, s.height, true, 0x0);
    bd.draw(s);

    // draw 100 variants on BitmapData
    for(var i:uint = 0; i < 100; i++)
    {
        var positionX:Number = Math.random() * 600;
        var positionY:Number = Math.random() * 600;
        var scale:Number = Math.random();
        var angle:Number = Math.random() * 360;

        var matrix:Matrix = new Matrix();
        matrix.scale(scale, scale);
        matrix.rotate(angle * Math.PI / 180);
        matrix.translate(positionX, positionY);

        canvas.draw(bd, matrix, null, null, null, true);
    }
}

Что производит:

звезды

Или вот 1000 звезд нарисовано:

stars-1000

Или, наконец, нарисовано 10 000 звезд:

stars-10000

person Jason Sturges    schedule 15.07.2012
comment
Святая корова, ты один полезный парень! Я не использовал матрицы и попробую сегодня, когда закончу свою работу. Большое спасибо, Джейсон. - person Servet; 15.07.2012
comment
Спасибо, так полезно.. :) ,, - person Katax Emperore; 24.04.2013