Mercurial > projects > openmelee
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 |