раскраска с colormatrix в AS3 - помогите пожалуйста! - PullRequest
1 голос
/ 06 июля 2011

У меня огромная проблема при попытке раскрасить объекты, которые летают в моей космической игре.

Когда я стреляю и бью их - пораженные враги должны мигать. Графика предварительно визуализируется (т. Е. Есть массив вращения и функция, в которой градусы и их соответствующее вращение для объектов сохраняются / рассчитываются для повышения производительности).

Итак - моя идея заключалась в том, чтобы улучшить эту функцию вращения с помощью функции для дополнительной раскраски; но цветные и повернутые объекты должны храниться отдельно от обычных повернутых объектов. Для этого я создал вложенный массив: в первой строке - 360 повернутых графических изображений одного объекта, а во второй строке - 360 графических изображений повернутого и окрашенного объекта.

Проблема: раскраска работает, но они не вращаются (всегда при 0 градусах). Пожалуйста, помогите мне - я часами выяснял, почему это не работает, поэтому я сдался. Было бы так здорово, если бы кто-то смог найти проблему! Большое спасибо!

public function createRotationWithColorBlitArrayFromBD(sourceBitmapData:BitmapData, inc:int, offset:int = 0):Array
{
    trace("sourceBitmapData.width=" + sourceBitmapData.width);
    trace("sourceBitmapData.height=" + sourceBitmapData.height);
    tileList = [];
    tileListSec = [];
    levelArray = [];
    var rotation:int = offset; 

    while (rotation < (360 + offset))
    {
        var angleInRadians:Number = Math.PI * 2 * (rotation / 360);
        var rotationMatrix:Matrix = new Matrix();

        rotationMatrix.translate(-sourceBitmapData.width * .5, -sourceBitmapData.height * .5);
        rotationMatrix.rotate(angleInRadians);
        rotationMatrix.translate(sourceBitmapData.width * .5, sourceBitmapData.height * .5);

        var matrixImage:BitmapData = new BitmapData(sourceBitmapData.width, sourceBitmapData.height, true, 0x00000000);

        matrixImage.draw(sourceBitmapData, rotationMatrix);
        tileList.push(matrixImage.clone());

        var colorMatrix:ColorMatrixFilter = new ColorMatrixFilter (
                                [1, 0, 0, 0, 0,
                                 0, 0, 0, 0, 0,
                                 0, 0, 0, 0, 0,
                                 0, 0, 0, 1, 0]);

        matrixImage.applyFilter(sourceBitmapData, sourceBitmapData.rect, point0, colorMatrix);

        tileListSec.push(matrixImage.clone());

        rotation += inc;

        matrixImage.dispose();
        matrixImage = null;
        rotationMatrix = null;
    }

    levelArray = [tileList, tileListSec];
    return(levelArray);
}

1 Ответ

1 голос
/ 07 июля 2011

Кажется, что вы применяете фильтр к исходному изображению, когда вы хотите применить фильтр к повернутой версии исходного изображения.

Если вы внимательно посмотрите на документы для BitmapData,Функция применения фильтра выполняет следующие действия:

Берет исходное изображение и объект фильтра и генерирует отфильтрованное изображение.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#applyFilter

Ваша заявкаФильтр вызывает переписывание преобразования матрицы, которое вы выполняете в функции draw (), с новой, не повернутой копией исходного изображения.ApplyFilter () похож на draw, за исключением того, что он применяет фильтр вместо матрицы преобразования.В этом случае вы применяете трансформационную матрицу к matrixImage.draw() (для поворота), а затем записываете эти данные с помощью matrixImage.applyFilter() (для раскраски).

РЕШЕНИЕ Быстрое решениебыло бы сделать следующее изменение:

matrixImage.applyFilter(matrixImage, matrixImage.rect, point0, colorMatrix);

Это имеет matrixImage применить цветовой фильтр к себе, после того, как оно станет повернутым изображением.

Кстати: в этом случае я недумаю, вам нужно иметь два clone () объекта matrixImage.Достаточно просто конечного объекта, полученного из applyFilter (), поскольку он является источником и фильтром в одном.Но они могут вам понадобиться для другой игровой логики, которую вы не опубликовали.

ПРИМЕЧАНИЕ. Единственной проблемой этого решения является следующий скачок производительности: (из документации Adobe для BitmapData.applyFilter ())

Если объект BitmapData и объект, указанный в качестве параметра sourceBitmapData, являются одним и тем же объектом, приложение использует временную копию объекта для выполнения фильтра.Для достижения максимальной производительности избегайте этой ситуации.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#applyFilter

Создание этих временных копий очень ресурсоемко, поэтому просто создайте один буферный объект и используйте его намного быстрее.Если вы обнаружите проблемы с производительностью, лучше всего создать третий объект BitmapData, который будет действовать как буфер между источником и фильтром.В этом случае у вас будет 3 объекта bitmapData вместо sourceBitmapData и matrixImage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...