以力量屬性VPower為例,它影響著最大負重、物理攻擊力最小值、物理攻擊力最大值這3個基值屬性,又以其中的物理攻擊力最大值為例:
/// <summary>
/// 獲取物理攻擊力最大值
/// </summary>
public double VAttackMax {
get { return ABase[2] + Equip[2] + Buff[2] + VPower * CoefficIEnt[2]; }
}
從它的CLR構造可以看出VAttackMax = ABase[2] + Equip[2] + Buff[2] + VPower * Coefficient[2],並且最關鍵的它是只讀的(即通過多個影響其值的相關屬性值集合而成,並非通過直接賦值得到,這樣做可以輕松構建出通用且易於維護的精靈屬性系統)。其中Abase[2]為該精靈物理攻擊力最大值的原始基礎值,例如戰士的ABase[2]可以定為30,那麼魔法師的ABase[2]大約為10左右等等;Equip[2]為所有裝備的力量加成值總和,這個不用說大家也明白;Buff[2]為所有加持減持等效果的附加值;Coefficient[2]為該精靈的力量系數,例如狂戰士的Coefficient[2]可以定為10,而牧師的CoefficIEnt[2]則約為2左右等等。那麼其他的諸如敏捷屬性VAgile,體格屬性VPhysique等等均是類似的關聯設計。
屬性定義完成後,接下來便可以著手設計精靈的物理攻擊系統。
同樣的我們首先對物理攻擊的需求進行分析,即物理攻擊的觸發、過程及結束處理:
當我們在其他精靈身上點擊鼠標左鍵後,首先進行敵對判斷,如果是敵對的則將物理攻擊對象鎖定為該精靈(敵人),然後主角向其位置跑去,當該敵人進入主角的攻擊距離(范圍)內時,主角向其發起物理攻擊,然後通過公式計算出傷害值並輸出顯示出來。這就是最典型的物理攻擊發生過程。
下面是我根據此原理過程寫的一些關鍵邏輯代碼:
步驟一,主角與對象精靈之間的敵對判斷,根據注釋並且憑借大家N年的網游PK經驗應該不難理解^_^:
/// <summary>
/// 判斷主角是否與監視對象敵對
/// </summary>
/// <param name="obj">自身精靈</param>
/// <param name="obj">對象精靈</param>
/// <returns>是/否</returns>
private bool IsOpposition(QXSpirit me, QXSpirit obj) {
//假如對象為自己則返回否
if (me == obj) {
return false;
//假如對象的PK值大於或等於7則返回是
} else if (obj.VPK >= 7) {
return true;
} else {
//根據自身的PK模式與對方的PK模式進行比較進行相應返回
switch (me.PKMode) {
case PKModes.Peace:
return false;
case PKModes.Whole:
return true;
case PKModes.GoodAndEvil:
//在善惡模式下對方為全部攻擊模式時返回是
return obj.PKMode == PKModes.Whole ? true : false;
case PKModes.Faction:
return me.VFaction != obj.VFaction ? true : false;
case PKModes.Clan:
return me.VClan != obj.VClan ? true : false;
default:
return false;
}
}
}