![]() |
|
||||||||||
|
|||||
|
Здравствуйте. Вопрос скорее - продолжение темы, созданной мною ранее о гонках, но так как от концепции 3D я отказался, то создал новую тему.
Трасса прямая, автомобиль едет какбы вглубь трассы (на самом деле стоит на месте), ему навстречу попадаются разные обьекты. Вот думаю как организовать код. Планирую создать базовый класс Subject, который будет представлять эти движущиеся обьекты и иметь базовый набор свойств и методов. Люди будут иметь свое поведение, свои уникальные методы, деревья свои и т.д. Поэтому создаю подклассы Human, Tree, дорожные знаки и много чего еще... Все это дело наследую от класса Subject. Но теперь проблема: в классе игры мне не удобно в ентерфрейме перемещать каждый елемент по сцене. И вот думаю так: Создать в базовом классе Subject слушатель ентерфрейм и приемник события - метод loop(). В то же время в подклассах: Human, Tree, через override переопределять метод loop() и в нем прописывать поведение екземпляра уникальное для Human и для Tree (тоесть менять координаты екземпляра по х и по у, высчитывать поведение данного обьекта и т.д.). Как я понимаю, слушатель событий по идее один... Но, так как подклассов и их экземпляров будет много - каждый из них будет иметь свой обработчик. Это не будет грузить компьютер? Скажите, такой подход приветствуется? Может есть предложения более оптимальные?
__________________
Я мало чего умею, но зато хорошо умею учиться... Последний раз редактировалось HardCoder; 16.05.2011 в 10:40. |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
Я бы вообще не добавлял этот слушатель таким образом, а создал один, отдельно, в каком-нибудь классе, скажем GameManager, все экземпляры (людей, машины и т.д.) поместил в массив и в классе GameManager по энтерфрейму вызывал бы метод update для каждого элемента массива в цикле. Ну, естественно в каждом классе, который будет выполнять какое-то действие, должен быть метод update(); |
|
|||||
|
еще можно вот так сделать
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 { }
__________________
...вселенская грусть |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Можно. Непонятно только зачем вот это:
Не логичнее ли будет так:
|
|
|||||
|
Спасибо всем, откликнувшимся за оперативный ответ. Я, конечно буду использовать метод, который предложил goodguy, так как он проще, а я дуб-дерево в программировании
![]() Но все же вопрос к gloomyBrain, (только не смейтесь и не отсылайте к справке от Adobe) : Значит, как я понял создается один единственный экземпляр EnterFrameBroadcaster. Я в вышеописанных классах Human и Tree пишу: 1. Это будет значит что в приложении всего один слушатель, не важно во скольких классах я нацеплю этих листенеров? Я правильно понял? 2. final должно мне как-то помочь, или же это всего лишь заготовка, которую вы используете, чтобы товарищи не расширяли ваш класс? 2. Почему Shape? Могу ли я ограничится банальным ? или же Event сюда не прокатит? 3. Зачем в конструкторе "super();"? Как я понимаю, конструктор суперкласса вызывается все равно по умолчанию... Или я что-то не то вообще несу? 4. Зачем в параметрах конструктора enforcer:EnterFrameBroadcasterKey, и что вообще класс EnterFrameBroadcasterKey делает? Буду очень благодарен за разъяснения ![]()
__________________
Я мало чего умею, но зато хорошо умею учиться... Последний раз редактировалось HardCoder; 16.05.2011 в 12:44. |
|
|||||
|
@goodguy
давно у нас EventDispatcher умеет ENTER_FRAME ловить? =) @HardCoder 1. ну примерно 2. final потому что синглтон. Как-то странно расширять класс, который в приложении всего один. 3. super - это привычка. Можно не писать 4. для того, чтобы нельзя было вызвать конструктор напрямую, а только через геттер instance Цитата:
__________________
...вселенская грусть |
|
|||||
|
Спасибо еще раз всем за помощь, теперь все понятно.
Добавлено через 45 минут Немного поэкспериментировав, выследил следующее: При реализации моего способа написал в классе Human: , в классе Tree: Получил следующее: Цитата:
public function Tree() { EnterFrameBroadcaster.instance.addEventListener(Event.ENTER_FRAME, updatePosition); } private function updatePosition(e:Event):void { trace("tree"+e.target); } Цитата:
В случае с синглтоном, целевой обьект события будет только один - экземпляр EnterFrameBroadcaster, который передает событие во множество приемников. Но тогда вопрос: Это не один и тот же расход памяти: один слушатель с одним целевым обьектом, но диспетчеризацией события во множество приемников и множество слушателей, каждый со своим приемником ?
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Действительно. Не подумал |
|
|||||
|
Тут разница будет в том, что будет создаваться только одно событие в случае с синглтоном или куча событий в другом случае (под событием имеется ввиду объект класса Event).
По сути дела, работая через синглтон, Вы так же обходите в цикле всех кого надо и вызываете в них то, что надо.
__________________
...вселенская грусть |
|
|||||
|
Вопрос ко всем заинтересовавшимся данной темой:
Используете ли вы классы наподобие EnterFrameBroadcaster и как часто? Если нет, то бывали ли у вас случаи, когда одним ентерфреймом в огромном приложении обойтись нельзя? А то у меня иногда бывает следующее: В классе игры при смене кадров обновляется фон, например. Тут возникает некая ошибка. В классе ошибки которая представляет собой окно с некой анимацией тоже нужно создать обработчик ентерфрейм (для анимации окна ошибки). Забегая наперед, скажу, что знаю, что этого можно избежать и в классе самой игры можно "обрабатывать" анимацию этой ошибки но тогда в классе игры будет слишком много кода. Но я люблю как можно больше локализировать код по классах и как можно меньше писать в самих классах. Так как тема для меня совсем новая, думаю взять на вооружение данный пример с EnterFrameBroadcaster. Это дает хорошую уверенность в том что в приложении слушатель будет только один, и дает возможность локализировать код по классам с более узким предназначением. Это лично мое мнение.
__________________
Я мало чего умею, но зато хорошо умею учиться... |
![]() |
![]() |
Часовой пояс GMT +4, время: 10:12. |
|
|
« Предыдущая тема | Следующая тема » |
|
|