Как реализовать простой галочный двигатель в C ++?

StackOverflow https://stackoverflow.com/questions/4234551

  •  26-09-2019
  •  | 
  •  

Вопрос

Я пишу текстовую игру, и мне нужна простая боевая система, вроде в грязи, вы выпускаете команды, и время от времени «галочка» происходит, когда все эти команды выполняют, плееры и монстры наносят ущерб, все виды разных вещей случается Как мне реализовать эту концепцию? Я подумал о том, чтобы сделать переменную, которая содержит последнее время тика, и функция, которая просто помещает события на стек и когда это время (Time + 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?
     }
}
Это было полезно?

Решение

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

Другие советы

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

Это также упрощает реализацию; у вас просто есть игровая петля, которая вызывает tick Событие, то sleepс /yields для требуемого интервала. Который тривиальный.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top