我想了解如何實現基於打勾的系統。實施基於刻度線/圓形的戰鬥系統
玩家或非玩家獲得的每一個動作都有一個初始時間和一個冷卻時間。一旦生物冷卻時間過去了,它就會選擇一個新的動作。如果玩家必須選擇一個動作,遊戲將「暫停」。
實施例:
1:球員揮杆重(50只蜱來執行,50只蜱降溫)
2:遊戲的推移50只蜱。
3:NPC可以設置動作。
4:玩家擺動並冷卻50滴。 5:NPC可以設置動作。
6:遊戲爲玩家暫停。
我目前的工作,但效率不高。我有一個類,每個動作都是靜態方法。這些方法輸出一個包含所有數據的結構。這將被傳遞給個體生物的行動。
每個更新循環調用提示並開始倒計時攻擊時間,如果玩家已經進行了操作。一旦攻擊應該解決,我再次在操作類中調用靜態方法。我開始倒計時的冷卻時間。
因此,我應該有的可能是一個列表,其中包含所有操作和排序列表,跳過不必要的時間/滴答並直接進入下一個操作。但是會有不同類型的動作,比如移動,攻擊,能力和我無法將我的頭圍繞在這個好的實現上。
當一個生物進行基本攻擊這個被調用(攻擊是生物自身實例化的攻擊結構)
attack = Actions.BasicAttack(this, player, rand);
這是操作類的樣子。
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;
}
}
粘貼在代碼中。從一個甚至不使用實際類名的描述中推導出你正在做的事情是一種痛苦 –
我很可能需要一種完全不同的方式來完成它。但我嘗試粘貼一些代碼,讓你們看到我目前有什麼。 – Madmenyo
當我需要不同類型的動作時,我也遇到了問題,如移動。我需要一種方法讓事情變得更加靈活,然後直接計算下一步要執行的操作。 – Madmenyo