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

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

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

Регистрация: Nov 2006
Сообщений: 93
По умолчанию Создание отражения (сложение alpha каналов по умножению)

Хочу сделать эффект отражения картинки ( с альфа каналом)

Результат выглядит примерно вот так
[IMG]http://img502.**************/img502/2821/reflectionoq8.th.jpg[/IMG]
То есть отражением является перевёрнутая обрезанная картинка плавно исчезающая к низу.

У меня получилось реализовать только попиксельно, что довольно сильно тормозит при бальших отражениях.
Вопрос как сделать это более аппаратно ?

Вод код функции
Код:
// создать отражение
	function CreateReflection()
	{
		// создаём Bitmap для будущего отражения
		var myBitmapData:BitmapData = new BitmapData(m_picture._width, GLB_data.m_reflection_height);	
		myBitmapData.fillRect(new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height),0x00000000);

		// переворачиваем отражение
		var matrix:Matrix = new Matrix();		
		matrix.scale(1,-1);
		matrix.translate(0,m_picture._height);
		
		// записываем в myBitmapData отражение
		myBitmapData.draw(m_picture,matrix);
		
		// теперь хотим сделать так, чтобы отражение исчезало по градиенту сверху вниз
		// то есть по сути хотим умножить альфа канал отражения на затухающий градиент
		
		//Alpha_Gradient_mc - это клип с градиентом от непрозрачного к прозрачному
		var grad_clip = attachMovie("Alpha_Gradient_mc","grad",getNextHighestDepth());		
		var grad_matrix = new Matrix();
		
		// подстраиваем градиент под правильный размер отражения
		grad_matrix.scale(m_picture._width/grad_clip._width,GLB_data.m_reflection_height/grad_clip._height);				
		var grad_bitmap:BitmapData = new BitmapData(m_picture._width, GLB_data.m_reflection_height);	
		grad_bitmap.fillRect(new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height),0x00000000);		
		grad_bitmap.draw(grad_clip,grad_matrix);
		

		
		var color_transform:ColorTransform = new ColorTransform();		
		grad_matrix = new Matrix(); 	
		

		// эти закоментареные строки правильного результата не дали		
		//myBitmapData.draw(grad_bitmap,grad_matrix,color_transform,"multiply");				
		//myBitmapData.copyChannel(grad_bitmap, new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height), new Point(0, 0), 1, 8)
		//myBitmapData.merge(grad_bitmap, new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height),new Point(0, 0), 128, 0, 0, -255);
		
		// попиксельная обработка хоть и даёт правильный результат, то уж больно тормозит
		for(var i_x = 0;i_x<m_picture._width;i_x++)
		{
			for(var i_y = 0;i_y<GLB_data.m_reflection_height;i_y++)
			{				
				var pict_color = myBitmapData.getPixel32(i_x,i_y);
				var grad_color = grad_bitmap.getPixel32(i_x,i_y);
				
				var alpha  = (((pict_color>> 24 & 0xFF)) * ((grad_color>> 24) & 0xFF))/255;
				//var alpha  = ((grad_color>> 24) & 0xFF);
				pict_color = pict_color & 0x00FFFFFF;
				
				trace(alpha);				
				alpha = alpha << 24;
				pict_color += alpha;
				myBitmapData.setPixel32(i_x,i_y,pict_color);				
			}
		}
		
		grad_clip.removeMovieClip();		
		m_reflection.attachBitmap(myBitmapData, m_reflection.getNextHighestDepth(), "auto", true);		
	}

Старый 08.08.2007, 14:31
screamge вне форума Посмотреть профиль Отправить личное сообщение для screamge Посетить домашнюю страницу screamge Найти все сообщения от screamge
  № 2  
Ответить с цитированием
screamge
Ветеран форума
 
Аватар для screamge

Регистрация: Jul 2006
Адрес: Грузия, Тбилиси
Сообщений: 2,675
Можно зделать при помощи маски, _rotate и _alpha
__________________
Free-lance | Twitter | Me

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

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
прикольно на этом imageshark - зашел, я 10000-й посетитель и что-то выиграл, обновляю страницу - я уже 999999-й ))
Только не _rotation, а _уscale - это ж зеркало

Старый 08.08.2007, 14:46
screamge вне форума Посмотреть профиль Отправить личное сообщение для screamge Посетить домашнюю страницу screamge Найти все сообщения от screamge
  № 4  
Ответить с цитированием
screamge
Ветеран форума
 
Аватар для screamge

Регистрация: Jul 2006
Адрес: Грузия, Тбилиси
Сообщений: 2,675
Цитата:
Сообщение от Kikasso
Только не _rotation, а _уscale - это ж зеркало
Значение в минус? Так тоже можно.
__________________
Free-lance | Twitter | Me


Последний раз редактировалось screamge; 08.08.2007 в 14:52.
Старый 08.08.2007, 14:47
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
http://silin.fatal.ru/#2,3

Старый 08.08.2007, 17:54
KPOT вне форума Посмотреть профиль Отправить личное сообщение для KPOT Найти все сообщения от KPOT
  № 6  
Ответить с цитированием
KPOT
[+1.3 31.07.07]
 
Аватар для KPOT

Регистрация: Jul 2007
Сообщений: 64
а еще таких картинок у вас нету?

Старый 08.08.2007, 19:41
Ляксей вне форума Посмотреть профиль Отправить личное сообщение для Ляксей Найти все сообщения от Ляксей
  № 7  
Ответить с цитированием
Ляксей

Регистрация: Nov 2006
Сообщений: 93
Цитата:
Сообщение от __etc
Это к сожалению не подходит, так как там альфа канал просто заливается градиентом.
Код:
maskMC.beginGradientFill("linear",
				[0,0],
				[0,int(alpha*0xFF)],
				[0,0xFF],
				{matrixType:"box", x:0, y:0, w:width, h:height, r:Math.PI/2});
И это будет выглядеть вот так
[IMG]http://img64.**************/img64/7666/reflection1aq5.th.jpg[/IMG]


Цитата:
Сообщение от KPOT
а еще таких картинок у вас нету?
Есть. Очень нужная вещь для тестирования

А вот с масками надо попробовать

Старый 08.08.2007, 20:22
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
А в чем разница-то? Настройте градиент и проблем никаких.

Старый 09.08.2007, 17:16
Ляксей вне форума Посмотреть профиль Отправить личное сообщение для Ляксей Найти все сообщения от Ляксей
  № 9  
Ответить с цитированием
Ляксей

Регистрация: Nov 2006
Сообщений: 93
Цитата:
Сообщение от __etc
А в чем разница-то? Настройте градиент и проблем никаких.
Обратите внимание на отражение самой левой девочки - всё что было прозрачным ( вокруг неё) залилось непрозрачным. Получился вокруг чёрный фон.
Если Вы прочитаете название топика, то увидите, что нужно сложить два альфа канала по умножению, а не настраивать градиент. В первом посте приведён метод попиксельной обработки.

Старый 09.08.2007, 17:25
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 10  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Хм. Черный фон — это проблема реализации.
http://etcs.ru/pre/Core/picture.swf (нажать пробел после загрузки), такое нужно отражение? Прозрачная картинка или нет — неважно.


Последний раз редактировалось etc; 09.08.2007 в 17:27.
Создать новую тему Ответ Часовой пояс GMT +4, время: 09:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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