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; body1.Orientation += 0.001f; body2.Orientation -= 0.001f; 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 = XenoCollide.Detect(body1.Shape, body2.Shape, ref o1, ref o2, ref pos1, ref pos2, out point, out normal, out penetration); sw.Stop(); ticks = sw.ElapsedTicks; sw.Reset(); DebugDrawer.DrawLine(point, point + normal); //DebugDrawer.DrawPoint(point2); DebugDrawer.DrawPoint(point); DebugDrawer.Color = Color.Red; DebugDrawer.Color = Color.Black; DebugDrawer.DrawLine(JVector.Up, JVector.Down); DebugDrawer.DrawLine(JVector.Left, JVector.Right); body1.DebugDraw(DebugDrawer); body2.DebugDraw(DebugDrawer); if (hit) { var oldPosition = body1.Position; body1.Position += normal; body1.DebugDraw(DebugDrawer); body1.Position = oldPosition; } base.Update(gameTime); }
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; } PB += moveVector; OA = (float)gameTime.TotalGameTime.TotalSeconds * 0.1f; OB = (float)gameTime.TotalGameTime.TotalSeconds * -0.1f; DrawBox(A, PA, OA, Color.Blue * 0.25f); DrawBox(B, PB, OB, Color.Green * 0.25f); float t = 0.0f; JVector[] CA = new JVector[2], CB = new JVector[2]; int NumContacts = 0; sw.Start(); JMatrix OAM = JMatrix.CreateRotationZ(OA); JMatrix OBM = JMatrix.CreateRotationZ(OB); for (int i = 0; i < 1; i++) { A.UpdateAxes(OA); B.UpdateAxes(OB); //hit = Collision.BoxBoxTest(ref A, ref PA, ref B, ref PB); //AV = new List<JVector> { A.GetCorner(0), A.GetCorner(1), A.GetCorner(2), A.GetCorner(3) }; //BV = new List<JVector> { B.GetCorner(0), B.GetCorner(1), B.GetCorner(2), B.GetCorner(3) }; //hit = SAT.Collide(ref AV, ref PA, ref VA, ref OAM, // ref BV, ref PB, ref VB, ref OBM, // ref normal, ref t); //if (hit) //{ // SAT.FindContacts(ref AV, ref PA, ref VA, ref OAM, // ref BV, ref PB, ref VB, ref OBM, // ref normal, t, out CA, out CB, out NumContacts); // normal.Normalize(); //} hit = Collision.BoxBoxTestContact(ref A, ref PA, ref OAM, ref B, ref PB, ref OBM, out normal, out t, out CA, out CB, out NumContacts); penetration = t; iterations = NumContacts; } sw.Stop(); ticks = sw.ElapsedTicks / 1; sw.Reset(); if (hit) { //DrawBox(A, PA + normal * (t * 0.5f), OA, Color.Blue); //DrawBox(B, PB - normal * (t * 0.5f), OB, Color.Green); for (int i = 0; i < NumContacts; i++) { DebugDrawer.DrawPoint(CA[i]); // + normal * (t * 0.5f)); DebugDrawer.DrawPoint(CB[i]); // - normal * (t * 0.5f)); } } base.Update(gameTime); }