Спасибо, очень доходчиво.
Цитата:
А вот насчет множества Моделей это перебор. Ну, или они могут быть как части одной Модели: ты можешь считать что твой Character это CharacterModel, смысл от этого не очень поменяется, разве что возникнет вопрос "а как быть с CharacterController? Что он должен делать?" )) При разделениях Моделей на множество важно осознавать, насколько они зависимы друг от друга всмысле обмена данными. В режиме поединка тебе постоянно надо иметь данные о персонаже и оппоненте "вместе", да еще и об их аммуниции; а вот глобальное меню игры здесь вроде как совсем не при делах — оно может быть отдельной триадой, так как его данные абсолютно обособлены.
|
Вот я как раз поэтому и спрашивал выше, насколько жёстким является требование создавать полную триаду MVC на каждый из элементов общей конструкции. Я как рассуждал. Добавляем класс GameModel - такой "стол", на котором считаем всю игровую логику. Но при этом если в классе Character "живут" и обновляются по некоторым установленным правилам значимые для механики и одновременно отображаемые для игрока свойства, то зачем мне их тянуть в GameModel, если я могу посчитать их прямо в классе Character и там же создать событие, которое подхватит CharacterView, чтобы отразить изменения, произошедшие именно с этим персонажем. Получается, игрок, взаимодействуя с GameView, выбрал, чего делать. Контроллер это принял и послал команду в GameModel, а Game Model обновилась сама, плюс обновила экземпляры Character для героя и врага. Все трое отправили события, чего показать. Вроде, нормальная схема, как мне кажется. Один главный контроллер, плюс по отдельной Model и View для "стола" и персонажей.
Цитата:
В MVC нет такой категории "data". Данные бегают туда-сюда постоянно.
|
Да, тут всё понятно, закрыли тему :) Дату отправляем храниться в XML или "статические" классы, откуда будем по необходимости вытягивать.
Ещё с позволения несколько вопросов. Я пока единственное, что реально написал из будущей MVC - это все три класса со ссылками друг на друга "по классике", плюс в Model создал метод setup, который рассчитывает стартовые значения свойств и т.п. Хотел сделать примерно то же самое с GameView, но возник вопрос. Опять на счёт иерархии отображения :). В методе View.setup я хотел сразу создать основные экранные объекты, начиная с моей любимой области для вывода текста. Для этого изготовил новый класс MainTextArea, расширяющий Sprite - контейнер. Внутрь воткнул простенький прямоугольник (в дальнейшем будет окно с "красивой" рамкой), а поверх него в том же контейнере - объект TetxField для вывода собственно текста. GameView добавил его в список отображения, на экране окно появилось, слава аллаху. Решил сразу попрактиковаться и написать метод, который по получении соответствующего события от Модели будет выводить текст. Вот тут началась фигня. Ибо записать напрямую MainTextArea.text я не могу, т.к. это Sprite. Делать область вывода как "голый" TextField совсем без контейнера как-то тоже не хочется - мало ли чего в ней ещё потребуется наворотить... Прикинул вариант написать собственный метод для GameView, получающий по событию текст, чтобы потом "отправить" его в MainTextArea...
И тут мне пришло в голову красивое в своей простоте решение. А может быть пусть сам экземпляр MainTextArea слушает события от модели и выводит текст, который его попросят? Плюс в том, что во-первых, мы сокращаем длину канала взаимодействия, т.к. данные от модели не нужно будет "протаскивать" через главный Вью, а во-вторых, планируемые функции подпадают под ответственность класса MainTextArea - выводить тексты. При этом, замечу, поскольку экземпляр MainTextArea - это креатура GameView, значит последний при необходимости может изменить или удалить его, т.е. иерархия не нарушается. Корректное это решение или всё-таки иерархия нарушается? Прокомментируйте, пожалуйста.
И второе. Во всех примерах MVC, которые я видел, весь код модели был помещён непосредственно в класс Model. В результате даже для простеньких игрушек в нём набиралось прилично разных функций. А если проект будет покрупнее, то там будет просто "мясо"... Верно я понимаю, что "главная" модель должна выглядеть как такой распределитель обязанностей, который получает команды от контроллера и "раздаёт" их разным специализированным классам для выполнения конкретных вычислений?