五.追捕行為 追捕行為實際是尋找行為的一種(這句話好耳熟啊,哈哈,上一章裡就說過了).
5.1 目的
計算追逐對象的未來目标,實作有效的追捕
5.2 實作
計算目标的”未來位置”,機車先發制人,在”未來目标”等着目标.
5.3 讨論
關于追捕與尋找的差別 ,看一下示例 ”5-1-Compare.swf ”就明白了
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5CazFGbm9CXz52bjlGajFGd0F2LcNXZnFWbp9CXt92YuEWayljLzJmYvw1LcpDc0RHaiojIsJye.gif)
5-1-Compare.swf (4.23 KB)
下載下傳次數: 11
2009-12-27 23:37 下載下傳消耗 銀子 1 兩
下載下傳 (22.07 KB)
2009-12-27 23:37
如上圖所示,白色機車以恒定的速度向右移動,紅色的機車以seek的方式”尋找”機車,其中紅色的虛線是其路線,而藍色的機車是以pursue的方式”追捕”機車,藍色的虛線是其路線. 這樣再解釋起來就簡單多了.
要想追上你的目标,有兩種方法,一是你的速度比目标快,二是在目标前面等着他.
對于第一種情況,在我們的代碼 中,所有機車的最大速度都一樣,都是maxSpeed.是以這個方法不是我們本節讨論的内容.
再看第二種方法,在目标的前面等着它,什麼意思?就像我的示例” 5-1-Compare.swf”裡一樣,白色機車以恒定的速度像右移動.要想在它前面等着就要知道這個”未來目标”地方在哪裡,我們把這個”未來目标”定義為predictedTarget;
下載下傳 (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).
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5CazFGbm9CXz52bjlGajFGd0F2LcNXZnFWbp9CXt92YuEWayljLzJmYvw1LcpDc0RHaiojIsJye.gif)
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();
}
}
}
本章的源碼 如下:
chapter5.rar (19.76 KB)
下載下傳次數: 35
2009-12-27 23:37 下載下傳消耗 銀子 1 兩