【问题标题】:How to implement simple tick-based engine in c++?如何在 C++ 中实现简单的基于刻度的引擎?
【发布时间】:2010-11-20 19:29:10
【问题描述】:

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

【问题讨论】:

  • 你所拥有的对我来说听起来不错。
  • 我过去曾使用过这种方法,效果很好,物有所值。
  • 已更新,在实施或阅读内容方面需要帮助。

标签: c++ mud


【解决方案1】:

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

【讨论】:

  • 嗯,这听起来对我来说非常复杂,我才刚刚开始,这是我的第一个编程项目
【解决方案2】:

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

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • ...并确保执行操作的时间不会超过您的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多