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



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



У меня есть класс Java, поэтому я бросил свои исследования/разработки на C++ и перешел на Java и JOGL (Java OpenGL). Это замечательно! Но это к делу не относится.



Я хочу сделать небольшую ролевую игру, но это вопрос действительно относится к любому виду игры. Как вы организуете игровые объекты таким образом, чтобы они были структурированы, как шаблон Model-View-Controller? Это похоже на удивительный шаблон, очень широко используемый и имеющий большой смысл, но у меня возникли проблемы с тем, как его реализовать.



например, мне нужно отслеживать объект GL для рисования на экране. У меня должны быть классы, которые реализуют MouseListener, MouseMotionListener, MouseWheelListener и KeyListener (или один класс, менеджер ввода "все-в-одном"). И я должен поместить свои игровые данные где-то, где все эти разные классы могут получить доступ и изменить его; если кто-то нажимает кнопку на клавиатуре, класс управления вводом должен каким-то образом выполнить действие, на которое отображается ключ; когда кадр должен быть нарисован, графический класс должен найти способ перебрать все разные "вещи" и нарисовать их все.



и моя самая большая проблема, графический интерфейс; где он связан со всем этим? Это что-то как и вход, но не совсем, и для этого нужно как установить, так и получить фрагменты данных из фактического игрового моделирования... И усложняет это еще больше, если я решу попробовать и добавить сеть, которая (аналогично GUI) также должна иметь доступ к большому количеству данных для изменения и чтения...



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



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



-Ricket



Edit: нашел хорошую диаграмму, которая может помочь мне понять все это... Источник: (осторожно, PS-файл!) http://www.tucs.fi/publications/attachment.php?fname=TR553.ps.gz



http://img10.imageshack.us/img10/6278/mvcdiagramgamesbl5.png



Edit2: мне также нравится объяснение этого парня о том, как он планировал свою игру MVC: http://interactivesection.wordpress.com/2007/11/19/dum-de-dum-drum-my-first-mvc-game-development/



Edit3: еще один великий статья!
http://dewitters.koonsolo.com/gamemvc.html

671   6  

6 ответов:

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

поместив все это в модель, сама игра теперь является агностиком UI. Его можно присоединить к текстовым интерфейсом в формате ASCII, таких как вредоносного игры, или команды пользовательского интерфейса линии сродни Зорк или веб-основе, или 3D-интерфейса. Некоторые из этих интерфейсов может быть в ужасном настроении в зависимости от игровой механики, но все они будут возможными.

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

Контроллер слой-это клей между ними. Он никогда не должен иметь никакой реальной игровой логики в нем, и он не должен отвечать за управление слоем представления. Вместо этого он должен переводить действия, выполняемые в слое представления (нажатие на кнопки, нажатие на области экрана, действия джойстика и т. д.), В действия, выполняемые на модели. Например, падение предмета, нападение на NPC, что угодно. Он также отвечает за сбор данных и выполнение любого преобразования или обработки, чтобы облегчить просмотр слой для его отображения.

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

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

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

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

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

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

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

для моего собственного 2D игрового движка я использовал стратегия картина довольно активно. Игровые объекты, такие как игрок и монстры, которых я назвал Спрайт. Я позволил рисунку спрайта обрабатываться шаблон стратегии. Вот тогда я и позвонил спрайт.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
};

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

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

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,скорость,ориентация и advance () в отдельный объект, называемый MotionState. Это так я могу постройте деревья поиска возможных положений и ориентаций при выполнении алгоритмов поиска пути. Тогда я не хочу носить с собой информацию о том, как вести себя каждое обновление или как спрайт должен быть нарисован.

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

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

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

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

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

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

мой образ мышления MVC - это MDUC
Модель
Дисплей
Контроллер пользовательского ввода

модель содержит объекты модели домена
На экране отображается текущее состояние и поведение объектов модели домена.
Контроллер пользовательского ввода обрабатывает все пользовательские входы.

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

Как только вы видите, что вы разделяете данные и операции модели от отображения, от входных данных пользователя, легче увидеть, где группировать то, что в вашем собственном коде.

Comments

    Ничего не найдено.