![]() |
Реализация обмена данных между структурными окнами флеш игры
Разрабатываю флеш игру.
Есть класс СPageManager, который регистрирует новые окна (напр. CMainMenuPage, CGamePage, CMapPage, СCreditsPage и пр.) занося их в массив и далее уже проводит манипуляции с этими окнами. Все окна наследуются от класса СBasePage. События, типа при нажатии кнопки Play (закрытие CMainMenuPage и показ CGamePage) можно реализовать через кастомные события (dispatchEvent) или же можно потомкам (окнам) передавать ссылку на экземпляр СPageManager. Итак, вот код создания и регистрации окна в CPageManager: Код:
//в функцию передается граф объект из src библиотеки напр. CMenuComponent и пр.(обмена) данных между окнами, например из окна CGamePage мне надо передать значение score и прочие данные в окно CMapPage. Как лучше это организовать? Количество передаваемых параметров не ограничено. Можно сделать так: Код:
//Класс СPageManager содержит public GetPage() текущему окну данные в виде ассоциативного массива Object: Код:
Каждое окно (напр.CGameMap) содержит переданную ссылку pageManager на родительский менеджер окон CPageManager, у которого вызываем описанную выше функцию GetPage() и уже далее обращаясь к функции GetParam(): для получения нужного окна из массива: Код:
//внутри класса CGameMapПожалуйста, предложите свои варианты по обмену данными между оконами или подкорректируйте текущий. |
Alexmody,
если разным окнам нужны одни и те же данные - ну сделайте модель для этих данных. Передавайте всем заинтересованным окнам эту модель и подписывайтесь в окнах на изменения этой модели. Тогда если в одном окне поменяют score - все окна, которым надо, услышат событие и поменяют у себя Нафига окнам знать друг о друге? |
Что-то мне кажется слишком заумное решение для простой задачи.
По факту окно, в котором изменен параметр, должно продиспатчить наверх сообщение о том, что параметр был изменен, контроллер должен это изменение забрать, отразить в данных приложения (в "модели" в терминах MVC), после чего дернуть все открытые окна, чтобы они обновили свои данные, либо раздать им новые данные через какой-нибудь общий для них для всех метод refreshWindow(). Но мне что-то представляется сомнительной архитектура, где окна обмениваются информацией. |
Да ладно,
один объект с парой полей, умеющий распространять события заумнее чудо-алгоритмов по поиску одного окна другим и обновлением соотвествующего поля? В самом незаумном случае - поместить эти поля прямо в менеджер - тогда и объекта не понадобится и передавать ничего не надо. Централизация рулит Стой, mikhailk, помоему ты тоже самое написал. |
не совсем ))
я не предлагал раздавать модель окнам )) |
expl
>>если разным окнам нужны одни и те же данные - ну сделайте модель для этих данных. >>Передавайте всем заинтересованным окнам эту модель mikhailk >>контроллер должен это изменение забрать, отразить в данных приложения (в "модели" в терминах MVC) Ну это, если большинство окон нуждаются в одних и тех же обновляемых параметрах. А если, к примеру делать магазин. В главном окне магазина отображается массив вещей, каждая из которых имеет набор своих характеристик. У главного окна магазина, также есть несколько подокон, которые обмениваются данными о вещах с главным окном. Т.е. не буду же я в модели менеджера СPageManager хранить множество разношерстных характеристик и параметров, которые логически относятся к разным окнам и подокнам (частям игры)? |
Думаю тут многое зависит от характера данных.
На пример, если есть некий GameConfigPage который должен передавать установленные настройки странице GamePage то, это должно быть через события. Ибо GamePage не нужно знать откуда пришли конфиги. Главное чтобы все подчинялось определенному формату. GameConfigPage тоже не должен ничего знать о GamePage. Получиль данные послал события. GameConfigPage получается полностью независиший от игры модуль который в дальнейшем удобно изменять и даже заменить. А если речь идет о ShopPage это уже сложнее. Т.к. ему придется знать о товарах которые там есть. Кому то придется уменьшать количество товара в магазине и увеличивать его количество в инвенторе. Но при этом хорошо бы его тоже максимально отделить. Так что если возможно опишите данные которые вы бы хотели передавать. |
Цитата:
Я за свою жизнь сделал кучу магазинов, правда не во флеше, а в виде сайтов со всплывающими попапами на js и с обменом через AJAX, и не помню такой необходимости что-то гонять между окнами. |
Цитата:
которые с другими - другую Если иерархия данных повторяет иерархию окон, то пусть главное окно передает свою модель дочерним (или кусок своей модели дочерним) Отвязывать данные от визуальных элементов все равно придется - иначе тяжко макароны распутывать Да даже если не делать модели, что мешает хранить данные в родительском окне и передавать дочерним родителя с этими данными (ну и дети подпишутся на родителя)? (ясен пень, это мешание данных с видом, но лучше чем искать в одном окне другие) |
Сишное прошлое не даёт нормально работать во флеше :quiet:
|
| Часовой пояс GMT +4, время: 07:29. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.