Задержки по времени и модель просмотра контроллера - PullRequest
3 голосов
/ 11 июля 2010

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

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

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

Если бы вы выбрали второй подход, как бы вы препятствовали тому, чтобы симуляция работала слишком далеко впереди вида, поставили бы вы представление в команду возобновления симуляции после окончания движения?

Заранее спасибо, Xtapodi.

Ответы [ 2 ]

2 голосов
/ 11 июля 2010

Ах, еще один пример, который напоминает нам, что MVC никогда не был изначально разработан для графики в реальном времени. ;)

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

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

0 голосов
/ 11 июля 2010

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

unitsPerSecond = totalUnits / (framesPerSecond * totalSeconds)

Так что, если я хочу переместить изображение из положения 0 в положение 60 в2 секунды, и моя частота кадров составляет 30, мне нужно переместить 60 единиц в 60 кадрах, следовательно, моя скорость равна 1. Таким образом, каждый кадр, я перемещаю единицу изображения 1, и если перемещение единицы уводит меня за пределы моей цели, просто установите мойместоположение к месту назначения.

...