Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Реализация обмена данных между структурными окнами флеш игры (http://www.flasher.ru/forum/showthread.php?t=148472)

Alexmody 02.01.2011 19:05

Реализация обмена данных между структурными окнами флеш игры
 
Разрабатываю флеш игру.
Есть класс С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 нужного окна
            }
}

//Каждое окно содержит функцию GetParam(), которая возвращает соответствующие
текущему окну данные в виде ассоциативного массива 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);

Таким образом, окно CGameMap получает данные из окна CGamePage.

Пожалуйста, предложите свои варианты по обмену данными между оконами или
подкорректируйте текущий.

expl 03.01.2011 00:35

Alexmody,
если разным окнам нужны одни и те же данные - ну сделайте модель для этих данных.
Передавайте всем заинтересованным окнам эту модель
и подписывайтесь в окнах на изменения этой модели.
Тогда если в одном окне поменяют score - все окна, которым надо, услышат событие и поменяют у себя
Нафига окнам знать друг о друге?

mikhailk 03.01.2011 00:46

Что-то мне кажется слишком заумное решение для простой задачи.

По факту окно, в котором изменен параметр, должно продиспатчить наверх сообщение о том, что параметр был изменен, контроллер должен это изменение забрать, отразить в данных приложения (в "модели" в терминах MVC), после чего дернуть все открытые окна, чтобы они обновили свои данные, либо раздать им новые данные через какой-нибудь общий для них для всех метод refreshWindow().

Но мне что-то представляется сомнительной архитектура, где окна обмениваются информацией.

expl 03.01.2011 01:06

Да ладно,
один объект с парой полей, умеющий распространять события заумнее чудо-алгоритмов по поиску одного окна другим и обновлением соотвествующего поля?
В самом незаумном случае - поместить эти поля прямо в менеджер - тогда и объекта не понадобится и передавать ничего не надо. Централизация рулит

Стой, mikhailk, помоему ты тоже самое написал.

mikhailk 03.01.2011 01:14

не совсем ))
я не предлагал раздавать модель окнам ))

Alexmody 03.01.2011 14:01

expl
>>если разным окнам нужны одни и те же данные - ну сделайте модель для этих данных.
>>Передавайте всем заинтересованным окнам эту модель

mikhailk
>>контроллер должен это изменение забрать, отразить в данных приложения (в "модели" в терминах MVC)

Ну это, если большинство окон нуждаются в одних и тех же обновляемых параметрах.
А если, к примеру делать магазин. В главном окне магазина отображается массив вещей, каждая из которых имеет набор своих характеристик. У главного окна магазина, также есть несколько подокон, которые обмениваются данными о вещах с главным окном.

Т.е. не буду же я в модели менеджера СPageManager хранить множество разношерстных характеристик и параметров, которые логически относятся к разным окнам и подокнам (частям игры)?

passertm 03.01.2011 15:14

Думаю тут многое зависит от характера данных.

На пример, если есть некий GameConfigPage который должен передавать установленные настройки странице GamePage то, это должно быть через события. Ибо GamePage не нужно знать откуда пришли конфиги. Главное чтобы все подчинялось определенному формату. GameConfigPage тоже не должен ничего знать о GamePage. Получиль данные послал события. GameConfigPage получается полностью независиший от игры модуль который в дальнейшем удобно изменять и даже заменить.

А если речь идет о ShopPage это уже сложнее. Т.к. ему придется знать о товарах которые там есть. Кому то придется уменьшать количество товара в магазине и увеличивать его количество в инвенторе. Но при этом хорошо бы его тоже максимально отделить.

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

mikhailk 03.01.2011 15:15

Цитата:

Т.е. не буду же я в модели менеджера СPageManager хранить множество разношерстных характеристик и параметров, которые логически относятся к разным окнам и подокнам (частям игры)?
Так вот я и говорю, что меня смущает архитектура.
Я за свою жизнь сделал кучу магазинов, правда не во флеше, а в виде сайтов со всплывающими попапами на js и с обменом через AJAX, и не помню такой необходимости что-то гонять между окнами.

expl 03.01.2011 17:13

Цитата:

Ну это, если большинство окон нуждаются в одних и тех же обновляемых параметрах.
А если, к примеру делать магазин. В главном окне магазина отображается массив вещей, каждая из которых имеет набор своих характеристик. У главного окна магазина, также есть несколько подокон, которые обмениваются данными о вещах с главным окном.
Вот для тех, которые работают с одинаковыми данными и передаем одну модель,
которые с другими - другую

Если иерархия данных повторяет иерархию окон,
то пусть главное окно передает свою модель дочерним (или кусок своей модели дочерним)

Отвязывать данные от визуальных элементов все равно придется - иначе тяжко макароны распутывать

Да даже если не делать модели, что мешает хранить данные в родительском окне и передавать дочерним родителя с этими данными (ну и дети подпишутся на родителя)?
(ясен пень, это мешание данных с видом, но лучше чем искать в одном окне другие)

etc 03.01.2011 17:30

Сишное прошлое не даёт нормально работать во флеше :quiet:


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

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