1.比较坐标追踪法
追踪者会不停地比较自身和目标的x坐标和y坐标,每x和y上一个单位的移动为一个周期,该算法虽然简单好用,但实用性差且不智能化,如果追踪者数量增加,路线会显得单调,由于都是先走个对角线再一路直行,很可能造成多个追踪者拥堵在一起。
代码:
1 while(!(rigesha.x==killer.x&&rigesha.y==killer.y)){ 2 3 if(rigesha.x>killer.x){ 4 killer.goRight(); 5 }else if(rigesha.x<killer.x){ 6 killer.goLeft(); 7 } 8 9 if(rigesha.y>killer.y){ 10 killer.goDown(); 11 }else if(rigesha.y<killer.y){ 12 killer.goUp(); 13 } 14 15 }
2.射线动态追踪法
先在追踪者和目标之间建立一条直线,如图所示,然后再通过三角形面积公式法,模拟上行或左行一个单位后,距离该直线的距离,比较这两个距离,执行最短距离所对应的操作。
这样一来,追踪路线会尽可能接近直线,AI效果会更逼真。
在追踪过程中,如果监测到目标改变位置(此例假设目标每一帧都逃跑),那么追踪者就会重新建立两者之间的直线,然后沿着该直线继续追踪(如图所示)。
代码:
1 rigeshaX = rigesha.x; 2 rigeshaY = rigesha.y; 3 killerX = killer.x; 4 killerY = killer.y; 7 while(!(rigesha.x==killer.x&&rigesha.y==killer.y)){ 8 9 if(Random(0,1)>0.5){ 10 if(rigesha.x>killer.x){rigesha.goRight();}else{rigesha.goLeft();} 11 }else{ 12 if(rigesha.y>killer.y){rigesha.goDown();}else{rigesha.goUp();} 13 } 14 rigesha.move = true; 15 } 16 17 if(rigesha.move){ 18 caculaterLine(); 19 } 20 21 float rightDistanse = xORy(++killer.x,killer.y); 22 float leftDistance = xORy(--(--killer.x),killer.y); 23 float upDistance = xORy(++killer.x),--killer.y); 24 float downDistance = xORy(killer.x,++(++killer.y)); 25 killer.y--; 26 27 if(rigesha.x<=killer.x&&rigesha.y<=killer.y){ 28 if(leftDistance<=upDistance){ 29 killer.goLeft(); 30 }else{ 31 killer.goUp(); 32 } 33 rigesha.move = false; 34 continue; 35 } 36 37 if(rigesha.x>=killer.x&&rigesha.y<=killer.y){ 38 if(rightDistance<=upDistance){ 39 killer.goRight(); 40 }else{ 41 killer.goUp(); 42 } 43 rigesha.move = false; 44 continue; 45 } 46 47 if(rigesha.x>=killer.x&&rigesha.y>=killer.y){ 48 if(rightDistance<=downDistance){ 49 killer.goRight(); 50 }else{ 51 killer.goDown(); 52 } 53 rigesha.move = false; 54 continue; 55 } 56 57 if(rigesha.x<=killer.x&&rigesha.y>=killer.y){ 58 if(leftDistance<=downDistance){ 59 killer.goLeft(); 60 }else{ 61 killer.goDown(); 62 } 63 rigesha.move = false; 64 continue; 65 } 66 67 } 68 69 void caculaterLine(){ 70 rigeshaX = rigesha.x; 71 rigeshaY = rigesha.y; 72 killerX = killer.x; 73 killerY = killer.y; 74 } 75 76 float xORy(x,y){ 77 float S = x*killerY + killerX*rigeshaY + rigeshaX*y - x*rigeshaY - killerX*y - rigeshaX*killerY; 78 if(S<0){S = -S;} 79 float lengthDI = sqrt((killerX-rigashaX)*(killerX-rigashaX)+(killerY-rigashaY)*(killerY-rigashaY)) 80 distance = S/lengthDI; 81 return distance; 82 }