攻擊動作合成圖中第 20 列為實質傷害幀。為每個精靈加入 EffectiveFrame(起效幀)屬性,生命執行緒中判斷觸發:
private void Timer_Tick(object sender, EventArgs e)
{
if (FrameCounter == EffectiveFrame[(int)Action]) { Super.DoInjure(this); }
}
public static void DoInjure(QXSpirit spirit)
{
QXSpirit Enemy = (spirit.Parent as Canvas).FindName(spirit.LockObject) as QXSpirit;
Random random = new Random();
if (random.Next(100) >= (spirit.VHit - Enemy.VDodge))
{
Super.ShowText(Enemy, true, true, "Avoid", "Miss", 34, Colors.SkyBlue, 2);
}
else
{
int Injure = 0;
if (spirit.Action == Actions.Attack)
Injure = Convert.ToInt32(spirit.VAttackMin + random.Next((int)(spirit.VAttackMax - spirit.VAttackMin)) - Enemy.VDefense);
else if (spirit.Action == Actions.Magic)
Injure = Convert.ToInt32(spirit.VMagicMin + random.Next((int)(spirit.VMagicMax - spirit.VMagicMin)) - Enemy.VMagicDefense);
if (random.Next(100) <= (spirit.VBurst - Enemy.VBlock))
{
Injure *= 2;
Super.ShowText(Enemy, true, true, "Avoid", string.Format("Burst!{0}", Injure >= 0 ? Injure.ToString() : "0"), 30, Colors.Red, 2);
}
else
{
Super.ShowText(Enemy, true, false, "Avoid", Injure >= 0 ? Injure.ToString() : "0", 30, Colors.Yellow, 0.5);
}
Enemy.VLife = Enemy.VLife < Injure ? 0 : Enemy.VLife - Injure;
}
}
流程:捕獲鎖定敵人 → 隨機數判定閃避 → 計算物理/魔法傷害 → 判定暴擊(傷害×2) → 顯示傷害文字 → 扣除生命值。