如何在c ++中实现简单的基于tick的引擎?

时间:2010-11-20 19:29:11

标签: c++ mud

我正在写一个文字游戏,我需要一个简单的战斗系统,就像在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 个答案:

答案 0 :(得分:1)

简单动作堆栈的问题在于动作的顺序可能是基于时间的 - 无论何种类型最快的人都将获得第一击。您应该在堆栈中引入优先级,以便例如首先触发所有全局事件,然后触发生物的动作事件,但这些动作事件按敏捷或水平等属性排序。如果一个生物具有更高的敏捷性,那么它就会获得第一击。

答案 1 :(得分:1)

从我所看到的,大多数这样的引擎都是基于事件,而不是时间。在最后tick结束后的某个时间间隔内触发新的tick。 (因此主要避免tick花费的时间超过间隔)

这也简化了实施;你只需要一个触发tick事件的游戏循环,然后sleep s / yield s来获取所需的时间间隔。这是琐碎的

通过将世界建模为树,可以进一步简化它,其中每个元素管理传播事件(例如ticks)给他们的孩子。只要你避免/管理'循环',这就行得很好(我已经完成了)。

这有效地将tick系统简化为类似的东西(psudocode):

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

在大多数情况下,除了调整前一个持续时间的长度外,几乎不需要变得更加漂亮。

任何单个实体操作都将成为他们自己的操作队列的一部分,并在他们自己的“tick”事件中处理。

通常用户命令将被分为“游戏”和“元”命令,任何游戏都只会修改其角色的动作队列,在下一个刻度中进行处理,按照任何其他实体的正常情况进行处理。

简单的基于圆形的战斗从这个基础自然而然地发生。实时可以使用tick s的更精细划分建模,并可选择“时间池”。

答案 2 :(得分:-1)

使用每隔x ms执行一次的计时器(而x是你的ticktime),执行该方法中放在堆栈上的任何动作。