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

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

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

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
По умолчанию Вопрос по enterFrame

Здравствуйте. Вопрос скорее - продолжение темы, созданной мною ранее о гонках, но так как от концепции 3D я отказался, то создал новую тему.
Трасса прямая, автомобиль едет какбы вглубь трассы (на самом деле стоит на месте), ему навстречу попадаются разные обьекты.
Вот думаю как организовать код. Планирую создать базовый класс Subject, который будет представлять эти движущиеся обьекты и иметь базовый набор свойств и методов. Люди будут иметь свое поведение, свои уникальные методы, деревья свои и т.д. Поэтому создаю подклассы Human, Tree, дорожные знаки и много чего еще... Все это дело наследую от класса Subject.
Но теперь проблема: в классе игры мне не удобно в ентерфрейме перемещать каждый елемент по сцене. И вот думаю так: Создать в базовом классе Subject слушатель ентерфрейм и приемник события - метод loop(). В то же время в подклассах: Human, Tree, через override переопределять метод loop() и в нем прописывать поведение екземпляра уникальное для Human и для Tree (тоесть менять координаты екземпляра по х и по у, высчитывать поведение данного обьекта и т.д.).
Как я понимаю, слушатель событий по идее один... Но, так как подклассов и их экземпляров будет много - каждый из них будет иметь свой обработчик. Это не будет грузить компьютер?
Скажите, такой подход приветствуется? Может есть предложения более оптимальные?
__________________
Я мало чего умею, но зато хорошо умею учиться...


Последний раз редактировалось HardCoder; 16.05.2011 в 10:40.
Старый 16.05.2011, 11:01
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Это не будет грузить компьютер?
Конечно будет, и довольно серьезно. Получится, что в каждом экземпляре будет добавляться свой слушатель.
Я бы вообще не добавлял этот слушатель таким образом, а создал один, отдельно, в каком-нибудь классе, скажем GameManager, все экземпляры (людей, машины и т.д.) поместил в массив и в классе GameManager по энтерфрейму вызывал бы метод update для каждого элемента массива в цикле.
Ну, естественно в каждом классе, который будет выполнять какое-то действие, должен быть метод update();

Код AS3:
private function onEnterFrame(e:Event):void {
    for (var i:String in myObjectsArray) {
           myObjectsArray[i].update();
    }
}

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
еще можно вот так сделать
Код AS3:
package utils {
 
	import flash.display.Shape;
 
	/**
	 * Глобальный диспатчер события flash.events.Event.ENTER_FRAME
	 * 
	 * @author gloomyBrain
	 */
	public final class EnterFrameBroadcaster extends Shape {
 
		private static var _instance:EnterFrameBroadcaster = null;
 
		/**
		 * Экземпляр синглтона
		 */
		public static function get instance():EnterFrameBroadcaster {
 
			if (!_instance) {
				_instance = new EnterFrameBroadcaster(new EnterFrameBroadcasterKey());
			}
 
			return _instance;
 
		}
 
		/**
		 * Для получения экземпляра используется статический акцессор instance
		 */
		public function EnterFrameBroadcaster(enforcer:EnterFrameBroadcasterKey) {
 
			super();
 
			if (!enforcer) {
				throw new ArgumentError("Необходим ключ для создания экземпляра!");
			}
 
		}
 
	}
 
}
 
internal final class EnterFrameBroadcasterKey { }
Ну и, соответственно, всех слушателей вешаем на экземпляр этого сиглтона
__________________
...вселенская грусть

Старый 16.05.2011, 12:31
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 4  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Можно. Непонятно только зачем вот это:
Код AS3:
 extends Shape
Не логичнее ли будет так:
Код AS3:
extends EventDispatcher

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

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Спасибо всем, откликнувшимся за оперативный ответ. Я, конечно буду использовать метод, который предложил goodguy, так как он проще, а я дуб-дерево в программировании
Но все же вопрос к gloomyBrain, (только не смейтесь и не отсылайте к справке от Adobe) :
Значит, как я понял создается один единственный экземпляр EnterFrameBroadcaster. Я в вышеописанных классах Human и Tree пишу:
Код AS3:
EnterFrameBroadcaster.instance.addEventListener(Event.ENTER_FRAME, updatePosition);
1. Это будет значит что в приложении всего один слушатель, не важно во скольких классах я нацеплю этих листенеров? Я правильно понял?
2. final должно мне как-то помочь, или же это всего лишь заготовка, которую вы используете, чтобы товарищи не расширяли ваш класс?
2. Почему Shape? Могу ли я ограничится банальным
Код AS3:
public final class EnterFrameBroadcaster extends Event {}
? или же Event сюда не прокатит?
3. Зачем в конструкторе "super();"? Как я понимаю, конструктор суперкласса вызывается все равно по умолчанию... Или я что-то не то вообще несу?
4. Зачем в параметрах конструктора enforcer:EnterFrameBroadcasterKey, и что вообще класс EnterFrameBroadcasterKey делает?
Буду очень благодарен за разъяснения
__________________
Я мало чего умею, но зато хорошо умею учиться...


Последний раз редактировалось HardCoder; 16.05.2011 в 12:44.
Старый 16.05.2011, 12:44
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 6  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
@goodguy
давно у нас EventDispatcher умеет ENTER_FRAME ловить? =)

@HardCoder
1. ну примерно
2. final потому что синглтон. Как-то странно расширять класс, который в приложении всего один.
3. super - это привычка. Можно не писать
4. для того, чтобы нельзя было вызвать конструктор напрямую, а только через геттер instance

Цитата:
или же Event сюда не прокатит?
Event - это само событие, а EventDispatcher (в том числе и Shape) - это тот, кто умеет их рассылать
__________________
...вселенская грусть

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

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Спасибо еще раз всем за помощь, теперь все понятно.

Добавлено через 45 минут
Немного поэкспериментировав, выследил следующее:
При реализации моего способа написал в классе Human:
Код AS3:
		override public function loop(e:Event):void {
			trace("human" + e.target);
		}
, в классе Tree:
Код AS3:
		override public function loop(e:Event):void {
			trace("tree"+e.target);
		}
Получил следующее:
Цитата:
tree[object Tree]
human[object Human]
В случае создания синглтона:
Код AS3:
		public function Tree() {			
			EnterFrameBroadcaster.instance.addEventListener(Event.ENTER_FRAME, updatePosition);		
		}
 
		private function updatePosition(e:Event):void {
			trace("tree"+e.target);
		}
и такой же код в классе Human. Тогда получил следующее:
Цитата:
human[object EnterFrameBroadcaster]
tree[object EnterFrameBroadcaster]
Вывод: В моем случае с переопределением метода - целевых обьектов будет огромное количество. Тоесть - для каждого экземпляра класса (Tree, Human и др.) отдельный целевой обьект...
В случае с синглтоном, целевой обьект события будет только один - экземпляр EnterFrameBroadcaster, который передает событие во множество приемников.
Но тогда вопрос: Это не один и тот же расход памяти:
один слушатель с одним целевым обьектом, но диспетчеризацией события во множество приемников
и
множество слушателей, каждый со своим приемником ?
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 16.05.2011, 13:47
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 8  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
@goodguy
давно у нас EventDispatcher умеет ENTER_FRAME ловить? =)
Действительно. Не подумал

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Тут разница будет в том, что будет создаваться только одно событие в случае с синглтоном или куча событий в другом случае (под событием имеется ввиду объект класса Event).
По сути дела, работая через синглтон, Вы так же обходите в цикле всех кого надо и вызываете в них то, что надо.
__________________
...вселенская грусть

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

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Вопрос ко всем заинтересовавшимся данной темой:
Используете ли вы классы наподобие EnterFrameBroadcaster и как часто?
Если нет, то бывали ли у вас случаи, когда одним ентерфреймом в огромном приложении обойтись нельзя?
А то у меня иногда бывает следующее: В классе игры при смене кадров обновляется фон, например. Тут возникает некая ошибка. В классе ошибки которая представляет собой окно с некой анимацией тоже нужно создать обработчик ентерфрейм (для анимации окна ошибки). Забегая наперед, скажу, что знаю, что этого можно избежать и в классе самой игры можно "обрабатывать" анимацию этой ошибки но тогда в классе игры будет слишком много кода. Но я люблю как можно больше локализировать код по классах и как можно меньше писать в самих классах.
Так как тема для меня совсем новая, думаю взять на вооружение данный пример с EnterFrameBroadcaster. Это дает хорошую уверенность в том что в приложении слушатель будет только один, и дает возможность локализировать код по классам с более узким предназначением. Это лично мое мнение.
__________________
Я мало чего умею, но зато хорошо умею учиться...

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

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

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


 


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


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