7

我正在写一个文本游戏,我需要一个简单的战斗系统,就像在 MUD 中一样,你发出命令,偶尔会发生“滴答”,当所有这些命令执行时,玩家和怪物会造成伤害,各种不同的东西发生。我如何实现这个概念?我考虑过创建一个保存最后滴答时间的变量,以及一个仅将事件放在堆栈上的函数,当那个时间是 (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?
     }
}
4

3 回答 3

3

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

于 2010-11-20T19:42:57.497 回答
2

据我所知,大多数这样的引擎都是基于事件的,而不是基于时间的。tick在最后一个结束后的某个时间间隔内触发了一个新的tick。(因此主要避免了ticks 花费比间隔更长的问题)

这也简化了实施;您只需有一个触发tick事件的游戏循环,然后sleeps/ yields 为所需的时间间隔。这是微不足道的。

ticks它可以通过将世界建模为一棵树来进一步简化,其中每个元素管理向其子级传播的事件(例如)。只要您避免/管理“循环”,就可以很好地工作(我已经做到了)。

这有效地将tick系统简化为这样的(伪代码):

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

在大多数情况下,没有什么需要比调整前一个持续时间的长度更花哨的了。

任何单个实体的动作都将成为它们自己的动作队列的一部分,并在它们自己的“滴答”事件期间进行处理。

通常用户命令会分为“游戏”和“元”命令,任何游戏只会修改他们角色的动作队列,在他们的下一个滴答中处理,就像任何其他实体一样。

简单的回合制战斗自然是以此为基础的。realtime 可以用更精细的ticks 划分来建模,并带有可选的“时间池”。

于 2013-08-29T00:33:40.850 回答
-1

使用每 x ms 执行一次的计时器(而 x 是您的滴答时间),执行该方法中放入堆栈的任何操作。

于 2010-11-20T19:32:29.640 回答