![]() |
KumoKairo Спасибо! я её как раз и читаю, мне очень нравится стиль, которым описывают все шаблоны.
|
Цитата:
Цитата:
Кто ещё из нас советует "толстый контроллер" ? |
Цитата:
"Засунуть всю логику" было бы рассчитать полет пули и ее попадание в противника прямо во Вью (где есть все координаты), а для Модели посылать только событие "враг получил пулю, проверьте как он там". "Вытащить всю логику" означает каждый пиксель полета пули брать из Модели, и каждый кадр предсмертных судорог, и каждый кадр процесса перезарядки (ну, а что еще такое "таймер в модели", по-вашему?) Вам то не кажется, что Вы пихаете Вью в Модель? Весь вопрос стоит на том, что именно считать данными. Есть ли какие-то данные в том, что юзер нажал курок во время перезарядки? Зачем это Модели? Это вопрос чисто интерфейса игры с пользователем. Зачем Модели подтверждать выстрел? Вью не справится с тем, стрелять или нет, на основании данных (из Модели!) о количестве патронов в обойме и текущего состояния анимации дробовика? (готов к выстрелу/не готов)? Зачем конкретно Модели знать, готов к выстрелу дробовик или нет? На какие данные/логику это может повлиять, кроме как "реагировать на событие ЮзерНажал, или нет, если вдруг это событие придет"? Так вот придет ли событие, это вопрос интерфейса, то есть Вью. Добавлено через 35 минут Цитата:
Контроллер является ключевой фигурой в парадигме MVC. Вот только не потому, что является мозгом приложения. А потому, что именно он обеспечивает суть концепции MVC — разделение данных и отображения. Не будь контроллера, мы бы писали модель для конкретной вью и вью для конкретной модели. Только и всего. Контроллер призван собрать в себе всю эту конкретику. Он знает язык Вью и знает язык Модели. И "язык" здесь не просто как перевести слово. Он переводит СМЫСЛ, потому что смыслы для Вью и для Модели разные. Контроллер должен понимать смысл событий Вью для Модели. Иначе все вью будут вынуждены изначально писаться для этой конкретной модели, а модель — понимать, что ей делать при "юзер нажал клавишу Р". |
Да, наш с вами разговор ни к чему не приведёт, пока мы обсуждаем реализацию некоторой абстрактной, не оговорённой конкретно задачи. Вы представляете её по своему, я по своему. Меня только задело, что вы не сильно придерживаетесь концепций MVC (как мне показалось):
Как-бы там ни было, я читал книжки и с пятого и с десятого параграфа. Но основные советы и доводы которые приводил - были получены мною из личного, практического опыта. Конечно могу в чём-то ошибаться, поправьте. Автору бы я посоветовал прислушаться ко всем, но выводы сделать самостоятельно. Цитата:
В одном из сообщений в начале, я описывал, как модель (М) - вполне имеет внутреннюю логику, описывающую её базовое поведение, или "правила игры", или "общие законы игры". Сюда входят все просчёты столкновений, нанесение урона, лечение, перезарядка дробовиков и все прочие общие элементы. Контроллер верхнего уровня (С) - занимается тем, что влияет на эту модель. Он помещает туда новые дробовики, нажимает курки, добавляет мобов. пс. При этом, никаких толстых контроллеров или классов с сотней-две свойств - не наблюдается. Каждый элемент, будь то модель дробовика, контроллер игрока, модель игрока - работает только в своей области юрисдикции. Каждый элемент - выполняет строго отведённую ему задачу. На деле это окола 200 - 300 строк кода на класс. Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Как параметр для определения частоты автоматической стрельбы, при зажатой клавише, когда второй и последующие события "выстрел" происходят не от нажатия юзером клавиши, а пока он не отпустит нажатую клавишу. Ну, отлично. Посылаем события "выстрел" с нужной частотой. Модель их получает и проверяет кого убили. И меняет кол-во патронов. А время то между выстрелами ей зачем считать и сообщать об этом Вью??? Что это за данные такие? Событие "выстрел" это команда от юзера. Это никак не результат размышлений Модели. Цитата:
Цитата:
Цитата:
|
Такой маленький дробовичек, а сколько текста из-за него! Наверное удачный пример подобрал для холивара ;)
@Wolsh Сейчас объясню зачем данные о дробовике пихать в логику. Напомню с чего все началось: Цитата:
Так вот, если таким макаром реализовать стрельбу, тогда игрок нажмет кнопку один раз и будет ожыдать, что стрельба не будет прекращаться до тех пор, пока он эту кнопку не отпустит или пока не закончились патроны. И выброс отстреляной гильзы/подача следующего патрона и перезарядка магазина - тоже части однокнопочного действия "СТРЕЛЬБА". По этому для логики процесса будут важны и скорострельность и количество патронов в магазине и их количество в кармане, а может и еще какие нибудь данные... А в остальном Вы заставили меня задуматься... Да и не меня одного, я уверен! Благодарю за умственную пищу. Буду размышлять. |
А это я о чем?
Цитата:
Еще раз, конспективно. Вы считаете, что выстрел должна инициировать Модель, я — что Вью. В Вашем случае необходимо пихать в Модель точное время анимации выстрела. То есть для такой Модели нужна СПЕЦИАЛЬНАЯ Вью, в которой анимация выстрела занимает точно такое время, которое установлено в Модели. Теоретически, наверное можно научить вью растягивать и сжимать анимацию в соответствии с требуемым временем. Это Вы, конечно, не сочтете "логикой, которую пихают во вью". А логику "интерфейс сам решает, когда в нем произошло событие", Вы принять ну никак не можете?))) Удачи же. |
Я как-то не совсем уловил суть дискуссии. Или таки речь идет об этом?
Нужно вынести стрельбу, в отдельную реализацию MVC. ТС убедил всех, что стрельба - достаточно сложный процесс сам по себе с одной стороны (и это так, и речь может идти не только о стрельбе), с другой стороны, как справедливо заметили другие участники, он он не должен требовать каких-то сверх усилий по обслуживанию, не должен впиливаться в общую канву настолько, что потом не выпилишь). С третьей стороны )), хотелось бы все-таки как-то унифицировать его, подсовывя разные параметры в какую-то более менее общую реализацию. Представляется такой алгоритм: юзер взял оружие, создается MVC для стрельбы: модель заполняется данными о боезапасе и пр., вью отрисовыает собственно дробовик (или что там для стрельбы у нас?), ожидает "пли" от юзера, и готов отрисовать перезарядку, пламя и полет, котнтроллер их пасет и отсылает нужные для общей логики игры события в "главный MVC": боезапас уменьшился... пуля летит там-то... и т.п. Существует это все пока юзер не бросит дробовик и не возьмется, например, за ложку, чтобы пообедать. Прием пищи - тоже сложный процесс. Тогда вступает в действие "MVC приема пищи" и т.п. Т.е. детализация процесса (стрельбы) выносится из общей логики в отдельны модуль, подпрограмму, если хотите. Тем самым, мы сможем предоставить кучу реализаций процесса (стрельбы) без изменений в мэйн-классах, у которых как бы и так забот своих есть. В то же время, мы имеем простор в плане самой реализации, MVC-же. То же самое можно сказать и по всевозможным диалогам. |
Алекс, тут проблема в том, что и при организации "дробовик это отдельное MVC дробовика" (что само собой правильно) вопрос синхронизации никуда не пропадает. Если, конечно, MVC дробовика это MVC.
Заявленная сложность в том, что на анимацию выстрела требуется время. Если выстрел инициируется из модели на основании ее данных о скорострельности оружия, то Вью придется рисовать четко под эту конкретную модель, либо проставить в Модели данные, взятые на основании анимации во Вью. Такой MVC попахивает не MVC, а вероятность рассинхронизации из-за фпс остается в деле. Ну, я попытался предложить MVC решение, заключающееся в том, что события интерфейса (выстрел) посылается интерфейсом (то есть Вью) — в соответствии с его собственным циклом анимации. Это же собственное событие Вью. Однако тут есть неприятность, что числовые данные в модели о скорострельности, как харастериктика оружия для показа и сравнения, так и остаются зависимыми от анимации во Вью. |
Цитата:
|
| Часовой пояс GMT +4, время: 04:56. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.