Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.01.2014, 03:10
artics вне форума Посмотреть профиль Отправить личное сообщение для artics Найти все сообщения от artics
  № 1  
Ответить с цитированием
artics

Регистрация: Nov 2007
Адрес: UKRAINE
Сообщений: 32
Отправить сообщение для artics с помощью ICQ
По умолчанию Баг BitmapData.draw() ?

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

вот скрин результата без использования блэнд-модов

а вот полоски в результате прменения блэнд-модов


Отключение параметра 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);
 
			}
		}		
	}
 
}
Изображения
     

Старый 11.01.2014, 08:00
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 2  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Вполне может быть, что и баг.

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

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

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

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

Старый 13.01.2014, 18:46
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 3  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
Есть такая бага, как решается: не трансформировать и смешивать в один проход
Код 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, время: 02:21.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
bitmapdata , BitmapData.draw , BlendMode
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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