comparison ai/ai.d @ 24:441eb7672404

impleneted steer to avoid
author zzzzrrr <mason.green@gmail.com>
date Fri, 27 Mar 2009 16:05:24 -0400
parents e79347dd38a3
children 88cca12cc8b9
comparison
equal deleted inserted replaced
23:e79347dd38a3 24:441eb7672404
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 module openmelee.ai.ai; 31 module openmelee.ai.ai;
32 32
33 import tango.util.container.LinkedList : LinkedList;
33 import tango.io.Stdout : Stdout; 34 import tango.io.Stdout : Stdout;
34 import tango.math.Math : atan2, abs, PI; 35 import tango.math.Math : atan2, abs, PI, isNaN;
35 36
36 import blaze.common.bzMath: bzVec2, bzClamp; 37 import blaze.common.bzMath: bzVec2, bzClamp;
37 import blaze.bzWorld : bzWorld; 38 import blaze.bzWorld : bzWorld;
38 39
39 import openmelee.ai.steer : Steer; 40 import openmelee.ai.steer : Steer;
40 import openmelee.ships.ship : Ship; 41 import openmelee.ships.ship : Ship;
41 42
43 alias LinkedList!(Ship) ObjectList;
44
45 struct Threat {
46 Ship target;
47 bzVec2 steering;
48 float distance = 0.0f;
49 float collisionTime = 0.0f;
50 float minSeparation = float.max;
51 bzVec2 relativePos;
52 bzVec2 relativeVel;
53 }
54
42 class AI { 55 class AI {
43
44 56
45 Steer steer; 57 Steer steer;
46 Ship ship; 58 Ship ship;
47 float maxPredictionTime = 0.1f; 59 float maxPredictionTime = 0.1f;
48 bzWorld m_world;
49 bzVec2 st; 60 bzVec2 st;
50 61
51 bool avoidTurn; 62 bool avoidRight;
63 bool avoidLeft;
52 64
53 this(Ship ship, bzWorld world) { 65 this(Ship ship, ObjectList objectList) {
54 m_world = world;
55 this.ship = ship; 66 this.ship = ship;
56 steer = new Steer(ship); 67 steer = new Steer(ship, objectList);
57 } 68 }
58 69
59 void move(Ship enemy) { 70 void move(Ship enemy) {
60 71
61 st = bzVec2.zeroVect; 72 Threat threat;
62 73
63 // Elementary steering AI 74 // Elementary steering AI
64 steer.update(); 75 steer.update();
65 //st = steer.steerToAvoidObstacles(0.25, m_world.bodyList); 76 steer.collisionThreat(threat);
66 //st = steer.avoid(10.0, m_world.bodyList); 77 st = threat.steering;
67 //st = steer.getSteering(m_world.bodyList);
68 78
69 if(st == bzVec2.zeroVect) { 79 if(st == bzVec2.zeroVect) {
70 avoidTurn = false; 80 if(avoidLeft || avoidRight) {
71 st = steer.steerForPursuit(enemy.state, maxPredictionTime); 81 avoidLeft = avoidRight = false;
82 ship.rBody.angularVelocity = 0.0f;
83 }
84 st = steer.targetEnemy(enemy.state, maxPredictionTime);
72 chase(enemy); 85 chase(enemy);
86 return;
73 } else { 87 } else {
88 ship.state.turn = false;
74 avoid(); 89 avoid();
90 return;
75 } 91 }
92
93 assert(0);
76 } 94 }
77 95
78 void chase(Ship enemy) { 96 void chase(Ship enemy) {
79 97
80 ship.state.target = st; 98 ship.state.target = st;
81 st = ship.rBody.localPoint(st); 99 st = ship.rBody.localPoint(st);
82 float x = st.x; 100 float x = st.x;
83 float y = st.y; 101 float y = st.y;
84 st = -bzVec2(y,-x); 102 st = -bzVec2(y,-x);
103 // Because ship's heading is 90 off rigid body's heading
104 //st = st.rotate(-90);
85 float angle = atan2(st.x, st.y); 105 float angle = atan2(st.x, st.y);
86 106
87 if(abs(angle) > 0.05) { 107 if(abs(angle) > 0.05) {
88 if(!ship.state.turn) { 108 if(!ship.state.turn) {
89 if(st.x >= 0) { 109 if(st.x >= 0) {
90 ship.turnRight(); 110 ship.turnRight();
91 ship.state.turn = true; 111 ship.state.turn = true;
106 } 126 }
107 127
108 void avoid() { 128 void avoid() {
109 129
110 st = ship.rBody.localPoint(st); 130 st = ship.rBody.localPoint(st);
131 // Because ship's heading is 90 off rigid body's heading
132 //st = st.rotate(-90);
111 float x = st.x; 133 float x = st.x;
112 float y = st.y; 134 float y = st.y;
113 st = -bzVec2(y,-x); 135 st = -bzVec2(y,-x);
114 float angle = atan2(st.x, st.y); 136 float angle = atan2(st.x, st.y);
115 137
116 if(!avoidTurn) { 138 if(st.x <= 0) {
117 if(st.x >= 0) { 139 if(!avoidRight) {
118 ship.turnRight(); 140 ship.turnRight();
119 } else { 141 avoidRight = true;
142 avoidLeft = false;
143 }
144 } else {
145 if(!avoidLeft) {
120 ship.turnLeft(); 146 ship.turnLeft();
147 avoidLeft = true;
148 avoidRight = false;
121 } 149 }
122 avoidTurn = true;
123 } 150 }
124 151
125 ship.thrust(); 152 ship.thrust();
126 } 153 }
127 154