我正在写一个文字游戏,我需要一个简单的战斗系统,就像在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?
}
}
答案 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),执行该方法中放在堆栈上的任何动作。