![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Цитата:
Так же удивляет Ваша позиция относительно централизации логики. Ну замкнете Вы золотые кубики на счетчик – тут нет особой проблемы, сделали у счетчика метод registerTrigger(trigger:ITrigger) и передавайте в него источники денег при их создании на карте, в методе подписываетесь на событие от этих кубиков, ну и unregisterTrigger(trigger:ITrigger) конечно не забыть) — все это будет прекрасно, пока Вам не взбредет в голову делать радостную улыбку на морде Марио при поступлении платежа на счет. Оказывается, еще кто-то должен знать. Делаем присоску к счетчику денег? Ах ты ж, совсем забыли — надо еще показывать, сколько бонусов всего на уровне и сколько уже оприходовано! И снова пиявки. А через пару недель эту окрошку уже не процедить, потому что каждая пиявка живет своей жизнью и чего-то делает, но никем не контролируется. Ничего не знает об остальных участниках программы, согласно директиве ООП(б), но — вот незадача — при этом самостоятельно действует, невзирая на планы партии (о которых просто ничего не знает). Настоятельно рекомендую не тратить время на сбор шишек. Изучите MVC. Хотя бы концепцию поймите, сразу туман войны рассеется.
__________________
Reality.getBounds(this); |
|
|||||
|
МVC - он для сайтов и социалочек всяких работает. А вот для аркады - уверенности нет (делал раза 2 и очень давно).
Зайдите на gamedev.ru - там популярнее объяснят как конкретно делать игры. Есть же и другие подходы, например entity-based system (сам не пробовал) По сути: Цитата:
Я бы в такой ситуации взял бы прямо объект "верхняя панель", добавил туда пару методов: private var _money:int = 0; public function get money():int { return _money; } public function set money(value:int):void { _money = value; _moneyTextField.text = value + "$"; } И добавил бы к этому коду строчку А потом бы уже глядя на _рабочий_ код думал какими проблемами такой подход чреват. Надо ли выделить класс PanelModel или так и таскать вьюшку по контроллеру, т.к. пофиг. Где лучше хранить вычисление бонуса - на кирпиче или в глобальном контроллере и т.д. Последний раз редактировалось expl; 09.05.2012 в 01:20. |
|
|||||
|
Цитата:
Цитата:
__________________
Мой профиль на фрилансе |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
__________________
Reality.getBounds(this); |
|
|||||
|
Т.е. счетчику передается в качестве параметра ссылка на кубик?
__________________
Мой профиль на фрилансе |
|
|||||
|
Цитата:
- заводим в панели (наверное, Wolsh имел ввиду не панель, а какой-то контроллер, но будем мыслить предметно) метод registerTrigger - заводим там список этих кубиков - при появлении кубика кто-то регистрирует его c помощью registerTrigger - при вызове registerTrigger - заносим кубик в список и подписываемся на события кубика - при unregisterTrigger - отписываемся Ради чего всё это? Не, оно понятно, что в какой-то ситуации такой подход оправдан, только не понятно в какой (да оно и вообще обсуждать архитектуру "на словах" тяжеловато) Цитата:
А если/потом/когда станет страшно передавать всем панель с кучей методов, относящихся только к отображению: - выносим PanelModel - подписываемя в Panel на PanelModel - чтобы панелька отображала изменения PanelModel - таскаем везде PanelModel |
|
|||||
|
Спасибо, ребят. Кое-что в голове стало просветляться.
Я напишу своими словами, а вы мне скажите: да, так и есть, или поправьте ![]() Я в главном классе создаю объекты игры и сразу передаю в них ссылку на панель со счетчиком и прочим Раз у меня есть ссылка на панель, то я в коде этого класса Kubik могу использовать методы верхней панели: В методах панели я могу предусмотреть сбор всех существующих кубиков и последующее прослушивание событий, которые они диспатчат: Тут до меня доходит, почему я должен вести учет кубиков. Листенеры не удалятся...
__________________
Мой профиль на фрилансе Последний раз редактировалось SvetozarPNZ; 09.05.2012 в 21:02. Причина: забыл теги AS3 |
|
|||||
|
Цитата:
А листенеры предполагается удалять при убирании кубика со цены, когда он вызывает метод unregister(currentKubik) Абстракция ничего не делает - выкинуть её из кода подальше. Не морочте себе голову, подход с registerTrigger в данной ситуации ничего не дает А код, который ничего не даёт - это вред в чистом виде. Делайте просто: |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Ладно. Теперь я расскажу, что имел в виду))
// место где создаются кубики var cube:MoneyCube = new MoneyCube(); _moneyCountBar.registerTrigger(cube); // код в MoneyCountBar (панельке) public function registerTrigger(trigger:IMoneyTrigger):void { trigger.addEventListener(GameEvent.MONEY_BONUS, increaseCount); } public function unregisterTrigger(trigger:IMoneyTrigger):void { trigger.removeEventListener(GameEvent.MONEY_BONUS, increaseCount); } Отписка нужна чтобы герой не получал бонусы, бегая по кубику взад-вперед))) Впрочем, для этого отписку можно вообще в хендлер события поставить, сделав кубики одноразовыми (до новой регистрации). Демократия для политики. В программировании — иерархия. Кубики не обладают логикой, их много. "Много" не имеет права принимать решение. Панель одна, значит может хоть о чем-то думать. Поэтому кубики сообщают в штаб, а штаб решает что с этим делать, на основании указаний сверху в том числе. У каждой задачи есть простое, очевидное и быстрое неправильное решение. Потом разработчик говорит: "Вот посмотрите, я тут пару игр написал... Что? ООП? Нее... не слышал!"
__________________
Reality.getBounds(this); |
|
|||||
|
Цитата:
Добавлено через 3 минуты Резюмирую. Управлять объектами буду в главном классе, но чтобы сократить код, все методы будут выполняться в других классах (каждому свою задачу), а для этого буду передавать методам ссылку на объект, которым в данный момент управляю.
__________________
Мой профиль на фрилансе |
![]() |
![]() |
Часовой пояс GMT +4, время: 19:26. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|