MVC Game Design с объектами - PullRequest
2 голосов
/ 24 июня 2011

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

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

Ответы [ 3 ]

4 голосов
/ 24 июня 2011

MVC иногда может быть нелогичным, особенно когда вы впервые изучаете ОО и обнаруживаете, что использование метода «рисования» делает вещи такими организованными!

Вот краткий обзор одного из многих способов реализации MVC для вашей игры:

Модель:

  • «Коробка»: box_type, pos_x, pos_y
  • "BoxManager": список (Box)
  • "GameState": box_manager, player_manager, goal_manager, ...
  • "Перемещение": dx, dy

Контроллер:

  • «GameController»: check_valid_move (move), move_player (move), is_goal_state (), ...

Вид:

  • "Экран": render ()
  • "PlayerRenderer": render ()
  • "BoxRenderer": render_box (box), render_all_boxes ()

Обратите внимание, что модель полностью автономна и не ссылается на модули контроллера или представления. Это один из ключевых аспектов MVC. Контроллер принимает данные игрока и управляет глобальным состоянием игры. И представление смотрит на глобальное состояние игры и отображает экран.

Вам не нужно идти по этому пути, но этот вариант стоит понять и рассмотреть.

0 голосов
/ 04 июля 2012

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

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

В качестве примера я пишу приложение OpenGL, в котором модель содержитпростые нормализованные многоугольники и многогранники, с которыми приятно работать геометрически, но не удобно переходить на OpenGL.Когда представление получает событие, сообщающее, что модель изменилась (добавлена ​​или изменена форма), тогда представление преобразует эти многоугольники в денормализованные массивы вершин, которые можно передать в OpenGL.Это дорогостоящая операция, поэтому представление кэширует эти массивы в свою собственную коллекцию «того, что должно быть визуализировано», и при рендеринге просто перебирает эту «коллекцию представлений», передавая каждый массив в OpenGL.Таким образом, представление является единственным кодом, который знает об OpenGL, и является единственным кодом, который знает, как преобразовать состояние модели в структуры OpenGL.

0 голосов
/ 24 июня 2011

Рефакторинг вашего кода для соответствия MVC означал бы создание «представления» (как это представляло ваш экран, и у этого представления был бы (например) метод draw, который принял «модель» (объект python, содержащий все состояния блока) и визуализировал эту модель на экране.

Теперь, возможно, все, что сделал бы метод рисования для отображения на экране, - это вызов метода renderToScreen(screenView) для каждого объекта блока. Или вы можете изменить этот метод рисования в представлении, если хотите быть более «чистым».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...