Как можно организовать код для игры для установки шаблону MVC?

То, что я бы сделал в этом случае, возможно, не совсем стандартно, но вот вы:

  1. Разделить строку на тройные кавычки:

    .split('```')
    
  2. [ 119]

    Возьмите кусочки попарно. Первая часть - нормальная уценка, вторая - фрагмент кода.

    .each_slice(2)
    
  3. Добавьте маркеры перед # в первом фрагменте, а не во втором. Обратите внимание, что в последнем срезе кусок MD равен нулю.

    .map { |txt, code = nil| [txt.gsub('#', "\x00#"), code].compact }
    
  4. Присоединиться

    .flatten.join('```')
    
  5. Разделить по маркеру

    .split("\x00")
    

Байт ' 0 'не ожидается в вашем тексте, если он у вас есть, просто используйте другой маркер, например длинную случайную строку без каких-либо # , которые вы генерируете при запуске процесса.

71
задан Pramod More 31 May 2018 в 05:24
поделиться

5 ответов

Это могло бы помочь Вам думать о Модели как своего рода игра API. Что была бы уменьшена Ваша игра, к тому, если бы не было никакого UI вообще для игры, назначенной с начала? Вы упоминаете, что то, что Вы имеете в виду, является RPG, так в этом случае можно предположить иметь персонажа, его материально-технические ресурсы, написания, способности, NPCs и даже вещи как карта и сражаться, управляет весь являющийся частью модели. Это похоже на правила и части Монополии без специфических особенностей того, как дисплеи финальной игры это или как пользователь собирается взаимодействовать с ним. Это похоже на Quake как на абстрактный набор 3D объектов, перемещающихся через уровень с вещами как пересечение и вычисленная коллизия, но никакой рендеринг, тени или звуковые эффекты.

Путем помещения всех тех, которые в модель, сама игра является теперь агностиком UI. Это могло быть сцеплено с интерфейсом текста ASCII как игры Жулика, имеют, или командная строка UI, сродни Zork или веб-, или 3D UI. Некоторые из тех UIs могли бы быть ужасным соответствием в зависимости от игровой механики, но они все будут возможны.

уровень View является зависимым слоем UI. Это отражает определенный выбор UI, с которым Вы пошли и будете очень выделены той технологии. Это могло бы быть ответственно за чтение состояния модели и рисования его в 3D, ASCII, или изображениях и HTML для веб-страницы. Это также ответственно за отображение любых механизмов управления, которые игрок должен использовать для взаимодействия с игрой.

уровень Controller является связующим звеном между двумя. Это никогда не должно иметь ни одной фактической игровой логики в нем, и при этом это не должно быть ответственно за управление уровнем View. Вместо этого это должно перевести меры, принятые в уровне View (нажимающий на кнопки, нажав на области экрана, действий джойстика, безотносительно) в действия, взятые модель. Например, отбрасывая объект, нападая на NPC, безотносительно. Это также ответственно за то, что собрало данные и сделало любое преобразование или обработало, чтобы помочь уровню View отобразить его.

Теперь, способ, которым я описал это выше, состоит в том, как будто существует очень отличная последовательность события, управляющая игрой, которая, вероятно, только действительно подходит для веб-игры. Поэтому это - то, на чем я провел свое время в последнее время. В игре, которая не управляется запросом пользователя и ответом сервера как сеть (например, игра, работающая на машине пользователя), Вы, вероятно, хотели бы удостовериться, что уровень Model реализовал шаблон The Observer хорошо. Например, если действия происходят в Модели, потому что время является передающим затем, Вы не могли бы хотеть иметь уровень View, постоянно опрашивающий Модель относительно обновлений. Вместо этого при помощи шаблона The Observer Модель могла уведомить любых наблюдателей изменений в Объектах модели, как они происходят. Это могло в свою очередь использоваться, чтобы запросить незамедлительное обновление до Представления отражать изменение.

Затем, если передача 60 секунд привела к некоторым восстановлениям, происходящим для базы игрока, основа могла произвести восстановления и сразу уведомить любых Наблюдателей, присоединенных к ней, что основа обновила. Представление могло быть присоединено как Наблюдатель и отметить, что должно вновь отобразить основу, потому что ее состояние изменилось. Само уведомление, возможно, включало достаточно информации для обновления Представления, или этому, возможно, придется обернуться и консультироваться с моделью для обновления, но результатом будет то же.

56
ответ дан John Munsch 24 November 2019 в 13:07
поделиться

Вы проживаете там. в основном спросите себя вопрос, "который изменил бы код, если бы я должен был изменить некоторую часть программы?"

, Если это изменило бы путь, это смотрит, не изменяя основные данные, затем это находится в представлении. Если это - данные, которые могли бы быть просмотрены во многих отношениях, это - модель. И если это - как Вы играете, затем это - управление.

Поэтому, если это - достаете ли Вы "топор" с двумя блейдами или один, это - представление. Если это - сколько повреждения очков жизни Вы причиняете с топором, это - модель. И если это - размахиваете ли Вы топором путем ввода "s" или путем щелчка правой кнопкой, это - управление.

19
ответ дан Charlie Martin 24 November 2019 в 13:07
поделиться

Я чувствую с Вами, я помню, когда я сначала обнаружил MVC, я пытался переполнить все в него. Я действительно делал игру, которая использовала шаблон MVC. Что я нашел позже, хотя был то, что то, что я сделал, было излишеством. Я пытался соответствовать в значительной степени каждому классу, который я превратил в одну категорию в MVC.

то, Что я предлагаю, должно прочитать "Шаблоны разработки" банды четыре. Существует много полезных шаблонов помимо MVC. Иногда не имеет никакого смысла использовать MVC вообще. Специально для игр я не уверен, является ли MVC такой хорошей идеей. Так как причина - это, Вы не хотите отображаться, игровой объект по-разному (просматривает), но Вы хотите снова использовать код для прорисовки для многих различных типов игровых объектов.

Для моего собственного 2D игрового механизма я использовал шаблон стратегии вполне активно. Игровые объекты, как игрок и монстры я звонил Sprite. Я позволяю рисунку спрайта быть обработанным стратегическая модель . Это - когда я звонил sprite.draw () , я сделаю что-то вроде этого:

class Sprite {
  void draw() {
    this.view.draw(this.currentPosition, this.currentOrientation);
  }

  Point  currentPosition;    // Current position of this sprite
  double currentOrientation; // Facing angle of sprite
};

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

Так поведение я также использовал бы стратегическую модель, которая будет объектом, который содержит код, описывающий поведение. Тем путем я могу применить то же поведение к нескольким монстрам в другом местоположении. Так каждый кадр я звонил бы обновление () функция для обновления ориентации положения и что делает монстр.

class Sprite {
  void setUpdateAction(Action action) {
    this.updateAction = action;
  }

  void update(double start_time, double delta_time)
  {
    this.prevPosition = position();  
    advance(delta_time); // Advance to next position based on current speed and orientation

    this.updateAction.execute(this, start_time, delta_time);
  }

  Action updateAction;
};

существуют загрузки изменений этого. В моей текущей реализации я даже выделил currentPosition, скорость , ориентация и усовершенствование () в отдельный объект, названный MotionState. Это так, я могу создать деревья поиска возможных положений и ориентаций при выполнении алгоритмов поиска пути. Затем я не хочу хранить со мной информацию о том, как вести себя каждое обновление или как спрайт должен быть оттянут.

8
ответ дан Erik Engheim 24 November 2019 в 13:07
поделиться

Понятие MVC централизации логики взаимодействия с пользователем является хорошей моделью для разработки игр.

я сделал немного работы с разработкой флеш-игры. Здесь статья о пулах объектов в Flash. Понятие является межплатформенным и может дать Вам некоторое представление.

Вы правы быть обеспокоенными всем материалом, продолжающимся когда-то. В зависимости от Вашего игрового дизайна Ваш игровой цикл может иметь много для контакта с. Это - то, где Вы изучите все грязные приемы оптимизации, часто твердый путь :)

существует много способов организовать Ваш код - одна опция могла бы состоять в том, чтобы записать класс GameManager как Singleton. Все игровые объекты скрепляют к нему для административного взаимодействия и взаимодействия с пользователем. GameManager обрабатывает весь ввод данных пользователем и отправляет сообщения его пулу объектов. Можно использовать интерфейсы для определения общих коммуникационных шаблонов между игровыми объектами и GameManager.

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

2
ответ дан Dave Swersky 24 November 2019 в 13:07
поделиться

Все Ваши слушатели и обработчики должны войти в Класс контроллера, состояние объектов на экране (например, положение, цвет, и т.д.) должно быть частью Ваших Образцовых классов и безотносительно кода, который тянет вещи на экране, будет часть Представления.

1
ответ дан Rocket Surgeon 24 November 2019 в 13:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: