Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Баг BitmapData.draw() ? (http://www.flasher.ru/forum/showthread.php?t=206076)

artics 11.01.2014 03:10

Баг BitmapData.draw() ?
 
Вложений: 3
Здравствуйте дорогие форумчане, столкнулся с очень неожиданым багом (что-то мне подсказывает что это баг).
Была задача - зарисовать bitmapData спрайтами с ипользованием блэнд-модов, применяя операции перемещения поворота и масштабирования. При отсутсвии блэнд-модов - все гуд, но с использованием любого из них, функция BitmapData.draw() рисует линии на контурах изображения. Решил написать максимлаьно простенькую дэмку чтоб убедится что ошибка не в проэкте, и результат оказался аналогичен

вот скрин результата без использования блэнд-модов
http://www.flasher.ru/forum/attachme...1&d=1389390901
а вот полоски в результате прменения блэнд-модов
http://www.flasher.ru/forum/attachme...1&d=1389390901

Отключение параметра smoothing тоже ничего не дает, полоски остаются.


Если можно дайте хотябы ссылки на кастомные аналоги для работы с BitmapData. Буду как-то обходить это

Вот код дэмки, для singleSp можно использовать любое изображение с прозрачным фоном, вот мое:http://www.flasher.ru/forum/attachme...1&d=1389390901

Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.geom.ColorTransform;
        import flash.geom.Matrix;
        import flash.geom.Rectangle;
        import flash.display.StageScaleMode;
        import flash.display.StageAlign;
 
        public class Main extends Sprite
        {
 
                [Embed(source = "assets/pic1.png")]
                public var singleSp:Class;
 
                var picBD:BitmapData;
                var picBM:Bitmap;
 
 
                public function Main():void
                {
                        picBD = new BitmapData(600, 600, true, 0);
                        picBM = new Bitmap(picBD, "auto", true);
                        addChild(picBM);
 
                        var tr:Matrix = new Matrix();
 
                        var drawIm:BitmapData = (new singleSp as Bitmap).bitmapData;
 
                        for (var i:int = 0; i < 30; i++ ) {
 
                                var scale:Number = 0.3 + Math.random() * 0.8;                               
                                tr.setTo(1, 0, 0, 1, 0, 0);
                                tr.scale(scale, scale);
                                tr.rotate(Math.random() * 2);
                                tr.tx = Math.random() * 150 + 150;
                                tr.ty = Math.random() * 150;                               
 
                                picBD.draw(drawIm, tr, new ColorTransform(1,1,1,0.4), "invert", null, true);
 
                        }
                }               
        }
 
}


Hauts 11.01.2014 08:00

Вполне может быть, что и баг.

Есть пара вариантов навскидку:

1. Блюрить немного

2. Использовать временную битмапдату для рисования одного штриха (или группы кистей) и потом уже у нее использовать блендмод при добавлении на основной холст

Помимо этого посоветовал бы еще использовать константу соответствующего класса для названия эффекта наложения, а не писать "invert". Ну и перед рисованием основную бд можно блокировать, а после рисования, соответственно, разблокировать. Но это так, мелочи.

Nooob 13.01.2014 18:46

Есть такая бага, как решается: не трансформировать и смешивать в один проход
Код AS3:

                private var picBD:BitmapData;
                private var picTemp:BitmapData;
                private var picBM:Bitmap;
 
                public function Main ():void
                {
                        picBD = new BitmapData(600, 600, true, 0);
                        picBM = new Bitmap(picBD, "auto", true);
                        picTemp = new BitmapData(600, 600, true, 0);
                        addChild(picBM);
 
                        var tr:Matrix        = new Matrix();
                        var drawIm:BitmapData = (new singleSp as Bitmap).bitmapData;
 
                        for (var i:int = 0; i < 30; i++)
                        {
                                var scale:Number = 0.3 + Math.random() * 0.8;
                                tr.setTo(1, 0, 0, 1, 0, 0);
                                tr.scale(scale, scale);
                                tr.rotate(Math.random() * 2);
                                tr.tx = Math.random() * 150 + 150;
                                tr.ty = Math.random() * 150;
 
                                picTemp.draw(drawIm, tr, null, null, null, true);
                                picBD.draw(picTemp, null, new ColorTransform(1, 1, 1, 0.4), "invert");
                                picTemp.fillRect(picTemp.rect, 0);
                        }
                }



Часовой пояс GMT +4, время: 08:05.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.