以創建精靈對象AI為目的的重構完成後,接下來需要進行具體功能的實現—如何啟動AI?
從原理上我們可以這樣設定:每個怪物精靈賦予一個索敵范圍(視線距離)SeekRange,當玩家進入這個區域後他就會將攻擊對象鎖定為玩家並向其發起攻擊;該索敵范圍同樣為以怪物精靈X、Y坐標為圓心,以視線距離為半徑的圓,判斷方法可以復用上一節中的InCircle():
大家在玩網游的時候是否注意到,玩家引怪容易,甩怪卻需要更長一些的時間與距離。難道我們還得多設定一個OutRange來定義擺脫怪物視線的距離?這裡其實有個小技巧,僅僅SeekRange一個參數就夠了。我們可以將怪物索敵方法放在游戲的輔助線程的異步方法中,這樣怪物每間隔1秒進行1次掃描,因此主角在與怪物距離小於SeekRange時即會引上怪,而只有當主角與怪物的距離大於SeekRange並持續1秒後才能甩掉怪物,這樣就間接的產生了兩個距離:索敵距離與擺脫距離:
private void RefreshFace(){
……
if (spirit.VLife != 0
&& Super.InCircle(Leader.X, Leader.Y, spirit.X, spirit.Y, spirit.SeekRange)
&& IsOpposition(spirit, Leader)) {
spirit.LockObject = Leader.Name;
} else {
spirit.LockObject = null;
}
……
}