2009-05-21 3 views
2

Скажите, что вы строите игру в тетрис. Как любой правильный программист, у вас есть логика взгляда с одной стороны, и ваша бизнес-логика с другой стороны; вероятно, полный MVC продолжается.Тетрис и красивая графика

Когда модель отправляет update(), вид перерисовывает себя, как и ожидалось.

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

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

ответ

4

Лично я бы отделил рисование экрана как можно чаще, даже если обновление положения блока не было. Поэтому у меня бы был петля где-то с «обновление» и «визуализировать» часть. Обновление воспроизводит мяч по логике, которая выполняет или не обновляет позиции и/или удаление блока. Рендер играет мяч в графическую часть, которая рисует блоки, где они должны быть.

Теперь, если есть линии для стирания, логика знает и может отмечать те линии, которые нужно удалить. Я предполагаю здесь, что каждая часть состоит из 4 отдельных блоков, и любой из этих блоков является единственным объектом. Теперь, когда этот блок имеет набор «die» -flag, вы можете взять некоторые части рендеринга, чтобы уничтожить блок (скажем, 500 мс, чтобы взорваться). По истечении этого времени объект может быть удален, а блок, расположенный выше, падает. Почему 500 мс? Ну, вы должны обязательно использовать временное движение, так как это держит скорость игры одинаковой на разных компьютерах.

Кстати, есть уже так называемые игровые движки, которые предоставляют такой цикл обновления-рендеринга. Например, XNA, если вы идете по линии .NET. Вы также можете закодировать свой собственный движок, но будьте осторожны, это непростая задача, и это очень трудоемко. Я сделал это один раз и не ожидаю, что это будет двигатель, такой как Source Engine ;-)

2

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

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

1

Другим подходом было бы объединить класс MVC с чем-то вроде дифференциального исполнения - «представление» - это модель того, что представлено , но код чертежа сравнивает поток событий, создаваемый «представлением» с потоком из предыдущего рендеринга. Поэтому, если в одном потоке есть строка, а в следующем нет, код чертежа может анимировать разницу. Это позволяет абстрагироваться от просмотра. Часто «представление» в MVC представляет собой набор виджетов, а не как нечто, которое рисует напрямую, поэтому вы все равно входите в иерархические иерархии MVC: приложение представляет собой MVC (модель данных, объекты просмотра, контроллер приложения), где view имеет набор виджетов, каждый из которых представляет собой MVC (состояние виджета (например, нажатие кнопки), привязка стиля и привязки к инструменту, отображение событий инструментария -> состояние виджета).

1

Я часто задавался этим вопросом.

Моих собственных мыслей был по этой линии:

1) Вид задается состоянием блоков (формы, болтовня-болтовня), но с дополнительными «переходными» данными:

2) Тот факт, что строка должна быть удалена, кодируется в состоянии, НЕ вычисляется в представлении.

3) мнение умеет рисовать переходы прямо сейчас:

  • Без изменений: состояние такое же, для этого конкретного блока
  • Переход от «падения» в «заблокирован»: состояния «запертой в "(сбрасывающим блоком)
  • Изменить« заблокировано »на« удалить »: состояние« удалено »(по завершении линии)
  • Изменить« падение »на« удалить »: состояние« удалено », но старое состояние «падало»
1

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

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

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

Смежные вопросы