changeset 14:af1e8620f027

fixed steering
author zzzzrrr <mason.green@gmail.com>
date Mon, 23 Mar 2009 14:06:47 -0400
parents e1004697cae1
children 8e6a9e390cba
files ai.d main.d melee.d orz.d render.d ship.d urQuan.d
diffstat 7 files changed, 35 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/ai.d	Mon Mar 23 08:02:23 2009 -0400
+++ b/ai.d	Mon Mar 23 14:06:47 2009 -0400
@@ -33,7 +33,7 @@
 import tango.io.Stdout : Stdout;
 import tango.math.Math : atan2, abs, PI;
 
-import blaze.common.bzMath: bzVec2;
+import blaze.common.bzMath: bzVec2, bzClamp;
 import openmelee.steer : Steer;
 import openmelee.ship : Ship;
 
@@ -42,7 +42,7 @@
 
 	Steer steer;
 	Ship ship;
-	float maxPredictionTime = 0.5f;
+	float maxPredictionTime = 0.1f;
 	
 	this(Ship ship) {
 		this.ship = ship;
@@ -51,40 +51,36 @@
 	
 	void move(Ship enemy) {
 	    
+        // Ver stupid, elementary AI so far...
+        
 	    steer.update();
 	    bzVec2 st;
 	    st = steer.steerForPursuit(enemy.state, maxPredictionTime);
-	    
 	    ship.state.target = st;
+        st = ship.rBody.localPoint(st);
+        float x = st.x;
+		float y = st.y;
+        st = -bzVec2(y,-x);
         float angle = atan2(st.x, st.y);
 		
-		Stdout("Target angle: ")(angle).newline;
-		
-		float x = ship.state.forward.x;
-		float y = ship.state.forward.y;
-		float angle2 = atan2(x,y);
-		
-        
-		float rel = angle2 - angle;
-		
-		if(abs(rel) > PI/8) {
-			if(angle < angle2) {
-				ship.turnLeft();
-				ship.state.turn = true;
-			} else {
-				ship.state.turn = true;
-				ship.turnRight();
-			}
+		if(abs(angle) > 0.05) {
+            if(!ship.state.turn) {
+                if(st.x >= 0) {
+                    ship.turnRight();
+                    ship.state.turn = true;
+                } else {
+                    ship.state.turn = true;
+                    ship.turnLeft();
+                }
+           }
 		} else {
 			ship.rBody.angularVelocity = 0.0f;
 			ship.state.turn = false;
 		}
 		
-		ship.state.enemyAngle = rel;
-		
 		float range = (ship.state.position - enemy.state.position).length; 
-		if(range > 20 && !ship.state.turn) {
-			//ship.thrust();
+		if(range > 10 && abs(angle) < PI/4) {
+			ship.thrust();
 		}
     }
 
--- a/main.d	Mon Mar 23 08:02:23 2009 -0400
+++ b/main.d	Mon Mar 23 14:06:47 2009 -0400
@@ -77,20 +77,20 @@
     StopWatch timer;
 
     jobHub.addRepeatableJob( {
-        // Update AI
-        ai.move(whut.ship1);
         // Update physics
         whut.world.step(timeStep, settings.velocityIterations,
                         settings.positionIterations);
+        // Update AI
+        ai.move(whut.ship1);
     }, ITERS_PER_SECOND);
 
     bool running = true;
 
     jobHub.addPreFrameJob( {
+        whut.ship1.limitVelocity();
+        whut.ship2.limitVelocity();
         whut.ship1.updateState();
         whut.ship2.updateState();
-        whut.ship1.limitVelocity();
-        whut.ship2.limitVelocity();
     });
 
     jobHub.addPostFrameJob( {
@@ -115,7 +115,7 @@
             vec2 p2 = vec2.from(whut.ship2.rBody.position);
             vec2 distance = p1 - p2;
             float d = distance.length;
-            whut.zoom = bzClamp(1/d*1000, 5, 50);
+            whut.zoom = bzClamp(1/d*1000, 2, 50);
             whut.viewCenter = p1 - (distance * 0.5f);
         }
         
--- a/melee.d	Mon Mar 23 08:02:23 2009 -0400
+++ b/melee.d	Mon Mar 23 14:06:47 2009 -0400
@@ -84,7 +84,7 @@
 
 // Melee settings. Some can be controlled in the GUI.
 struct Settings {
-    float hz = 30;
+    float hz = 60;
     int velocityIterations = 5;
     int positionIterations = 1;
     bool drawShapes = true;
@@ -159,14 +159,15 @@
 
 	void init() {
 	    // Define world boundaries
-		worldAABB.lowerBound.set(-200.0f, -200.0f);
-		worldAABB.upperBound.set(200.0f, 200.0f);
+		worldAABB.lowerBound.set(-400.0f, -250.0f);
+		worldAABB.upperBound.set(400.0f, 250.0f);
 		world = new bzWorld(worldAABB, gravity, allowSleep);
 		world.boundaryListener = m_boundaryListener;
 		world.contactListener = m_contactListener;
 		viewCenter = vec2(10, 10);
 		ship1 = new UrQuan(world);
 		ship2 = new Orz(world);
+        ship2.rBody.angle = 3.14159265/4;
         auto planet = new Planet(world);
 	}
 
--- a/orz.d	Mon Mar 23 08:02:23 2009 -0400
+++ b/orz.d	Mon Mar 23 14:06:47 2009 -0400
@@ -54,7 +54,7 @@
 
         auto bodyDef = new bzBodyDef;
         //bodyDef.isBullet = true;
-        bodyDef.position = bzVec2(10,10);
+        bodyDef.position = bzVec2(20,15);
         bodyDef.angle = PI/2;
         bodyDef.allowFreeze = false;
 
@@ -91,6 +91,6 @@
         shapes.add(rBody.createShape(bWing));
 
         rBody.setMassFromShapes();
-        setGravity();
+        setPlanetGravity();
       }
 }
--- a/render.d	Mon Mar 23 08:02:23 2009 -0400
+++ b/render.d	Mon Mar 23 14:06:47 2009 -0400
@@ -336,7 +336,7 @@
     vec2 pp1 = vec2.from(ship2.rBody.position);
     vec2 pp2 = vec2.from(ship2.state.target);
     
-    gl.drawSegment(pp1, pp2, Color(0, 1, 0));
+    //gl.drawSegment(pp1, pp2, Color(0, 1, 0));
     
     // Draw dynamic bodies
     if (settings.drawShapes) {
--- a/ship.d	Mon Mar 23 08:02:23 2009 -0400
+++ b/ship.d	Mon Mar 23 14:06:47 2009 -0400
@@ -81,7 +81,6 @@
     }
 
     void thrust() {
-        
         rBody.force += engineForce.rotate(rBody.angle);
     }
 
@@ -97,7 +96,7 @@
                                 turnForce.rotate(rBody.angle));
     }
     
-    void setGravity() {
+    void setPlanetGravity() {
         float minRadius = 0.1;
         float maxRadius = 10;
         float strength = 3.5;
--- a/urQuan.d	Mon Mar 23 08:02:23 2009 -0400
+++ b/urQuan.d	Mon Mar 23 14:06:47 2009 -0400
@@ -54,7 +54,7 @@
         
         auto bodyDef = new bzBodyDef;
         //bodyDef.isBullet = true;
-        bodyDef.position = bzVec2(10,5);
+        bodyDef.position = bzVec2(30,5);
         bodyDef.allowFreeze = false;
         rBody = world.createBody(bodyDef);
         float density = 5.0f;
@@ -118,6 +118,6 @@
         shapes.add(rBody.createShape(bWing));
 
         rBody.setMassFromShapes();
-        setGravity();
+        setPlanetGravity();
     }
 }