# HG changeset patch # User zzzzrrr # Date 1238196361 14400 # Node ID 88cca12cc8b9a945bad80a6d2e567de36a1feba2 # Parent 2bf818f8b0059abe722a356aee84b56c16a02e2b added ship explode diff -r 2bf818f8b005 -r 88cca12cc8b9 ai/ai.d --- a/ai/ai.d Fri Mar 27 16:25:17 2009 -0400 +++ b/ai/ai.d Fri Mar 27 19:26:01 2009 -0400 @@ -67,11 +67,12 @@ steer = new Steer(ship, objectList); } + // Elementary steering AI void move(Ship enemy) { - Threat threat; + if(!ship) return; - // Elementary steering AI + Threat threat; steer.update(); steer.collisionThreat(threat); st = threat.steering; @@ -97,11 +98,8 @@ ship.state.target = st; st = ship.rBody.localPoint(st); - float x = st.x; - float y = st.y; - st = -bzVec2(y,-x); // Because ship's heading is 90 off rigid body's heading - //st = st.rotate(-90); + st = st.rotateLeft90(); float angle = atan2(st.x, st.y); if(abs(angle) > 0.05) { @@ -129,10 +127,7 @@ st = ship.rBody.localPoint(st); // Because ship's heading is 90 off rigid body's heading - //st = st.rotate(-90); - float x = st.x; - float y = st.y; - st = -bzVec2(y,-x); + st = st.rotateLeft90(); float angle = atan2(st.x, st.y); if(st.x <= 0) { diff -r 2bf818f8b005 -r 88cca12cc8b9 ai/human.d --- a/ai/human.d Fri Mar 27 16:25:17 2009 -0400 +++ b/ai/human.d Fri Mar 27 19:26:01 2009 -0400 @@ -34,13 +34,15 @@ import xf.input.KeySym; import openmelee.ships.ship; +import openmelee.melee.melee : Melee; class Human { - + Melee melee; Ship ship; - this(Ship ship) { + this(Ship ship, Melee melee) { + this.melee = melee; this.ship = ship; } @@ -69,6 +71,13 @@ break; case KeySym.Down: break; + case KeySym.Delete: + melee.ship2.explode(); + melee.objectList.remove(melee.ship2); + melee.world.destroyBody(melee.ship2.rBody); + melee.ship2 = null; + melee.draw.ship2 = null; + melee.ai.ship = null; default: break; } diff -r 2bf818f8b005 -r 88cca12cc8b9 ai/steer.d --- a/ai/steer.d Fri Mar 27 16:25:17 2009 -0400 +++ b/ai/steer.d Fri Mar 27 19:26:01 2009 -0400 @@ -437,8 +437,7 @@ // estimated position of quarry at intercept bzVec2 target = quarry.predictFuturePosition(etl); - - return target; //steerForSeek (target); + return target; } // ------------------------------------------------------------------------ diff -r 2bf818f8b005 -r 88cca12cc8b9 melee/melee.d --- a/melee/melee.d Fri Mar 27 16:25:17 2009 -0400 +++ b/melee/melee.d Fri Mar 27 19:26:01 2009 -0400 @@ -58,7 +58,7 @@ const ITERS_PER_SECOND = 100; const k_maxContactPoints = 100; -const NUM_ASTROIDS = 15; +const NUM_ASTROIDS = 12; alias LinkedList!(Ship) ObjectList; @@ -137,7 +137,7 @@ running = true; draw = new Render(world, ship1, ship2, settings); - human = new Human(ship1); + human = new Human(ship1, this); objectList.add(planet); objectList.add(ship1); @@ -171,10 +171,10 @@ jobHub.addPostFrameJob( { // Limit velocity - ship1.limitVelocity(); - ship2.limitVelocity(); - ship1.updateState(); - ship2.updateState(); + foreach(o; objectList) { + o.limitVelocity(); + o.updateState(); + } gui.begin(cfg); gui.push(`main`); @@ -182,7 +182,7 @@ running = false; } - if(human.thrust) { + if(human.thrust && ship1) { ship1.thrust(); } @@ -210,7 +210,6 @@ ship1 = new Orz(world); ship2.rBody.angle = 3.14159265/4; planet = new Planet(world); - for(int i; i < NUM_ASTROIDS; i++) { auto asteroid = new Asteroid(world); objectList.add(asteroid); diff -r 2bf818f8b005 -r 88cca12cc8b9 render/render.d --- a/render/render.d Fri Mar 27 16:25:17 2009 -0400 +++ b/render/render.d Fri Mar 27 19:26:01 2009 -0400 @@ -353,13 +353,17 @@ void draw(vec2i screenSize, GL gl) { - - vec2 point1 = vec2.from(ship1.rBody.position); - vec2 point2 = vec2.from(ship2.rBody.position); - vec2 range = point1 - point2; - zoom = bzClamp(1000/range.length, 2, 60); - viewCenter = point1 - (range * 0.5f); - + if(ship2) { + vec2 point1 = vec2.from(ship1.rBody.position); + vec2 point2 = vec2.from(ship2.rBody.position); + vec2 range = point1 - point2; + zoom = bzClamp(1000/range.length, 2, 60); + viewCenter = point1 - (range * 0.5f); + } else { + viewCenter = vec2.from(ship1.rBody.position); + zoom = 10; + } + this.screenSize = screenSize; gl.LoadIdentity(); @@ -378,21 +382,12 @@ gl.LoadIdentity(); gl.Clear(GL_COLOR_BUFFER_BIT); - vec2 pp1 = vec2.from(ship2.rBody.position); - vec2 pp2 = vec2.from(ship2.state.target); - - //gl.drawSegment(pp1, pp2, Color(0, 1, 0)); - // Draw dynamic bodies if (settings.drawShapes) { for (bzBody b = world.bodyList; b; b = b.next) { - - for (bzShape shape = b.shapeList; shape; shape = shape.next) { - bzShape s = shape; bzXForm xf = b.xf; - if (b.isStatic) { gl.drawShape(s, xf, Color(0.5f, 0.9f, 0.5f), settings.drawCoreShapes); }else if (b.isSleeping) { diff -r 2bf818f8b005 -r 88cca12cc8b9 ships/ship.d --- a/ships/ship.d Fri Mar 27 16:25:17 2009 -0400 +++ b/ships/ship.d Fri Mar 27 19:26:01 2009 -0400 @@ -31,16 +31,23 @@ module openmelee.ships.ship; import tango.io.Stdout: Stdout; +import tango.math.Math : PI; import tango.util.container.LinkedList : LinkedList; import blaze.dynamics.bzBody : bzBody; -import blaze.collision.shapes.bzShape : bzShape; +import blaze.collision.shapes.bzShape : bzShape, bzShapeDef, bzMassData; +import blaze.collision.shapes.bzShapeType; import blaze.common.bzMath: bzVec2, bzCross, bzClamp; import blaze.bzWorld : bzWorld; import blaze.dynamics.forces.bzAttractor: bzAttractor; +import blaze.dynamics.bzBodyDef : bzBodyDef; +import blaze.collision.shapes.bzPolygon : bzPolyDef, bzPolygon; +import blaze.collision.shapes.bzCircle : bzCircleDef; alias LinkedList!(bzShape) ShapeList; +import openmelee.ai.utilities : randomRange; + struct State { bzVec2 position; @@ -104,7 +111,7 @@ void setPlanetGravity() { float minRadius = 0.1; float maxRadius = 10; - float strength = 4.0; + float strength = 0.75; bzVec2 center = bzVec2(0,0); auto attractor = new bzAttractor(rBody, center, strength, minRadius, maxRadius); world.addForce(attractor); @@ -133,4 +140,33 @@ } } } + + void explode() { + for(bzShape shape = rBody.shapeList; shape; shape = shape.next) { + auto bodyDef = new bzBodyDef; + switch(shape.type) { + case bzShapeType.POLYGON: + auto s = cast(bzPolygon) shape; + auto shapeDef = new bzPolyDef; + shapeDef.vertices = s.vertices; + shapeDef.density = s.density; + bodyDef.position = s.worldCenter; + bodyDef.angle = randomRange(-PI, PI); + bodyDef.allowFreeze = false; + bodyDef.allowSleep = false; + auto shrapnel = world.createBody(bodyDef); + shrapnel.createShape(shapeDef); + bzMassData massData; + massData.mass = 5.0f; + shrapnel.setMass(massData); + float x = randomRange(-300, 300); + float y = randomRange(-300, 300); + shrapnel.linearVelocity = bzVec2(x, y); + break; + default: + break; + } + } + } + }