Hey this actually is deterministic atm
This commit is contained in:
parent
2e72347721
commit
dd9950d6c5
|
@ -11,6 +11,7 @@ using Syntriax.Engine.Core.Abstract;
|
||||||
using Syntriax.Engine.Graphics.TwoDimensional;
|
using Syntriax.Engine.Graphics.TwoDimensional;
|
||||||
using Syntriax.Engine.Input;
|
using Syntriax.Engine.Input;
|
||||||
using Syntriax.Engine.Physics2D;
|
using Syntriax.Engine.Physics2D;
|
||||||
|
using Syntriax.Engine.Physics2D.Primitives;
|
||||||
|
|
||||||
namespace Pong;
|
namespace Pong;
|
||||||
|
|
||||||
|
@ -64,7 +65,7 @@ public class Game1 : Game
|
||||||
gameObjectBall.Transform.Position = Vector2.Zero;
|
gameObjectBall.Transform.Position = Vector2.Zero;
|
||||||
gameObjectBall.Transform.Scale = new Vector2(1f / 51.2f, 1f / 51.2f);
|
gameObjectBall.Transform.Scale = new Vector2(1f / 51.2f, 1f / 51.2f);
|
||||||
engine.AddRigidBody(gameObjectBall.BehaviourController.AddBehaviour<RigidBody2D>());
|
engine.AddRigidBody(gameObjectBall.BehaviourController.AddBehaviour<RigidBody2D>());
|
||||||
gameObjectBall.BehaviourController.AddBehaviour<MovementBallBehaviour>(new Vector2(.1f, .01f), 500f);
|
gameObjectBall.BehaviourController.AddBehaviour<MovementBallBehaviour>(new Vector2(.1f, .1f), 500f);
|
||||||
gameObjectBall.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>().Assign(spriteBall);
|
gameObjectBall.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>().Assign(spriteBall);
|
||||||
gameObjectBall.BehaviourController.AddBehaviour<Collider2DAABBBehaviour>().AABBLocal = new AABB(-Vector2.One * 512f * .5f, Vector2.One * 512f * .5f);
|
gameObjectBall.BehaviourController.AddBehaviour<Collider2DAABBBehaviour>().AABBLocal = new AABB(-Vector2.One * 512f * .5f, Vector2.One * 512f * .5f);
|
||||||
// gameObjectBall = gameManager.InstantiateGameObject<GameObject>();
|
// gameObjectBall = gameManager.InstantiateGameObject<GameObject>();
|
||||||
|
@ -76,25 +77,25 @@ public class Game1 : Game
|
||||||
// gameObjectBall.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>().Assign(spriteBall);
|
// gameObjectBall.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>().Assign(spriteBall);
|
||||||
// gameObjectBall.BehaviourController.AddBehaviour<Collider2DAABBBehaviour>().AABBLocal = new AABB(-Vector2.One * 512f * .5f, Vector2.One * 512f * .5f);
|
// gameObjectBall.BehaviourController.AddBehaviour<Collider2DAABBBehaviour>().AABBLocal = new AABB(-Vector2.One * 512f * .5f, Vector2.One * 512f * .5f);
|
||||||
|
|
||||||
IGameObject gameObjectLeft = gameManager.InstantiateGameObject<GameObject>();
|
// IGameObject gameObjectLeft = gameManager.InstantiateGameObject<GameObject>();
|
||||||
gameObjectLeft.Name = "Left";
|
// gameObjectLeft.Name = "Left";
|
||||||
gameObjectLeft.Transform.Position = new Vector2(-452, 0f);
|
// gameObjectLeft.Transform.Position = new Vector2(-452, 0f);
|
||||||
gameObjectLeft.Transform.Scale = new Vector2(10f, 40f);
|
// gameObjectLeft.Transform.Scale = new Vector2(10f, 40f);
|
||||||
gameObjectLeft.BehaviourController.AddBehaviour<KeyboardInputsBehaviour>();
|
// gameObjectLeft.BehaviourController.AddBehaviour<KeyboardInputsBehaviour>();
|
||||||
gameObjectLeft.BehaviourController.AddBehaviour<MovementBoxBehaviour>(Keys.W, Keys.S, 268f, -268f, 400f);
|
// gameObjectLeft.BehaviourController.AddBehaviour<MovementBoxBehaviour>(Keys.W, Keys.S, 268f, -268f, 400f);
|
||||||
gameObjectLeft.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>().Assign(spriteBox);
|
// gameObjectLeft.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>().Assign(spriteBox);
|
||||||
gameObjectLeft.BehaviourController.AddBehaviour<Collider2DAABBBehaviour>().AABBLocal = new AABB(-Vector2.One * .5f, Vector2.One * .5f);
|
// gameObjectLeft.BehaviourController.AddBehaviour<Collider2DAABBBehaviour>().AABBLocal = new AABB(-Vector2.One * .5f, Vector2.One * .5f);
|
||||||
engine.AddRigidBody(gameObjectLeft.BehaviourController.AddBehaviour<RigidBody2D>());
|
// engine.AddRigidBody(gameObjectLeft.BehaviourController.AddBehaviour<RigidBody2D>());
|
||||||
|
|
||||||
IGameObject gameObjectRight = gameManager.InstantiateGameObject<GameObject>();
|
// IGameObject gameObjectRight = gameManager.InstantiateGameObject<GameObject>();
|
||||||
gameObjectRight.Name = "Right";
|
// gameObjectRight.Name = "Right";
|
||||||
gameObjectRight.Transform.Position = new Vector2(452, 0f);
|
// gameObjectRight.Transform.Position = new Vector2(452, 0f);
|
||||||
gameObjectRight.Transform.Scale = new Vector2(10f, 40f);
|
// gameObjectRight.Transform.Scale = new Vector2(10f, 40f);
|
||||||
gameObjectRight.BehaviourController.AddBehaviour<KeyboardInputsBehaviour>();
|
// gameObjectRight.BehaviourController.AddBehaviour<KeyboardInputsBehaviour>();
|
||||||
gameObjectRight.BehaviourController.AddBehaviour<MovementBoxBehaviour>(Keys.Up, Keys.Down, 268f, -268f, 400f);
|
// gameObjectRight.BehaviourController.AddBehaviour<MovementBoxBehaviour>(Keys.Up, Keys.Down, 268f, -268f, 400f);
|
||||||
gameObjectRight.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>().Assign(spriteBox);
|
// gameObjectRight.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>().Assign(spriteBox);
|
||||||
gameObjectRight.BehaviourController.AddBehaviour<Collider2DAABBBehaviour>().AABBLocal = new AABB(-Vector2.One * .5f, Vector2.One * .5f);
|
// gameObjectRight.BehaviourController.AddBehaviour<Collider2DAABBBehaviour>().AABBLocal = new AABB(-Vector2.One * .5f, Vector2.One * .5f);
|
||||||
engine.AddRigidBody(gameObjectRight.BehaviourController.AddBehaviour<RigidBody2D>());
|
// engine.AddRigidBody(gameObjectRight.BehaviourController.AddBehaviour<RigidBody2D>());
|
||||||
|
|
||||||
|
|
||||||
IGameObject goPlayAreaTop = gameManager.InstantiateGameObject<GameObject>();
|
IGameObject goPlayAreaTop = gameManager.InstantiateGameObject<GameObject>();
|
||||||
|
|
|
@ -65,7 +65,7 @@ public class PhysicsEngine2D : IPhysicsEngine2D
|
||||||
if (c1.RigidBody2D is not IRigidBody2D)
|
if (c1.RigidBody2D is not IRigidBody2D)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Line vertexTrajectory = new Line(vertex, vertex - c1.RigidBody2D.Velocity * intervalDeltaTime);
|
Line vertexTrajectory = new Line(vertex - c1.RigidBody2D.Velocity * intervalDeltaTime, vertex);
|
||||||
if (vertexTrajectory.LengthSquared <= 0.001f)
|
if (vertexTrajectory.LengthSquared <= 0.001f)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ public class PhysicsEngine2D : IPhysicsEngine2D
|
||||||
if (!hasIntersectedWithLines)
|
if (!hasIntersectedWithLines)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
float rewindInterval = t * intervalDeltaTime;
|
float rewindInterval = intervalDeltaTime - t * intervalDeltaTime;
|
||||||
StepRigidBody(c1.RigidBody2D, -rewindInterval);
|
StepRigidBody(c1.RigidBody2D, -rewindInterval);
|
||||||
|
|
||||||
c1.RigidBody2D.Velocity = Vector2.Reflect(c1.RigidBody2D.Velocity, normal);
|
c1.RigidBody2D.Velocity = Vector2.Reflect(c1.RigidBody2D.Velocity, normal);
|
||||||
|
@ -115,7 +115,13 @@ public class PhysicsEngine2D : IPhysicsEngine2D
|
||||||
{
|
{
|
||||||
Vector2 vertex = collider2D.Vertices[y];
|
Vector2 vertex = collider2D.Vertices[y];
|
||||||
if (collider2DItem.CheckCollision(vertex))
|
if (collider2DItem.CheckCollision(vertex))
|
||||||
|
{
|
||||||
OnCollisionDetectedAction?.Invoke(collider2D, collider2DItem, vertex);
|
OnCollisionDetectedAction?.Invoke(collider2D, collider2DItem, vertex);
|
||||||
|
OnCollisionDetectedAction?.Invoke(collider2DItem, collider2D, vertex);
|
||||||
|
collider2D.Recalculate();
|
||||||
|
collider2DItem.Recalculate();
|
||||||
|
y--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ namespace Syntriax.Engine.Physics2D.Primitives;
|
||||||
|
|
||||||
public record Line(Vector2 From, Vector2 To)
|
public record Line(Vector2 From, Vector2 To)
|
||||||
{
|
{
|
||||||
|
public Line Reversed => new(To, From);
|
||||||
public Vector2 Direction => Vector2.Normalize(To - From);
|
public Vector2 Direction => Vector2.Normalize(To - From);
|
||||||
public float Length => (From - To).Length();
|
public float Length => (From - To).Length();
|
||||||
public float LengthSquared => (From - To).LengthSquared();
|
public float LengthSquared => (From - To).LengthSquared();
|
||||||
|
@ -39,7 +40,15 @@ public record Line(Vector2 From, Vector2 To)
|
||||||
|
|
||||||
pointX -= min;
|
pointX -= min;
|
||||||
|
|
||||||
return pointX / max;
|
float t = pointX / max;
|
||||||
|
|
||||||
|
// FIXME
|
||||||
|
// I don't even know, apparently whatever I wrote up there doesn't take into account of the direction of the line
|
||||||
|
// Which... I can see how, but I am also not sure how I can make it take into account. Or actually I'm for some reason
|
||||||
|
// too unmotivated to find a solution. Future me, find a better way if possible, please.
|
||||||
|
if (!Lerp(t).ApproximatelyEquals(point))
|
||||||
|
return 1f - t;
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Exist(List<Vector2> vertices)
|
public bool Exist(List<Vector2> vertices)
|
||||||
|
@ -60,9 +69,22 @@ public record Line(Vector2 From, Vector2 To)
|
||||||
}
|
}
|
||||||
|
|
||||||
public float IntersectionParameterT(Line other)
|
public float IntersectionParameterT(Line other)
|
||||||
=> ((other.From.X - From.X) * (To.Y - From.Y) - (other.From.Y - From.Y) * (To.X - From.X)) /
|
{
|
||||||
((other.To.Y - other.From.Y) * (To.X - From.X) - (other.To.X - other.From.X) * (To.Y - From.Y));
|
float numerator = (From.X - other.From.X) * (other.From.Y - other.To.Y) - (From.Y - other.From.Y) * (other.From.X - other.To.X);
|
||||||
|
float denominator = (From.X - To.X) * (other.From.Y - other.To.Y) - (From.Y - To.Y) * (other.From.X - other.To.X);
|
||||||
|
|
||||||
|
// Lines are parallel
|
||||||
|
if (denominator == 0)
|
||||||
|
return float.NaN;
|
||||||
|
|
||||||
|
return numerator / denominator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector2 Lerp(float t)
|
||||||
|
=> new Vector2(
|
||||||
|
From.X + (To.X - From.X) * t,
|
||||||
|
From.Y + (To.Y - From.Y) * t
|
||||||
|
);
|
||||||
|
|
||||||
public Vector2 Resolve(float x)
|
public Vector2 Resolve(float x)
|
||||||
=> new Vector2(x, LineEquation.Resolve(x));
|
=> new Vector2(x, LineEquation.Resolve(x));
|
||||||
|
|
Loading…
Reference in New Issue