Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.01.2011, 19:05
Alexmody вне форума Посмотреть профиль Отправить личное сообщение для Alexmody Найти все сообщения от Alexmody
  № 1  
Ответить с цитированием
Alexmody

Регистрация: 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 нужного окна
            }
}
//Каждое окно содержит функцию 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.

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


Последний раз редактировалось Alexmody; 04.01.2011 в 09:39.
Старый 03.01.2011, 00:35
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Alexmody,
если разным окнам нужны одни и те же данные - ну сделайте модель для этих данных.
Передавайте всем заинтересованным окнам эту модель
и подписывайтесь в окнах на изменения этой модели.
Тогда если в одном окне поменяют score - все окна, которым надо, услышат событие и поменяют у себя
Нафига окнам знать друг о друге?


Последний раз редактировалось expl; 03.01.2011 в 00:39.
Старый 03.01.2011, 00:46
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 3  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Что-то мне кажется слишком заумное решение для простой задачи.

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

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

Старый 03.01.2011, 01:06
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

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

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


Последний раз редактировалось expl; 03.01.2011 в 01:10.
Старый 03.01.2011, 01:14
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 5  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
не совсем ))
я не предлагал раздавать модель окнам ))

Старый 03.01.2011, 14:01
Alexmody вне форума Посмотреть профиль Отправить личное сообщение для Alexmody Найти все сообщения от Alexmody
  № 6  
Ответить с цитированием
Alexmody

Регистрация: Dec 2010
Сообщений: 177
expl
>>если разным окнам нужны одни и те же данные - ну сделайте модель для этих данных.
>>Передавайте всем заинтересованным окнам эту модель

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

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

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

Старый 03.01.2011, 15:14
passertm вне форума Посмотреть профиль Отправить личное сообщение для passertm Найти все сообщения от passertm
  № 7  
Ответить с цитированием
passertm
 
Аватар для passertm

Регистрация: Aug 2006
Сообщений: 107
Думаю тут многое зависит от характера данных.

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

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

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


Последний раз редактировалось passertm; 03.01.2011 в 15:20.
Старый 03.01.2011, 15:15
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 8  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

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

Старый 03.01.2011, 17:13
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 9  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Ну это, если большинство окон нуждаются в одних и тех же обновляемых параметрах.
А если, к примеру делать магазин. В главном окне магазина отображается массив вещей, каждая из которых имеет набор своих характеристик. У главного окна магазина, также есть несколько подокон, которые обмениваются данными о вещах с главным окном.
Вот для тех, которые работают с одинаковыми данными и передаем одну модель,
которые с другими - другую

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

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

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


Последний раз редактировалось expl; 03.01.2011 в 17:16.
Старый 03.01.2011, 17:30
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 10  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Сишное прошлое не даёт нормально работать во флеше

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:43.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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