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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.09.2010, 23:41
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 161  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Так. Резюме:
1) пришли данные. Например, враг сделал свой ход и новые координаты врага. Пришли они в коннектор, коннектор их переваривает.
2) После этого коннектор дёргает метод у главного контроллера. Тут логичен вопрос, в каком виде он это делает? На каждый тип действия свой метод (типа атаковали - один метод, написали в чат - другой, пошел дождь - третий)?
3) В главном контроллере испускается событие, что враг походил. Событие содержит новые координаты врага.
4) Контроллер врага, который имеет ссылку на главный контроллер слушал это событие и переместился.
5) Враг нанёс удар, контроллеру надо отправить это на сервер. Он используя ссылку на главный контроллер вызывает у него метод call с необходимыми параметрами. (когда я говорил "напрямую вызываю метод у главного контроллера, он дёргает коннектор" я имел ввиду что вызываю метод подобный call, где описываю всё что я хочу отослать).

Поправь пожалуйста, где на этот раз ошибся. И спасибо большое за помощь)

Старый 28.09.2010, 12:22
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 162  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
1) Коннектор без понятия, что конкретно пришло, он распознает это всё как команду и только;
2) Вызывает moveEnemy(id, x, y), точнее (this._client[command.name] as Function).apply(this._client, command /* Command extends Array */);
3) Нет, событие идет new CommandEvent('command_' + command.name, ..., command). Его на самом деле отправляет коннектор после вызова команды у client, а контроллер тупо редиректит;
4) У врага контроллера нет, есть модель EnemyData, у неё тупо метод moveTo(x, y), его вызывает либо основной контроллер, либо дочерний, скажем, боевки;
5) Удары наносит сервер. Действия же игрока отправляются через основной контроллер, используя его метод call. Внутри call пришедшие аргументы перенаправляются в коннектор для отправки в виде команды на сервер.

Старый 28.09.2010, 12:48
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 163  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Ага, резюме 2.0:
1) Коннектору приходит пакет. Он видит, что это команда, отделяет имя команды от её аргументов, создаёт экземпляр класса Command. В _client он хранит ссылку на главный контроллер. У главного контроллера открыты методы для коннектора, имя метода совпадает с именем команды (или зная команду можно узнать имя метода).
2) Коннектор дёргает метод, сопоставленной этой команде у контроллера.
3) Коннектор испускает событие CommandEvent, которое главный контроллер редиспатчит, чтобы его поймали все кто хотят.
4) Понятно, а в случае чего-то мелкого, что требует взаимодействия с сервером, но содержащее контроллер - что слушает главный контроллер? Модель или контроллер? В каких случаях всё-таки слушает, а в каких контроллер старший вызывает методы напрямую?
5) Любой объект, который хочет общаться с сервером ловит ссылку на главный контроллер и дёргает его метод call.

У меня вопрос по пункту 2-3: зачем дёргать сначала метод у клиента, а потом слать через него событие? По сути можно обойтись одним событием, который главный контроллер схватит первым. Можно одним вызовом у клиента - клиент сам сделает событие.

Старый 28.09.2010, 12:55
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 164  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
4) Ничего не слушает, ему по барабану в таком случае. Младший контроллер подпишется на конкретное событие CommandEvent и работает с пришедшим событием;
5) Только младшие контроллеры.

Событие не через метод шлется, а следующей строкой после вызова метода, в коннекторе.

Старый 28.09.2010, 13:02
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 165  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Цитата:
Событие не через метод шлется, а следующей строкой после вызова метода, в коннекторе.
Это я понял, но не понял зачем слать и событие и дёргать метод. В принципе можно обойтись или событием (контроллер схватит событие и сэмулирует запуск этого метода) или одним лишь вызовом метода (контроллер сам сделает событие). Зачем такое разделение? Я так понял что главный контроллер должен что-то сделать, а потом должны сделать все детишки, поэтому вот так. Но не понятна такая реализация;

4) Нет, плохо выразился:
Цитата:
Понятно, а в случае чего-то мелкого, что требует взаимодействия с сервером, но содержащее контроллер - что слушает главный контроллер? Модель или контроллер?
Я хотел спросить КТО слушает главный контроллер, т.е. кто подписывается на CommandEvent у главного контроллера - модель или младший контроллер. Но в твоём комментарии уже есть ответ, спасибо.

5) Хм, но чтобы передать в младшие контроллеры ссылку на главный - придется эту ссылку тянуть через промежуточные. Если связь с сервером нужна промежуточному контроллеру - можно ли ему воспользоваться этой ссылкой для связи с сервером или нужно отдавать это более мелким контроллерам? Что делать, если это проблемно или это совсем не задача мелких контроллеров?

Старый 28.09.2010, 13:07
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 166  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Это я понял, но не понял зачем слать и событие и дёргать метод. В принципе можно обойтись или событием (контроллер схватит событие и сэмулирует запуск этого метода) или одним лишь вызовом метода (контроллер сам сделает событие). Зачем такое разделение? Я так понял что главный контроллер должен что-то сделать, а потом должны сделать все детишки, поэтому вот так. Но не понятна такая реализация;
Для удобства, исключительно.

Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Я хотел спросить КТО слушает главный контроллер, т.е. кто подписывается на CommandEvent у главного контроллера - модель или младший контроллер. Но в твоём комментарии уже есть ответ, спасибо.
Модель вообще ни на какие чужие события не подписывается, в лучшем случае на события дочерних элементов.

Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
5) Хм, но чтобы передать в младшие контроллеры ссылку на главный - придется эту ссылку тянуть через промежуточные. Если связь с сервером нужна промежуточному контроллеру - можно ли ему воспользоваться этой ссылкой для связи с сервером или нужно отдавать это более мелким контроллерам? Что делать, если это проблемно или это совсем не задача мелких контроллеров?
Да пусть передают более младшим, не криминал. Для них это будет базовый контроллер, а кто его им дал — они не знают.

Старый 28.09.2010, 13:47
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 167  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Спасибо большое, теперь всё стало понятно.
Только момент ещё в тумане - я правильно понял что call могут дёргать любые дочерние контроллеры по отношению к главному, но всё таки предпочтительнее если это будут крайне-младшие?

Старый 28.09.2010, 13:50
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 168  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Спасибо большое, теперь всё стало понятно.
Только момент ещё в тумане - я правильно понял что call могут дёргать любые дочерние контроллеры по отношению к главному, но всё таки предпочтительнее если это будут крайне-младшие?
Любые. На самом деле более одной вложенности контроллеров очень редко бывает. Например общее окно информации персонажа и его рюкзак. Есть контроллер всего окна, плюс два дочерних (хотя таковыми они не являются, т. к. могут работать и отдельно) — рюкзака и инфы. При желании основной контроллер может создать окно только с рюкзаком и подсунуть туда все тот же контроллер рюкзака.

Старый 28.09.2010, 13:56
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 169  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Ну почему же, базовый контроллер - контроллер игры, контроллер окна персонажа, в нём контроллер окна статов. =)

Спасибо большое, информация бесценна )

Старый 02.10.2010, 21:29
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 170  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Волей судьбы пишу клиент под игру, серверная часть которого уже написана (недобросовестный кодер пропал, предоставив половину исходников весьма низкого качества - взялся писать клиент с 0).
Соответственно возник такой вопрос:
1) Как таковых команд сервер не присылает. Он присылает какие-то идентификаторы, которые позволят идентифицировать, что же сервер хотел сказать. Соответственно клиентом главный контроллер назвать сложно - коннектор создаёт событие и дёргает метод onServerData главного контроллера и передаёт ему событие, которое главный контроллер и отдиспатчит. Это событие слушают дочерние контроллеры и при получении такового они определяют, им ли это сообщение адресовано. В итоге один из контроллеров признает его своим и парсит, остальные после раздумий игнорируют.

Правильно ли я понял теорию и применил на практике в моём конкретном случае?

Реализуя таким способом я не чувствую себя плохо из за того, что коннектор не дёргает методы клиента по каждому событию. Даже наоборот: мне кажется что на каждую команду от сервера излишне было бы создавать метод в главном контроллере - большая часть из них уйдёт дочерним (они получат его с события), остальная часть, которая должна дёрнуть метод клиента - как я понимаю, для управления элементами у которых нет контроллера (вроде примера с врагом). По моим соображениям таких элементов в игре скорее всего совсем не много, поэтому встают логичные вопросы:

2) Коннектор в любом случае дёрнет метод клиента (речь не про CommandEvent, а про вызов метода у клиента до), при любой команде от сервера, или же только в строго-определенных? Если главный контроллер ничего не должен делать - в таком случае: делается пустой метод, вызов обрамляется в try..catch или же у коннектора есть конкретные мозги чтобы понимать, на что нужно дёргать метод клиента, а на что ненужно?

3) В случае, если коннектор всегда дёргает метод клиента... то объясните, пожалуйста, почему. По мне если обработкой займутся дочерние контроллеры, то главному, в принципе, вмешиваться и не стоит.

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

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

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


 


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


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