题
我正在写一个文字游戏,我需要一个简单的战斗系统,就像在泥浆,你发出命令,一旦在一段时间“滴答”发生的时候,那些命令执行,玩家和怪物造成伤害,各种不同的事情发生。如何实现这个概念? 我想过做保存最后一跳时间的变量和函数,堆栈只是把事件,并在那个时候(时间+ x)的所有simutaniously执行它们。有没有更简单或清洁剂变种这样做呢?
什么是为可能的语法?
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?
}
}
解决方案
用简单的动作栈的问题是动作的顺序可能是基于时间的 - 谁类型最快将罢工第一击。你或许应该优先考虑引入在堆栈,使例如全球所有的事件触发,再生物的动作事件,但这些操作事件被般的敏捷身手,或水平的一些属性排序。如果生物具有较高的灵活性,然后它获取第一个命中。
其他提示
这是我所看到的,大多数这样的发动机是事件,而不是时间,为主。用新tick
触发最后tick
结束之后,一些间隔。 (因此大多避免花费的时间比间隔tick
s的问题)
这也简化了实现;您只需一个游戏循环触发一个事件tick
,则所需的间隔sleep
s / yield
s。这是琐碎
它可以进一步通过在世界建模为树,其中每个元件管理传播事件(如ticks
)到他们的孩子简化。只要你避免/管理“循环”,这个效果很好(我已经做到了)。
这有效地降低了tick
系统是这样的(psudocode):
while (isRunning) {
world->tick();
sleep(interval);
}
在大多数情况下,那里有一点需要得到多少发烧友比调整前一个持续时间的长度。
任何单个实体的行为将自己的行动队列的一部分,和自己在处理“嘀”的事件。
一般用户命令将被分成“游戏中”和“元”命令,任何游戏中只会修改其角色的行动队列,以便在他们的下一个蜱进行处理,按照正常的任何其它实体。
简单的圆形为基础的战斗从这个基础上自然地遵循。实时可以与tick
s的更精细的划分进行建模,并可选择“时间池”。
使用执行每x毫秒(而x是滚动时间),执行把该方法中的堆栈上的任何操作的计时器。