Из того, что я видел, большинство таких движков основаны на событиях, а не на времени. с новым tick
, запускаемым через некоторый интервал после окончания последнего tick
. (таким образом, в основном избегая вопроса, что tick
s занимает больше времени, чем интервал)
Это также упрощает реализацию; у вас просто есть игровой цикл, который запускает событие tick
, а затем sleep
s / yield
s в течение требуемого интервала. Что тривиально .
Это может быть дополнительно упрощено путем моделирования мира в виде дерева, где каждый элемент управляет распространяющимися событиями (такими как ticks
) для своих детей. пока вы избегаете / управляете «петлями», это работает хорошо (я это сделал).
Это эффективно уменьшает систему tick
до чего-то подобного (псевдокод):
while (isRunning) {
world->tick();
sleep(interval);
}
В большинстве случаев мало что нужно для того, чтобы стать намного более изящным, чем корректировка продолжительности предыдущей продолжительности.
Любые действия отдельных сущностей будут частью их собственной очереди действий и обрабатываются во время их собственных событий "галочки".
Обычно пользовательские команды делятся на команды «внутриигровые» и «мета», все, что в игре, просто изменяет очередь действий их персонажа, чтобы обрабатываться на следующем такте, как обычно для любой другой сущности.
Простые раундовые бои естественным образом вытекают из этого основания. реальное время может быть смоделировано с более точным делением tick
с, с необязательным «объединением времени».