|
|
|||||
Баг BitmapData.draw() ?
Здравствуйте дорогие форумчане, столкнулся с очень неожиданым багом (что-то мне подсказывает что это баг).
Была задача - зарисовать bitmapData спрайтами с ипользованием блэнд-модов, применяя операции перемещения поворота и масштабирования. При отсутсвии блэнд-модов - все гуд, но с использованием любого из них, функция BitmapData.draw() рисует линии на контурах изображения. Решил написать максимлаьно простенькую дэмку чтоб убедится что ошибка не в проэкте, и результат оказался аналогичен вот скрин результата без использования блэнд-модов а вот полоски в результате прменения блэнд-модов Отключение параметра smoothing тоже ничего не дает, полоски остаются. Если можно дайте хотябы ссылки на кастомные аналоги для работы с BitmapData. Буду как-то обходить это Вот код дэмки, для singleSp можно использовать любое изображение с прозрачным фоном, вот мое:http://www.flasher.ru/forum/attachme...1&d=1389390901 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); } } } } |
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
Вполне может быть, что и баг.
Есть пара вариантов навскидку: 1. Блюрить немного 2. Использовать временную битмапдату для рисования одного штриха (или группы кистей) и потом уже у нее использовать блендмод при добавлении на основной холст Помимо этого посоветовал бы еще использовать константу соответствующего класса для названия эффекта наложения, а не писать "invert". Ну и перед рисованием основную бд можно блокировать, а после рисования, соответственно, разблокировать. Но это так, мелочи.
__________________
hauts.ru |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
Есть такая бага, как решается: не трансформировать и смешивать в один проход
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, время: 23:14. |
|
« Предыдущая тема | Следующая тема » |
Теги |
bitmapdata , BitmapData.draw , BlendMode |
|
|