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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.01.2011, 00:59
DZHETIGAPA вне форума Посмотреть профиль Отправить личное сообщение для DZHETIGAPA Найти все сообщения от DZHETIGAPA
  № 1  
Ответить с цитированием
DZHETIGAPA
[+3 18.04.11]

Регистрация: Dec 2010
Сообщений: 342
По умолчанию Организовать грамотный код

Возникла проблемка, как грамотно организовать работу кода. Вот простейший код, который помещен в прослушиватель события ENTER_FRAME:

Код AS3:
private function onFrame(e:Event):void
{
    if (rectSpr.height > stage.stageHeight / 2) addChild(_scrollBar);
 
    if (rectSpr.height < stage.stageHeight / 2) removeChild(_scrollBar);
}
Но тут при каждом кадре на сцену добавляется _scrollBar и соответственно тормоза. Мне же надо, что бы addChild(_scrollBar) срабатывало один раз при выполнении условия оператора. Аналогично и с removeChild(_scrollBar). То есть, если выполнилось условие, то addChild(_scrollBar), но только один раз. Когда выполняется следующее условие, то removeChild(_scrollBar) и тоже один раз.

А то у меня как-то все громоздко получается и некрасиво. Или же тут нужно собственные события создавать?

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

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Ну вообще-то бы надо на кастомное событие производить действие, то есть надо слушать тот объект, который может изменить rectSpr.Но если очень хочется на EnterFrame:
Код AS3:
private var isAddedSB:Boolean;
		private function onFrame(e:Event):void{
			if (rectSpr.height > stage.stageHeight / 2 && !isAddedSB) {
				isAddedSB = true;
				addChild(_scrollBar);
			}
			if (rectSpr.height < stage.stageHeight / 2 && isAddedSB) {
				isAddedSB = false;
				removeChild(_scrollBar);
			}
		}
ну или так:
Код AS3:
private function onFrame(e:Event):void{
			if (rectSpr.height > stage.stageHeight / 2 && !_scrollBar.parent) {
				addChild(_scrollBar);
			}
			if (rectSpr.height < stage.stageHeight / 2 && _scrollBar.parent) {
				removeChild(_scrollBar);
			}
		}
Короче говоря дофига вариантов, но EnterFrame явно не лучший.
__________________
Я просто добрый шутник.

Старый 14.01.2011, 01:18
DZHETIGAPA вне форума Посмотреть профиль Отправить личное сообщение для DZHETIGAPA Найти все сообщения от DZHETIGAPA
  № 3  
Ответить с цитированием
DZHETIGAPA
[+3 18.04.11]

Регистрация: Dec 2010
Сообщений: 342
Цитата:
Сообщение от scarbo Посмотреть сообщение
Ну вообще-то бы надо на кастомное событие производить действие, то есть надо
Короче говоря дофига вариантов, но EnterFrame явно не лучший.
Можешь мне пжлст написать хоть парочку вариантов или дать ссылки для наводки. Просто я еще не спец во флэше, а вот развиваться надо. ENTER_FRAME первое, что мне зеленому пришло в голову

Старый 14.01.2011, 01:20
scarbo вне форума Посмотреть профиль Отправить личное сообщение для scarbo Найти все сообщения от scarbo
  № 4  
Ответить с цитированием
scarbo
 
Аватар для scarbo

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Колин Мук "Action Script 3.0 для Flash. Подробное руководство."
__________________
Я просто добрый шутник.

Старый 14.01.2011, 01:23
DZHETIGAPA вне форума Посмотреть профиль Отправить личное сообщение для DZHETIGAPA Найти все сообщения от DZHETIGAPA
  № 5  
Ответить с цитированием
DZHETIGAPA
[+3 18.04.11]

Регистрация: Dec 2010
Сообщений: 342
Уже несколько раз перечитываю. Он даже щас открыт у меня на главе Пользовательские события

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

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Кхм, давай рассуждать.Пока без всяких паттернов и проч.
Что у тебя может менять высоту rectSpr?
Как вариант (не самый лучший, но все же):
1)создаешь свой класс наследник от Sprite и экземпляр этого класса и будет rectSpr
2)переопределяешь там heigth -
Код AS3:
override public function set height(value:Number){super.height=value;dispatchEvent(new Event('RESIZE'))}
3)подписываешься на Event('RESIZE')
4)добавляешь или удаляешь _scrollBar
__________________
Я просто добрый шутник.

Старый 14.01.2011, 01:29
DZHETIGAPA вне форума Посмотреть профиль Отправить личное сообщение для DZHETIGAPA Найти все сообщения от DZHETIGAPA
  № 7  
Ответить с цитированием
DZHETIGAPA
[+3 18.04.11]

Регистрация: Dec 2010
Сообщений: 342
rectSpr - тут у меня находится различный контент(height у всех разный), который изменяет свои размеры при наведении на него. Если height вылазит за пределы сцены, то появляется скроллер.

Правильно ли я понимаю, что в этом классе sprRect я должен диспетчеризировать свое событие?

Старый 14.01.2011, 01:34
scarbo вне форума Посмотреть профиль Отправить личное сообщение для scarbo Найти все сообщения от scarbo
  № 8  
Ответить с цитированием
scarbo
 
Аватар для scarbo

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Ну к примеру:
Класс Main.as
Код AS3:
package  
{
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	/**
	 * ...
	 * @author Scarbo
	 */
	public class Main extends Sprite 
	{
 
		public function Main() 
		{
			var resizeSpr:ResizeSprite = new ResizeSprite();
			resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler);
			resizeSpr.addEventListener(MouseEvent.CLICK, _clickHandler);
			addChild(resizeSpr);
			//
			var g:Graphics = resizeSpr.graphics;
			g.clear();
			g.beginFill(0x234acc);
			g.drawRect(0, 0, 100, 100);
			g.endFill();
		}
 
		private function _clickHandler(e:MouseEvent):void {
			var resizeSpr:ResizeSprite = e.target as ResizeSprite;
			resizeSpr.height += 10;
			resizeSpr.width += 20;
		}
 
		private function _resizeHandler(e:Event):void {
			trace(e.type);
		}
	}
 
}
Класс ResizeSprite.as
Код AS3:
package  
{
	import flash.display.Sprite;
	import flash.events.Event;
 
	/**
	 * ...
	 * @author Scarbo
	 */
	public class ResizeSprite extends Sprite 
	{
		public static const RESIZE:String = 'resize';
 
		public function ResizeSprite() 
		{
			super();
			mouseChildren = false;
		}
 
		override public function set width(value:Number):void {
			super.width = value;
			dispatchEvent(new Event(RESIZE));
		}
		override public function set height(value:Number):void {
			super.height = value;
			dispatchEvent(new Event(RESIZE));
		}
	}
 
}
Что мы получили - теперь мы можем подписываться на событие RESIZE у любого экземпляра класса ResizeSprite и узнавать, когда меняются его размеры.
Но когда пишут скроллы, то обычно учитывается, что они будут работать с любым видим контентом, то есть сам скролл должен приспосабливаться под контент, а не наоборот.
__________________
Я просто добрый шутник.


Последний раз редактировалось scarbo; 14.01.2011 в 01:44.
Старый 14.01.2011, 01:53
DZHETIGAPA вне форума Посмотреть профиль Отправить личное сообщение для DZHETIGAPA Найти все сообщения от DZHETIGAPA
  № 9  
Ответить с цитированием
DZHETIGAPA
[+3 18.04.11]

Регистрация: Dec 2010
Сообщений: 342
Понял зачем событие resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler) только когда скомпилировал. То есть тут экземпляру класса присваивается новое значение высоты и ширины. И не надо ЭнтерФрэйм использовать.

Ладно... буду разбираться в своей огороде...

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

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Цитата:
То есть тут экземпляру класса присваивается новое значение высоты и ширины
Ничего там не присваивается, resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler) - это мы просто подписываемся, чтобы слушать когда изменится высота или ширина resizeSpr.Я же описал выше логику происходящего.
Еще раз, зачем я сделал класс ResizeSprite?
Чтобы можно было диспатчить(выкидывать) событие, когда у экземпляра этого класса(resizeSpr) изменится высота или ширина.
var resizeSpr:ResizeSprite = new ResizeSprite();
Создали экземпляр класса.
resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler);
Подписались на "слушание" "выкидывания" события 'resize', соответственно в функции _resizeHandler можно что-то делать, зная что эта функция вызывается только когда у resizeSpr изменяться размеры.
resizeSpr.addEventListener(MouseEvent.CLICK, _clickHandler);
тут и ниже - это просто пример кода, при клике мышью на resizeSpr, у него меняются размеры, как только они поменялись вызывается функция _resizeHandler.

Еще фишка, если в коде ResizeSprite.as написать не так:
dispatchEvent(new Event(RESIZE));
а вот так:
dispatchEvent(new Event(RESIZE, true));
то можно наделать кучу resizeSpr, дальше подписаться на stage
stage.addEventListener(ResizeSprite.RESIZE, _resizeHandler);
и мы будем знать когда меняются размеры у любого из экземпляров ResizeSprite.
__________________
Я просто добрый шутник.


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

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

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


 


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


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