天天看點

[AI-Steering程式設計]五.追捕行為

五.追捕行為 追捕行為實際是尋找行為的一種(這句話好耳熟啊,哈哈,上一章裡就說過了).

5.1 目的

計算追逐對象的未來目标,實作有效的追捕

5.2 實作

計算目标的”未來位置”,機車先發制人,在”未來目标”等着目标.

5.3 讨論

關于追捕與尋找的差別 ,看一下示例 ”5-1-Compare.swf ”就明白了

[AI-Steering程式設計]五.追捕行為

5-1-Compare.swf (4.23 KB)

下載下傳次數: 11

2009-12-27 23:37 下載下傳消耗 銀子 1 兩 

[AI-Steering程式設計]五.追捕行為
[AI-Steering程式設計]五.追捕行為

下載下傳 (22.07 KB)

2009-12-27 23:37

如上圖所示,白色機車以恒定的速度向右移動,紅色的機車以seek的方式”尋找”機車,其中紅色的虛線是其路線,而藍色的機車是以pursue的方式”追捕”機車,藍色的虛線是其路線. 這樣再解釋起來就簡單多了.

要想追上你的目标,有兩種方法,一是你的速度比目标快,二是在目标前面等着他.

對于第一種情況,在我們的代碼 中,所有機車的最大速度都一樣,都是maxSpeed.是以這個方法不是我們本節讨論的内容.

再看第二種方法,在目标的前面等着它,什麼意思?就像我的示例” 5-1-Compare.swf”裡一樣,白色機車以恒定的速度像右移動.要想在它前面等着就要知道這個”未來目标”地方在哪裡,我們把這個”未來目标”定義為predictedTarget;

[AI-Steering程式設計]五.追捕行為
[AI-Steering程式設計]五.追捕行為

下載下傳 (52.84 KB)

2009-12-27 23:37

如上圖所示,predictedTarget應該等于機車的位置加上distance,這個沒有疑問吧.即vech.position.add(distance.position);是以下面的問題就是這個distance應該怎麼算呢?

距離肯定就是速度乘以時間了,白色機車的速度是vech.velocity,這是一個已知量,不用擔心,那麼問題的最後就是計算這個時間了.

想一想,在我們追到目标之前,目标有多長的時間可以逃跑?就是我們追他的這段時間嘛lookAheadTime,這個時間就是我們與目标之間的距離除以我們的宿舍啊!轉換到機車來想就是:

lookAheadTime = pursuer.position.dist(vech.position)/maxSpeed;

你有可能就問了:”pursuer與白色機車vech的距離不是一直在變化中的啊,那怎麼算啊?”哈哈,剛好,我的lookAheadTime也是及時更新的,看下下面的代碼你就知道了!

                   public function pursue(target:Vehicle):void {

                            var lookAheadTime:Number = target.position.dist(_position) / _maxSpeed;

                            //計算此時追上目标的預計時間,即lookAheadTime.

                            var predictedTarget:Vector2D = target.position.add(target.velocity.multiply(lookAheadTime));

                            //在這段時間内,目标以現在的速度,預計會到達的位置,即"未來目标"

                            seek(predictedTarget);

                            //尋找這個"未來目标"

                   }

在下面的示例 ” 5-1-Pursue.swf” 中 , 我建立了三個對象 , 白色的 vech, 紅色的 seeker 和藍色的 pursuer. 他們之間關系 ,vech.flee(seeker),seeker.seek(vech),pursuer.pursue(vech).

[AI-Steering程式設計]五.追捕行為

5-1-Pursue.swf (4.22 KB)

下載下傳次數: 19

2009-12-27 23:37 下載下傳消耗 銀子 1 兩 

文檔 Pursue 類如下 , 我就不做過多的解釋了 :

package 

{

         import flash.display.Graphics;

         import flash.display.Sprite;

         import flash.events.Event;

         import ladeng6666.steering.Vector2D;

         import ladeng6666.steering.Vehicle;

         import ladeng6666.steering.TargetObj;

         public class Pursue extends Sprite

         {

                   private var vech:Vehicle;                           //機車執行個體          

                   private var seeker:Vehicle;                        //添加紅色的機車,來seek白色的機車

                   private var pursuer:Vehicle                       //添加藍色的的機車,來pursue白色的機車

                   public function Pursue()

                   {

                            vech = new Vehicle();

                            vech.position = new Vector2D(100, 200);

                            vech.edgeBehavior = Vehicle.BOUNCE;

                            seeker = new Vehicle(0xff0000);

                            seeker.edgeBehavior = Vehicle.BOUNCE;

                            pursuer = new Vehicle(0x0000ff);

                            addChild(vech);

                            addChild(seeker);

                            addChild(pursuer);

                            addEventListener(Event.ENTER_FRAME, enterFrameHandler);

                   }

                   //按照幀頻随速度更新機車的位置

                   private function enterFrameHandler(e:Event):void {

                            vech.flee(seeker.position);

                            vech.update();

                            seeker.seek(vech.position);

                            seeker.update();

                            pursuer.pursue(vech);

                            pursuer.update();

                   }

         }

}

本章的源碼 如下:

[AI-Steering程式設計]五.追捕行為

chapter5.rar (19.76 KB)

下載下傳次數: 35

2009-12-27 23:37 下載下傳消耗 銀子 1 兩 

繼續閱讀