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

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

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

Регистрация: Dec 2009
Сообщений: 25
По умолчанию изменение одновременно ширины и высоты спрайта

Доброго времени суток!
У меня возник такой вопросик, можно ли как-нибудь изменить размеры DisplayObject-а одной функцией?
что-то типа sprite.setRect(0,0,100,100);
просто когда на сцене расположен большой составной объект, то если менять сначала width, а затем height, то после смены каждого их этих значений генерируется отдельный ResizeEvent и картинка ресайзится дергано и некрасиво: сначала вытягивается в ширину, а уже потом выравнивает высоту.
Или может можно как-то временно запретить объекту герерировать ResizeEvent?

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

Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
Цитата:
setRect(0,0,100,100);
Создайте свой класс, расширяющий Sprite и напишите эту функцию.

Старый 06.12.2012, 19:20
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 3  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Цитата:
Или может можно как-то временно запретить объекту герерировать ResizeEvent?
Наследуйтесь от этого класса
Код AS3:
package ru.inils.display.invalidate {
	/**
	* @author	iNils
	* @version	1.0
	*
	* Абстрактный класс для реализации в визуальных классах однократного вычисления необходимых перерисовок графического содержимого в течении кадра.
	* Каждый вызов свойства или метода способного изменить графическое содержимое, занимает процессорное время. Использую функционал класса AInvalidate, вызов метода (redraw), ответственного за расчеты и перерисовку графического содержимого, происходит единожды.
	*
	* Изменения:
	* 	1.0 (25.11.2008 18:59)
	*	[+]	...
	*/
	/*    IMPORT             *///{ /
	import flash.display.*;
	import flash.events.*;
	//}
	public class AInvalidate extends Sprite {
		/*  - VAR PRIVATE        *///{ /
		/// Состояние объекта.
		private var _changed:Boolean = false;
		//}
		/*  - CONSTRUCTOR -      *///{ /
		public function AInvalidate () {
			addEventListener (Event.ADDED_TO_STAGE, onAddedToStage);
			addEventListener (Event.REMOVED_FROM_STAGE, onRemovedFromStage);
			changed = true;
		}
		//}
		/*  # METHOD PROTECTED   *///{ /
		/**
		 * Заглушка для метода перерисовывающего графичское содержимое визуального класса, описываемого в расширяющихся классах.
		 */
		protected function redraw ():void {
		}
		//}
		/*    EVENT              *///{ /
		/// Событие добавления объекта на сцену
		private function onAddedToStage (event:Event):void {
			stage.addEventListener (Event.RENDER, onRenderListener);
			if (changed) {
				stage.invalidate ();
			}
		}
		/// 
		private function onRemovedFromStage (event:Event):void {
			stage.removeEventListener (Event.RENDER, onRenderListener);
		}
		/// 
		private function onRenderListener (event:Event):void {
			if (_changed) {
				_changed = false;
				redraw ();
			}
		}
		//}
		/*    GETTER / SETTER    *///{ /
		/**
		 * Функция чтения сообщает о том, что содержит ли объект изменения, которые еще не были визуализированы. Функция записи устанавливает статус измений: true - помечает, что в объекте произошли визуальные изменения. false - помечает, что самые последние изменения были отображены на экране.
		 */
		final protected function get changed ():Boolean {
			return _changed;
		}
		final protected function set changed (value:Boolean):void {
			if (value == _changed) {
				return;
			}
			_changed = value;
			if (stage != null) {
				stage.invalidate ();
			}
		}
		//}
	}
}
Переопределяете x, y, width, height, где только сохраняете новые значание и устанавливаете changed = true
Также переопределяете метод redraw, где и проводите все манипуляции с размерами и координатами.
В результате, сколько бы раз вы не меняли x, y, width, height, вся отрисовка будет происходить только один раз.
Примерно так
Код AS3:
package ru.inils.display.invalidate {
	/**
	 * @author	iNils
	 * @version	1.0
	 *
	 * Класс...
	 *
	 * Изменения:
	 * 	1.0 (06.12.2012 18:14)
	 *	[+]	...
	 */
	/*    IMPORT             *///{ /
	import flash.display.*;
	import flash.events.*;
	//}
	public class Sample extends AInvalidate {
		/*  - VAR PRIVATE        *///{ /
		private var _height:Number = 0;
		private var _width:Number = 0;
		//}
		/*  * CONSTRUCTOR *      *///{ /
		public function Sample () {
		}
		//}
		/*  # METHOD PROTECTED   *///{ /
		override protected function redraw ():void {
			trace ("Я изменился! " + _width + " " + _heigth);
		}
		//}
		/*    GETTER / SETTER    *///{ /
		public function get height ():Number {
			return _height;
		}
		public function set height (value:Number):void {
			if (value == _height) {
				return;
			}
			_height = value;
			changed = true;
		}
		public function get width ():Number {
			return _width;
		}
		public function set width (value:Number):void {
			if (value == _width) {
				return;
			}
			_width = value;
			changed = true;
		}
		//}
	}
}
И если использовать
Код AS3:
var s:Sample = new Sample ();
s.width = 100;
s.height = 100;
s.width = 200;
s.height = 300;
То увидите надпись "Я изменился! 200 300" один раз, а не 4.
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 06.12.2012 в 19:42.
Старый 06.12.2012, 19:41
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 4  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Код AS3:
public class Sample extends Sprite extends AInvalidate {
Это опечатка или новая конструкция?

И мне не совсем понятно как это работает.
В момент RENDER можно менять сколько-угодно свойств у объекта, и они точно перерисуются без ресайз-эвента и перед текущим фреймом?
Насколько я помню, во флеше не наступит рендер кадра до того, как выполнится скрипт. Как может произойти дёрганный ресайз, если в один момент происходит смена width/height? Инвалидтор, бесспорно, даст прирост в скорости, если менять одинаковые визуальные свойства много раз за кадр, но как он поможет в этом случае?


Последний раз редактировалось Psycho Tiger; 06.12.2012 в 19:52.
Старый 06.12.2012, 19:42
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 5  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Опечатка. Поправил.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 06.12.2012, 19:54
erectus вне форума Посмотреть профиль Отправить личное сообщение для erectus Найти все сообщения от erectus
  № 6  
Ответить с цитированием
erectus

Регистрация: Dec 2009
Сообщений: 25
варианты с наследованием мне не очень-то подходят, т.к. в основном мне это нужно чтобы изменять размеры Flex-овых объектов (хотя уже не раз у меня возникала необходимость вносить изменения и во флексовые классы).

Старый 06.12.2012, 21:09
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 7  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
Сообщение от erectus Посмотреть сообщение
варианты с наследованием мне не очень-то подходят, т.к. в основном мне это нужно чтобы изменять размеры Flex-овых объектов (хотя уже не раз у меня возникала необходимость вносить изменения и во флексовые классы).
Можно сделать композицией. Судь инвалидации – копить нужные свойства в полях/переменных, а потом выставить их за раз прямо перед показом фрейма - по Event.RENDER. Только я вот не совсем понимаю, к чему она тут (см. пост выше).

Старый 06.12.2012, 21:37
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 8  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
И мне не совсем понятно как это работает.
Даже если не выставлять свойства по нескольку раз, сама отрисовка может зависеть от нескольких свойств, например от width и height. И чтобы не производить одни и те же вычисления дважды (которые могут быть теоретически довольно сложными) используем инвалидацию.

Нилс, а почему RENDER, а не ENTER_FRAME?

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

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
iNils, кстати говоря, немного считаю ваш класс неполным, в одной теме на stackoverflow, читал что существуют проблемы с RENDER событием, так как оно периодически не срабатывает, поэтому предлагается завязываться ко всему прочему на ENTER_FRAME, я для этих целей имею вот такую реализацию кастомного спрайта

Хотя возможно проблема с событием RENDER уже не актуальна

Старый 06.12.2012, 23:32
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 10  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Цитата:
Хотя возможно проблема с событием RENDER уже не актуальна
Пруф?
__________________
http://www.chessmax.ru

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

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

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


 


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


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