如何在C++中实现简单的基于Tick的引擎?

7
我正在编写一个文字游戏,需要一个简单的战斗系统,类似于MUD游戏,您可以输入命令,每隔一段时间会发生“tick”,当所有命令执行时,玩家和怪物会造成伤害,发生各种不同的事情。我该如何实现这个概念? 我考虑创建一个变量来保存上一个tick时间,并创建一个函数将事件放入堆栈中,当时间为(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?
     }
}

2
你所说的听起来不错。 - Peter Alexander
我过去曾经使用过这种方法,效果还不错。 - Stuart Golodetz
更新了,需要在实现上或阅读方面寻求帮助或指导。 - Dvole
3个回答

3
简单动作栈的问题在于,动作的顺序可能基于时间 - 打字速度最快的人会先打出第一击。因此,您应该在栈中引入优先级,例如首先触发所有全局事件,然后是生物的动作事件,但这些动作事件按某个属性(如敏捷或等级)排序。如果一个生物具有更高的敏捷性,那么它将先行动。

2
那听起来对我来说非常复杂,我刚开始学习编程,这是我的第一个编程项目。 - Dvole

2
据我所见,大多数此类引擎是基于事件而不是时间的。在上一个tick结束后一段时间内触发新的tick。(因此基本避免了tick花费的时间超过间隔的问题)
这也简化了实现过程;只需编写一个游戏循环来触发tick事件,然后sleep/yield等待所需的时间间隔。这是微不足道的。
通过将世界建模为一棵树,可以进一步简化,其中每个元素管理向其子元素传播事件(如ticks)。只要避免/管理“循环”,这种方法效果很好(我已经做到了)。
这有效地将tick系统简化为以下内容(伪代码):
while (isRunning) {
    world->tick();
    sleep(interval);
}

在大多数情况下,没有必要比调整先前持续时间的长度更繁琐。
任何单个实体的操作将成为它们自己的操作队列的一部分,并在它们自己的“滴答”事件期间进行处理。
通常,用户命令会被分为“游戏内”和“元数据”命令,任何游戏内的命令都只会修改他们角色的行动队列,以便在下一个滴答中处理,与任何其他实体一样正常。
简单的回合制战斗自然地基于这个基础。 实时可以通过更精细的滴答划分来建模,并带有可选的“时间池化”。

-1
使用一个定时器,每隔x毫秒(其中x是您的ticktime),在该方法中执行放置在堆栈上的任何操作。

1
请确保执行这些操作所需的时间不超过您的时钟周期长度。 - Stuart Golodetz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接