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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.11.2013, 15:11
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 21  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Мне кажется, вот только как смог сократить код.
Цитата:
Тут больше интересно зачем АйФейсы !
Не для понта! Неужели, Вы опытные люди не понимаете для чего это?) я бы увидев такую постановку,
сразу понял, для чего это и от куда ноги растут. Ну а диспетчер нужен, так как интерфейс расширяет IED.
Но я не знаю пока как решить это. И интерфейс нужен на сто процентов и диспетчера тащить не хочется в этот класс.
Код AS3:
package 
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.display.DisplayObject;
	import flash.geom.Point;
	import flash.geom.Rectangle;
 
	public class ScalePlugin
	{
		private static var _eventDispatcher:EventDispatcher = new EventDispatcher();
 
		private var _object:DisplayObject;
		private var _point:Point;
		private var _bounding:Rectangle;
		private var _delay:Number;
		private var _currentTime:Number;
		private var _totalTime:Number;
 
		private var _coefficientWidth:Number;
		private var _coefficientHeight:Number;
 
		private var _speedWidth:Number;
		private var _speedHeight:Number;
 
		private var _speedX:Number;
		private var _speedY:Number;
 
		private var _finishX:int;
		private var _finishY:int;
 
		private var _scaleX:Number;
		private var _scaleY:Number;
		private var _callBack;
		private var _isCallBack:Boolean;
 
		public function setScale(object:DisplayObject,
										   scaleX:Number = 1.0,
										   scaleY:Number = 1.0,
										   delay:Number = 1.0,
										   point:Point = null,
										   callBack:Function=null,
										   bounding:Rectangle=null):void
		{
			if (!_object)
			{
				_object = object;
				_coefficientWidth = _object.width / 100;
				_coefficientHeight = _object.height / 100;
				_bounding = bounding;
			}
			if (!point) 
			{
				_point = new Point();
				_point.x = _object.width / 2 + _object.x;
				_point.y = _object.height / 2 + _object.y;
			}
			else 
			{
				_point = point;
			}
 
			_scaleX = scaleX;
			_scaleY = scaleY;
			_delay = delay;
			if (callBack)
			{
				_callBack = callBack;
				_isCallBack = true;
			}
			_currentTime = 0;
 
			//разница между текущеми и финишными размерами
			var differenceWidth:Number = _coefficientWidth * scaleX * 100 - _object.width;
			var differenceHeight:Number = _coefficientHeight * scaleY * 100 - _object.height;
 
			//время которое будет затрачено на увеличение
			_totalTime = differenceWidth / _coefficientWidth * (_delay / 100);
 
			//если время отрицательное делаем его положительным
			if (_totalTime < 0) _totalTime *= -1;
 
			_speedWidth = differenceWidth / _totalTime;
			_speedHeight = differenceHeight / _totalTime;
 
			//узнаем разницу между выбранной точкой и координатами обьекта
			var shiftX:Number = _point.x -_object.x;
			var shiftY:Number = _point.y - _object.y;
 
			//вычитаемое - растояние, уменьшив на которое значение координат обьекта, получим финишные координаты
			var subtrahendX:Number = shiftX - (_coefficientWidth * 100 * scaleX) / (_object.width / shiftX);
			var subtrahendY:Number = shiftY -  (_coefficientHeight * 100 * scaleY) / (_object.height / shiftY);
 
			_finishX = _object.x + subtrahendX;
			_finishY = _object.y + subtrahendY;
 
			if (_bounding)
			{
				if (_finishX > _bounding.x)_finishX = _bounding.x;
				if (_finishY > _bounding.y)_finishY = _bounding.y;
				if (_finishX < _bounding.x - ((_coefficientWidth * 100 * scaleX) - _coefficientWidth * 100))_finishX = _bounding.x - ((_coefficientWidth * 100 * scaleX) - _coefficientWidth * 100);
				if (_finishY < _bounding.y - ( (_coefficientHeight * 100 * scaleY) - _coefficientHeight * 100))_finishY = _bounding.y - ( (_coefficientHeight * 100 * scaleY) - _coefficientHeight * 100);
			}
			_speedX = (_finishX - _object.x) / _totalTime;
			_speedY = (_finishY - _object.y) / _totalTime;
 
		}
		public function advanceTime(time:Number):void 
		{
			_currentTime += time;
			if ( _currentTime  >  _totalTime )
			{
				var finishWidth:int = _coefficientWidth * _scaleX * 100;
				var finishHeight:int = _coefficientHeight * _scaleY * 100;
 
				_object.width = finishWidth;
				_object.height = finishHeight;
 
				_object.x = int(_finishX);
				_object.y = int(_finishY);
				_eventDispatcher.dispatchEvent(new Event(Event.COMPLETE));
				return; 
			}
			_object.width = time * _speedWidth+_object.width;
			_object.height = time*_speedHeight+_object.height;
			_object.x = time*_speedX+_object.x;
			_object.y = time * _speedY + _object.y
			/*if (_isCallBack)
			{
				_callBack(params);
			}*/
		}
	}
 
}

Старый 18.11.2013, 15:19
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 22  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Ну вот мы как грамотные люди не можем понять зачем тут айфейсы, расскажи нам!
Цитата:
private static var _eventDispatcher:EventDispatcher = new EventDispatcher();
Какой смысл в статической приватной переменной, если у вас нет даже статик методов? Делаем extends
public function setScale(someBitmap) - что будет? Или по вашему битмапу скейлить не приходится?

Добавлено через 1 минуту
_eventDispatcher.dispatchEvent(new Event(Event.COMPLETE)); - куда пойдет это событие в черную дыру?
__________________
Марк Tween

Старый 18.11.2013, 15:25
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 23  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Какой смысл в статической приватной переменной, если у вас нет даже статик методов?
А вот тут у меня вопросы, если сделать статическую public переменную, то она станет одна для всех екземпляров, то есть я предполагал, что если будет сто экземпляров, то _eventDispatcher не будет создаваться сто раз, а создастся лишь добавит ссылку на одно и тоже свойство.. Это не так?
Цитата:
Или по вашему битмапу скейлить не приходится?
Так тут без разницы что масштабировать.
Цитата:
_eventDispatcher.dispatchEvent(new Event(Event.COMPLETE)); - куда пойдет это событие в черную дыру?
Да, Спасибо! Только сейчас дошло, что на обьект не подпишешься, так диспетчера же нет. Вот тогда лучший вариант,
в классе который ждет событие и создавать статик свойство с диспетчером и на него же и подписаться.
Можно было бы и сам класс наследовать от ED, но я пока собираюсь его только в одном месте использовать, да и если понадобится,
то изменить не долго.


Последний раз редактировалось Akopalipsis; 18.11.2013 в 15:46.
Старый 18.11.2013, 16:13
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 24  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
Цитата:
Сообщение от Dukobpa3 Посмотреть сообщение
Пропорции при этом скейле меняются или остаются как есть?
в том то и проблема, битмапа при скэйле должна увеличиваться пропорционально scale, полная перерисовка заливки решит проблему со стыками? (не могу сейчас, к сожалению, проверить ), если нет какие есть еще варианты решения.

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Ну вот как будет возможность проверить так и отпишитесь.
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 18.11.2013, 16:30
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 26  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
Так тут без разницы что масштабировать.
Да, совсем забыл, что битмап эксденс ДО.

Цитата:
А вот тут у меня вопросы, если сделать статическую public переменную, то она станет одна для всех екземпляров, то есть я предполагал, что если будет сто экземпляров, то _eventDispatcher не будет создаваться сто раз, а создастся лишь добавит ссылку на одно и тоже свойство.. Это не так?
Делается статик утилита полностью с методом add(vector) либо addElement(do) . Это утилита - ей совершенно не нужно быть экземпляром.

Цитата:
Да, Спасибо! Только сейчас дошло, что на обьект не подпишешься, так диспетчера же нет. Вот тогда лучший вариант,
в классе который ждет событие и создавать статик свойство с диспетчером и на него же и подписаться.
Можно было бы и сам класс наследовать от ED, но я пока собираюсь его только в одном месте использовать, да и если понадобится,
то изменить не долго.
Я уже сказал - делать надо extends EventDispatcher. Либо если пойдете по пути статика, то метод addListener(name, function) , а внутри работает со своим приватным диспатчером.
Как то так
Код AS3:
ScaleUtils.addElement(someDO);
ScaleUtils.addListener(Event.COMPLETE , f);
ScaleUtils.scaleAll(); // flush all elements
__________________
Марк Tween

Старый 18.11.2013, 16:45
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 27  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Я уже сказал - делать надо extends EventDispatcher. Либо если пойдете по пути статика, то метод addListener(name, function)
Спасибо! Это наверное далеко не последний вариант, потому как сейчас просто думаю, как удобней все такие классы собрать. Собрать не как проще, а так, чтобы на каждое обращение не было лишних переходов и действий.

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

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
Цитата:
Сообщение от Dukobpa3 Посмотреть сообщение
Если размеры базового спрайта неизменны то можно замостить битмапой как удобно, потом сфоткать в другую битмапу и уже не с замощенным фоном скейлить, а с одной картинкой на фоне.
Пробовал перерисоввывать при каждом масштабировании битмапу не помогает, также перерисовывал залитый спрайт в цельную битмапу и масштабировал ее - не момогает, все равно при скейле стыки изменяются.

Название: scale.JPG
Просмотров: 189

Размер: 7.7 Кб

p.s. битмап в будущем будет сложней, программно или в векторе нарисовать ее будет проблематично.

для меня видятся несколько вариантов решения:
1. рисовать битмапу всегда одного размера, но это не желательно , так как относительно фона объекты будут намного меньше при скейле меньше 1, можно конечно использовать мелкую текстуру, а не плитки, но желательно чтобы плитку тоже можно было рисовать.
2. иметь несколько вариантов битмапы, для каждого значения скейла. (минус - их надо грузить);
3. рисовать в векторе, не желательно, хочется брать текстуры из интернета, а не рисовать самостоятельно.

Но все эти варианты - какие-то костыли , можно ли что-нибудь еще сделать, размеры базового спрайта неизменны, интервал изменения scale от 0.5 до 1 ?


Последний раз редактировалось Isfet; 19.11.2013 в 08:17.
Старый 19.11.2013, 12:38
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 29  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
перерисовывал залитый спрайт в цельную битмапу и масштабировал ее
А сглаживание установлено? Может помочь. Много кому не нравится ибо замылено получается, но тут можно попробовать.
Код AS3:
bmp.smoothing = true
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 19.11.2013, 12:55
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 30  
Ответить с цитированием
Isfet

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

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

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

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


 


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


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