From fd8964e58b45000a6b9be0c6dce0aff4972b5fe5 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Wed, 6 Dec 2023 17:36:56 +0300 Subject: [PATCH] agtawtg --- Game/Game1.cs | 64 +++++++++++++++++++++---------- Game/Physics2D/PhysicsEngine2D.cs | 25 ++++++++---- 2 files changed, 61 insertions(+), 28 deletions(-) diff --git a/Game/Game1.cs b/Game/Game1.cs index 0a07534..ce41b07 100644 --- a/Game/Game1.cs +++ b/Game/Game1.cs @@ -155,28 +155,52 @@ public class Game1 : Game if (Keyboard.GetState().IsKeyDown(Keys.E)) gameManager.Camera.Rotation -= gameTime.ElapsedGameTime.Nanoseconds * 0.000025f; - // if (Keyboard.GetState().IsKeyDown(Keys.N)) - // seconds = 39.12f; - // if (Keyboard.GetState().IsKeyDown(Keys.Space)) - // seconds += gameTime.ElapsedGameTime.Milliseconds * .005f; - // if (Keyboard.GetState().IsKeyDown(Keys.B)) - // { - // seconds -= gameTime.ElapsedGameTime.Milliseconds * .005f; - // while (physicsTimer - 0.01f > seconds) - // { - // Console.WriteLine($"Physics Timer: {physicsTimer}"); - // physicsTimer -= 0.01f; - // engine.Step(-.01f); - // } - // } - - - while (physicsTimer + 0.01f < gameTime.TotalGameTime.TotalMilliseconds * .001f)//seconds) + if (Keyboard.GetState().IsKeyDown(Keys.N)) { - // Console.WriteLine($"Physics Timer: {physicsTimer}"); - physicsTimer += 0.01f; - engine.Step(.01f); + seconds = 70f; + while (physicsTimer + 0.01f < seconds) + { + physicsTimer += 0.01f; + engine.Step(.01f); + } } + if (Keyboard.GetState().IsKeyDown(Keys.M)) + { + seconds = 0f; + while (physicsTimer - 0.01f > seconds) + { + physicsTimer -= 0.01f; + engine.Step(-.01f); + } + } + if (Keyboard.GetState().IsKeyDown(Keys.Space)) + { + seconds += gameTime.ElapsedGameTime.Milliseconds * .0025f; + while (physicsTimer + 0.01f < seconds) + { + Console.WriteLine($"Physics Timer: {physicsTimer}"); + physicsTimer += 0.01f; + engine.Step(.01f); + } + } + if (Keyboard.GetState().IsKeyDown(Keys.B)) + { + seconds -= gameTime.ElapsedGameTime.Milliseconds * .0025f; + while (physicsTimer - 0.01f > seconds) + { + Console.WriteLine($"Physics Timer: {physicsTimer}"); + physicsTimer -= 0.01f; + engine.Step(-.01f); + } + } + + + // while (physicsTimer + 0.01f < gameTime.TotalGameTime.TotalMilliseconds * .001f)//seconds) + // { + // Console.WriteLine($"Physics Timer: {physicsTimer}"); + // physicsTimer += 0.01f; + // engine.Step(.01f); + // } gameManager.Update(gameTime); base.Update(gameTime); } diff --git a/Game/Physics2D/PhysicsEngine2D.cs b/Game/Physics2D/PhysicsEngine2D.cs index 1b356ff..9d94851 100644 --- a/Game/Physics2D/PhysicsEngine2D.cs +++ b/Game/Physics2D/PhysicsEngine2D.cs @@ -56,10 +56,10 @@ public class PhysicsEngine2D : IPhysicsEngine2D CheckCollisions(colliders[i], colliders, (collider1, collider2, collisionVertex) => { ResolveCollision(collider1, collider2, collisionVertex, intervalDeltaTime); - ResolveCollision(collider2, collider1, collisionVertex, intervalDeltaTime); + // ResolveCollision(collider2, collider1, collisionVertex, intervalDeltaTime); - collider1.Recalculate(); - collider2.Recalculate(); + // collider1.Recalculate(); + // collider2.Recalculate(); }); } } @@ -76,7 +76,8 @@ public class PhysicsEngine2D : IPhysicsEngine2D c2.Vertices.ToLines(lines); Vector2 normal = Vector2.UnitY; - float t = 0f; + float t = 1f; + bool hasIntersectedWithLines = false; foreach (var line in lines) { @@ -86,16 +87,24 @@ public class PhysicsEngine2D : IPhysicsEngine2D if (intersectionPoint is not Vector2 ip) continue; - t = vertexTrajectory.GetT(ip); + float tTemp = vertexTrajectory.GetT(ip); + if (tTemp > t) // React to the earliest collision value + continue; + + t = tTemp; Vector2 lineDirection = line.Direction; normal = new(lineDirection.Y, lineDirection.X); - break; + hasIntersectedWithLines = true; } - StepRigidBody(c1.RigidBody2D, -t * intervalDeltaTime); + if (!hasIntersectedWithLines) + return; + + float rewindInterval = t * intervalDeltaTime; + StepRigidBody(c1.RigidBody2D, -rewindInterval); c1.RigidBody2D.Velocity = Vector2.Reflect(c1.RigidBody2D.Velocity, normal); - StepRigidBody(c1.RigidBody2D, intervalDeltaTime - t * intervalDeltaTime); + StepRigidBody(c1.RigidBody2D, rewindInterval); } private void CheckCollisions(ICollider2D collider2D, List collider2Ds, Action OnCollisionDetectedAction)