![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Разрабатываю флеш игру.
Есть класс СPageManager, который регистрирует новые окна (напр. CMainMenuPage, CGamePage, CMapPage, СCreditsPage и пр.) занося их в массив и далее уже проводит манипуляции с этими окнами. Все окна наследуются от класса СBasePage. События, типа при нажатии кнопки Play (закрытие CMainMenuPage и показ CGamePage) можно реализовать через кастомные события (dispatchEvent) или же можно потомкам (окнам) передавать ссылку на экземпляр СPageManager. Итак, вот код создания и регистрации окна в CPageManager: //в функцию передается граф объект из src библиотеки напр. CMenuComponent и пр. pageManager.registerPage(new CMenuPage(new CMenuComponent())); pageManager.registerPage(new CCreditsPage(new CCreditsComponent())); pageManager.registerPage(new CGamePage(new CGameComponent())); pageManager.registerPage(new CMapPage(new CMapComponent())); и пр. (обмена) данных между окнами, например из окна CGamePage мне надо передать значение score и прочие данные в окно CMapPage. Как лучше это организовать? Количество передаваемых параметров не ограничено. Можно сделать так: //Класс СPageManager содержит public GetPage()
//функцию возврата зарегистрированного окна по объекту Class:
public class CPageManager extends Sprite
{
private var arrPages:Array;
public function GetPage (page:Class):СBasePage
{
//…выборка из массива по типу-значению Class
//return нужного окна
}
}
текущему окну данные в виде ассоциативного массива Object:
public function GetParam():Object
{
var param:Object = new Object();
param["score"] = 20;
param["time"] = 4000;
return param;
}
Каждое окно (напр.CGameMap) содержит переданную ссылку pageManager на родительский менеджер окон CPageManager, у которого вызываем описанную выше функцию GetPage() и уже далее обращаясь к функции GetParam(): для получения нужного окна из массива: //внутри класса CGameMap var param:Object = (this.pageManager.GetPage(CGamePage) as CGamePage).GetParam(); trace(param.score); trace(param.time); Пожалуйста, предложите свои варианты по обмену данными между оконами или подкорректируйте текущий. Последний раз редактировалось Alexmody; 04.01.2011 в 09:39. |
|
|||||
|
Alexmody,
если разным окнам нужны одни и те же данные - ну сделайте модель для этих данных. Передавайте всем заинтересованным окнам эту модель и подписывайтесь в окнах на изменения этой модели. Тогда если в одном окне поменяют score - все окна, которым надо, услышат событие и поменяют у себя Нафига окнам знать друг о друге? Последний раз редактировалось expl; 03.01.2011 в 00:39. |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Что-то мне кажется слишком заумное решение для простой задачи.
По факту окно, в котором изменен параметр, должно продиспатчить наверх сообщение о том, что параметр был изменен, контроллер должен это изменение забрать, отразить в данных приложения (в "модели" в терминах MVC), после чего дернуть все открытые окна, чтобы они обновили свои данные, либо раздать им новые данные через какой-нибудь общий для них для всех метод refreshWindow(). Но мне что-то представляется сомнительной архитектура, где окна обмениваются информацией. |
|
|||||
|
Да ладно,
один объект с парой полей, умеющий распространять события заумнее чудо-алгоритмов по поиску одного окна другим и обновлением соотвествующего поля? В самом незаумном случае - поместить эти поля прямо в менеджер - тогда и объекта не понадобится и передавать ничего не надо. Централизация рулит Стой, mikhailk, помоему ты тоже самое написал. Последний раз редактировалось expl; 03.01.2011 в 01:10. |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
не совсем ))
я не предлагал раздавать модель окнам )) |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
expl
>>если разным окнам нужны одни и те же данные - ну сделайте модель для этих данных. >>Передавайте всем заинтересованным окнам эту модель mikhailk >>контроллер должен это изменение забрать, отразить в данных приложения (в "модели" в терминах MVC) Ну это, если большинство окон нуждаются в одних и тех же обновляемых параметрах. А если, к примеру делать магазин. В главном окне магазина отображается массив вещей, каждая из которых имеет набор своих характеристик. У главного окна магазина, также есть несколько подокон, которые обмениваются данными о вещах с главным окном. Т.е. не буду же я в модели менеджера СPageManager хранить множество разношерстных характеристик и параметров, которые логически относятся к разным окнам и подокнам (частям игры)? |
|
|||||
|
[+1 28.12.10]
[+1 29.12.10] Регистрация: Aug 2006
Сообщений: 107
|
Думаю тут многое зависит от характера данных.
На пример, если есть некий GameConfigPage который должен передавать установленные настройки странице GamePage то, это должно быть через события. Ибо GamePage не нужно знать откуда пришли конфиги. Главное чтобы все подчинялось определенному формату. GameConfigPage тоже не должен ничего знать о GamePage. Получиль данные послал события. GameConfigPage получается полностью независиший от игры модуль который в дальнейшем удобно изменять и даже заменить. А если речь идет о ShopPage это уже сложнее. Т.к. ему придется знать о товарах которые там есть. Кому то придется уменьшать количество товара в магазине и увеличивать его количество в инвенторе. Но при этом хорошо бы его тоже максимально отделить. Так что если возможно опишите данные которые вы бы хотели передавать. Последний раз редактировалось passertm; 03.01.2011 в 15:20. |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Цитата:
Я за свою жизнь сделал кучу магазинов, правда не во флеше, а в виде сайтов со всплывающими попапами на js и с обменом через AJAX, и не помню такой необходимости что-то гонять между окнами. |
|
|||||
|
Цитата:
которые с другими - другую Если иерархия данных повторяет иерархию окон, то пусть главное окно передает свою модель дочерним (или кусок своей модели дочерним) Отвязывать данные от визуальных элементов все равно придется - иначе тяжко макароны распутывать Да даже если не делать модели, что мешает хранить данные в родительском окне и передавать дочерним родителя с этими данными (ну и дети подпишутся на родителя)? (ясен пень, это мешание данных с видом, но лучше чем искать в одном окне другие) Последний раз редактировалось expl; 03.01.2011 в 17:16. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Сишное прошлое не даёт нормально работать во флеше
![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:27. |
|
|
« Предыдущая тема | Следующая тема » |
|
|