我想对如何实现基于刻度的系统提出一些想法。
玩家或非玩家执行的每个动作都有初始执行时间和冷却时间。一旦一个生物的冷却时间过去了,它就可以选择一个新的动作。如果玩家必须选择一个动作,游戏就会“暂停”。
例子:
1:玩家重击(50 刻执行,50 刻冷却)
2:游戏持续 50 刻。
3:NPC可以设置动作。
4:玩家挥动并冷却 50 刻。
5:NPC可以设置动作。
6:为玩家暂停游戏。
我目前拥有的工作但效率不高。我有一个类,每个动作都是静态方法。这些方法输出一个包含所有数据的结构。这将被传递给单个生物的动作提示。
如果玩家采取了行动,每个更新循环都会调用 cue 并开始倒计时攻击时间。一旦攻击被解决,我再次调用动作类中的静态方法。我开始倒计时冷却时间。
所以我应该拥有的可能是一个包含所有操作的列表,并对该列表进行排序,从而跳过不必要的时间/滴答声,然后直接进入下一个操作。但是会有不同类型的动作,比如移动、攻击、能力,我无法很好地实现这一点。
当一个生物进行基本攻击时,这被称为(攻击是生物自己的实例攻击结构)
attack = Actions.BasicAttack(this, player, rand);
这就是 Actions 类的样子。
public struct Attack
{
public int Damage;
public string Type;
public int Time;
public int Cooldown;
public Creature target;
public bool solved;
}
public static Attack BasicAttack(Creature attacker, Creature defender, Random rand)
{
Attack attack = new Attack();
attack.Damage = rand.Next(attacker.MinBaseDmg, attacker.MaxBaseDmg + 1);
attack.Type = "Melee";
attack.Time = 50;
attack.Cooldown = 30;
attack.target = defender;
attack.solved = false;
return attack;
}
当玩家有动作提示时,它会在每个生物的更新方法中调用。如果玩家没有动作提示,Tick = 0,当玩家有动作提示时,Tick = 1。
protected void ActionCue(int tick)
{
if (attack.target != null)
{
if (attack.Time > 1)
{
Console.WriteLine(attack.Time);
attack.Time -= tick;
this.free = false;
}
else if (!attack.solved)
{
Actions.SolveAttack(attack.Damage, attack.Type, attack.target);
attack.solved = true;
}
else if (attack.solved && attack.Cooldown > 1)
{
//Console.WriteLine(attack.Cooldown);
attack.Cooldown -= tick;
}
else
free = true;
}
}