protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) { this.Exit(); } KeyboardState keys = Keyboard.GetState(); JVector moveVector = JVector.Zero; float amountOfMovement = 0.05f; if (keys.IsKeyDown(Keys.Right)) { moveVector.X += amountOfMovement; } if (keys.IsKeyDown(Keys.Left)) { moveVector.X -= amountOfMovement; } if (keys.IsKeyDown(Keys.Down)) { moveVector.Y -= amountOfMovement; } if (keys.IsKeyDown(Keys.Up)) { moveVector.Y += amountOfMovement; } body1.Position += moveVector; if (keys.IsKeyDown(Keys.OemPlus) && oldState.IsKeyUp(Keys.OemPlus)) { GJKCollide.MaxIterations++; } if (keys.IsKeyDown(Keys.OemMinus) && oldState.IsKeyUp(Keys.OemMinus)) { GJKCollide.MaxIterations--; } GJKCollide.MaxIterations = (int)JMath.Clamp(GJKCollide.MaxIterations, 0, 25); bool changeShape = false; if (keys.IsKeyDown(Keys.D1) && oldState.IsKeyUp(Keys.D1)) { shapeType++; changeShape = true; } if (keys.IsKeyDown(Keys.D2) && oldState.IsKeyUp(Keys.D2)) { shapeType--; changeShape = true; } shapeType = (int)JMath.Clamp(shapeType, 0, 2); if (changeShape) { Random r = new Random(); switch (shapeType) { case 0: // circle body1 = new RigidBody(new CircleShape((float)r.NextDouble() * 3f)); break; case 1: // capsule body1 = new RigidBody(new CapsuleShape((float)r.NextDouble() * 3f, (float)r.NextDouble() * 1f)); break; case 2: // box body1 = new RigidBody(new BoxShape((float)r.NextDouble() * 3f, (float)r.NextDouble() * 3f)); break; } } body1.Orientation += 0.005f; body2.Orientation -= 0.005f; JMatrix o1 = JMatrix.CreateRotationZ(body1.Orientation); JMatrix o2 = JMatrix.CreateRotationZ(body2.Orientation); JVector pos1 = body1.Position; JVector pos2 = body2.Position; JVector point2; sw.Start(); hit = GJKCollide.ClosestPoints(body1.Shape, body2.Shape, ref o1, ref o2, ref pos1, ref pos2, out point, out point2, out normal); sw.Stop(); penetration = JVector.Distance(point, point2); ticks = sw.ElapsedTicks; sw.Reset(); DebugDrawer.DrawPoint(point2); DebugDrawer.DrawPoint(point); DebugDrawer.Color = Color.Red; DebugDrawer.DrawLine(JVector.Zero, normal); DebugDrawer.Color = Color.Black; DebugDrawer.DrawLine(JVector.Up, JVector.Down); DebugDrawer.DrawLine(JVector.Left, JVector.Right); body1.DebugDraw(DebugDrawer); body2.DebugDraw(DebugDrawer); oldState = keys; base.Update(gameTime); }