Как реализовать простой тиковый движок в c ++? - PullRequest
6 голосов
/ 20 ноября 2010

Я пишу текстовую игру, и мне нужна простая боевая система, как в MUD, вы выдаете команды, и время от времени происходит «галочка», когда все эти команды выполняются, игрок и монстры наносят урон, всеразных вещей бывает.Как мне реализовать эту концепцию?Я думал о создании переменной, которая содержит время последнего тика, и функции, которая просто помещает события в стек, а когда это время (время + x), выполняет их все одновременно.Есть ли более простой или чистый вариант сделать это?

Какой будет возможный синтаксис для этого?

double lastTickTime;
double currentTime;

void eventsPile(int event, int target)
{
// how do i implement stack of events? And send them to execute() when time is up?
}

void execute(int event, int target)
{
     if ((currentTime - lastTickTime) == 2)
     {
         eventsHandler(event, target);
     }    
     else 
     { // How do I put events on stack?
     }
}

Ответы [ 3 ]

1 голос
/ 20 ноября 2010

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

1 голос
/ 29 августа 2013

Из того, что я видел, большинство таких движков основаны на событиях, а не на времени. с новым tick, запускаемым через некоторый интервал после окончания последнего tick. (таким образом, в основном избегая вопроса, что tick s занимает больше времени, чем интервал)

Это также упрощает реализацию; у вас просто есть игровой цикл, который запускает событие tick, а затем sleep s / yield s в течение требуемого интервала. Что тривиально .

Это может быть дополнительно упрощено путем моделирования мира в виде дерева, где каждый элемент управляет распространяющимися событиями (такими как ticks) для своих детей. пока вы избегаете / управляете «петлями», это работает хорошо (я это сделал).

Это эффективно уменьшает систему tick до чего-то подобного (псевдокод):

while (isRunning) {
    world->tick();
    sleep(interval);
}

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

Любые действия отдельных сущностей будут частью их собственной очереди действий и обрабатываются во время их собственных событий "галочки".

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

Простые раундовые бои естественным образом вытекают из этого основания. реальное время может быть смоделировано с более точным делением tick с, с необязательным «объединением времени».

0 голосов
/ 20 ноября 2010

Используйте таймер, выполняющий каждые x мс (тогда как x - ваше время тика), выполняйте любые действия, помещенные в стек в этом методе.

...