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

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

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

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
По умолчанию Обводка объекта

Есть объект, со множеством вложенностей, у некоторых внутренних спрайтов есть тень, нужно обвести этот спрайт (произвольной формы) линией в 10 пикселей.
Подобный эффект достигается с помощью Glow фильтра, если поставить streight = 255, но проблема в том что этот фильтр подсвечивает и все фильтры теней, во вложенных спрайтах, есть ли какие нибудь способы сделать такую обводку, чтобы она не брала в расчет другие фильтры, а строилась только по спрайтам?
Есть дума перерисовывать исходный объект без фильтров, его "светить" и убирать из отображения, и добавлять в основной объект только обводку, но это достаточно трудоемко) думал может есть попроще способы

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Отрисовать весь объект в битмапку, и к ней применить обводку.
Но лучше заранее создать класс объекта, который будет делать всю эту работу, с учетом других фильтров. Потрудиться один раз, зато помто все объекты расширяющие этот класс смогут применять обводку.

Старый 05.09.2013, 22:39
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 3  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Не-не, все проще. Контейнеру назначить фильтр Inner Glow.
__________________
тут я

Старый 06.09.2013, 07:37
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 4  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
иннер все равно тени внутренних объектов подсвечивает

Старый 06.09.2013, 08:48
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 5  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
Думаю, все еще проще: если фильтр применяется и к детям контейнера - тогда нужно этот объект-контейнер поместить в Sprite на 0 уровень, поверх в этот же спрайт добавлять детей, и смело применять Glow-фильтр к целевому объекту.

Старый 06.09.2013, 11:07
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 6  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
так можно было бы сделать, если в спрайте контейнере бы рисовалось именно то , что нужно обвести, а если в нем ничего не рисуется, а просто добавляются дети с фильтрами, а он просто растягивается вследствии их добавления, нужно обвести всех детей по периметру, но не обводя при этом их фильтры

Старый 06.09.2013, 12:05
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Кликаем.
FiltersIgnore.swf   (1.8 Кб)


Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.filters.DropShadowFilter;
	import flash.geom.Rectangle;
	import flash.utils.Dictionary;
 
	/**
	 * ...
	 * @author Wolsh
	 */
	public class Main extends Sprite 
	{
		private var _filtered:Dictionary = new Dictionary();
		private var _isOutlined:Boolean = false;
		private var _outline:Bitmap;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
 
			var container:Sprite = new Sprite();
			super.addChild(container);
 
			var quadro:Sprite = new Sprite()
			quadro.graphics.beginFill(0x3344FF);
			quadro.graphics.drawRect(0, 0, 250, 250);
			container.addChild(quadro);
			quadro.x = 100;
			quadro.y = 100;
			quadro.filters = [new DropShadowFilter(9, 45, 0x000000, 1, 18, 18, 1, 3)];
 
			var circle:Sprite = new Sprite()
			circle.graphics.beginFill(0xFF4400);
			circle.graphics.drawCircle(0, 0, 100);
			container.addChild(circle);
			circle.x = 150;
			circle.y = 150;
			circle.filters = [new DropShadowFilter(9, 45, 0x000000, 1, 18, 18, 1, 3)];
 
			container.addEventListener(MouseEvent.CLICK, handlerClick);
		}
 
		private function handlerClick(event:MouseEvent):void 
		{
			if (_isOutlined)
			{
				removeBorder(event.currentTarget as Sprite);
			}
			else
			{
				drawBorderIgnoreFilters(event.currentTarget as Sprite);
			}
		}
 
		private function removeBorder(container:Sprite):void 
		{
			container.removeChild(_outline);
			_filtered = new Dictionary();
			_isOutlined = false;
		}
 
		private function drawBorderIgnoreFilters(container:Sprite):void 
		{
			var childs:uint = container.numChildren;
			for (var i:uint = 0; i < childs; i++)
			{
				var child:DisplayObject = container.getChildAt(i);
				_filtered[child] = child.filters.concat();
				child.filters = [];
			}
			var rect:Rectangle = container.getRect(container);
			var bmd:BitmapData = new BitmapData(rect.width + rect.x, rect.height + rect.y, true, 0x00000000);
			bmd.draw(container);
			_outline = new Bitmap(bmd);
			container.addChild(_outline);
			_outline.filters = [new DropShadowFilter(0, 45, 0x00FF00, 1, 2, 2, 5, 3, false, true, true)];
			for (i = 0; i < childs; i++ )
			{
				child = container.getChildAt(i);
				child.filters = _filtered[child];
			}
			_isOutlined = true;
		}
 
	}
 
}
Вложения
Тип файла: swf FiltersIgnore.swf (1.8 Кб, 111 просмотров)
__________________
Reality.getBounds(this);

Старый 06.09.2013, 15:29
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 8  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
да это то что нужно , но есть проблема, объект рисуется и в отрицательных координатах, можно ли битмапу отрисовать в отрицательных координатах?

Старый 06.09.2013, 15:40
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
попробуйте с матрицей.
__________________
Reality.getBounds(this);

Старый 06.09.2013, 15:58
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 10  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
Код AS3:
var matrix:Matrix = new Matrix();
matrix.tx = -rect.width*0.5;
matrix.ty = -rect.height*0.5;
bmd.draw(container,matrix);
не работает придется видать отрисовывать в батмапе контейнер контейнера

Создать новую тему Ответ Часовой пояс GMT +4, время: 07:25.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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