diff --git a/Game/Game1.cs b/Game/Game1.cs index eddfe0b..6fb4ce2 100644 --- a/Game/Game1.cs +++ b/Game/Game1.cs @@ -69,15 +69,23 @@ public class Game1 : Game gameObjectBall.BehaviourController.AddBehaviour().Assign(spriteBall); IGameObject gameObjectBall2 = gameManager.InstantiateGameObject(); gameObjectBall2.Name = "Ball2"; - gameObjectBall2.Transform.Position = Vector2.UnitY * -40; + gameObjectBall2.Transform.Position = Vector2.UnitY * -50f; gameObjectBall2.Transform.Scale = new Vector2(1f / 51.2f, 1f / 51.2f); RigidBody2D rigidBody = gameObjectBall2.BehaviourController.AddBehaviour(); - rigidBody.Velocity = Vector2.UnitY * 10f; + rigidBody.Velocity = Vector2.UnitY * 100f; engine.AddRigidBody(rigidBody); gameObjectBall2.BehaviourController.AddBehaviour((System.Collections.Generic.IList)[new Vector2(1, 1) * 5f, new Vector2(-1, 1) * 5f, new Vector2(1, -1) * 5f, new Vector2(-1, -1) * 5f]); // gameObjectBall2.BehaviourController.AddBehaviour(new Vector2(.1f, .1f), playAreaBehaviour, 100f); gameObjectBall2.BehaviourController.AddBehaviour().Assign(spriteBall); + IGameObject gameObjectBall3 = gameManager.InstantiateGameObject(); + gameObjectBall3.Name = "Ball"; + gameObjectBall3.Transform.Position = Vector2.UnitY * -120f + Vector2.UnitX * 10f; + gameObjectBall3.Transform.Scale = new Vector2(1f / 51.2f, 1f / 51.2f); + engine.AddRigidBody(gameObjectBall3.BehaviourController.AddBehaviour()); + gameObjectBall3.BehaviourController.AddBehaviour((System.Collections.Generic.IList)[new Vector2(1, 1) * 5f, new Vector2(-1, 1) * 5f, new Vector2(1, -1) * 5f, new Vector2(-1, -1) * 5f]); + // gameObjectBall3.BehaviourController.AddBehaviour(new Vector2(.1f, .1f), playAreaBehaviour, 100f); + gameObjectBall3.BehaviourController.AddBehaviour().Assign(spriteBall); // IGameObject gameObjectLeft = gameManager.InstantiateGameObject(); // gameObjectLeft.Name = "Left"; // gameObjectLeft.Transform.Position = new Vector2(-452, 0f); diff --git a/Game/Physics2D/Abstract/ICollider2D.cs b/Game/Physics2D/Abstract/ICollider2D.cs index f458b40..dad186f 100644 --- a/Game/Physics2D/Abstract/ICollider2D.cs +++ b/Game/Physics2D/Abstract/ICollider2D.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; - +using System.Diagnostics.CodeAnalysis; using Microsoft.Xna.Framework; using Syntriax.Engine.Core.Abstract; @@ -9,6 +9,8 @@ namespace Syntriax.Engine.Physics2D.Abstract; public interface ICollider2D : IBehaviour, IAssignableTransform { + IRigidBody2D? RigidBody2D { get; } + Action? OnCollision { get; set; } Vector2 OffsetPosition { get; set; } @@ -17,7 +19,7 @@ public interface ICollider2D : IBehaviour, IAssignableTransform IReadOnlyList Vertices { get; } - bool CheckCollision(Vector2 point, ICollider2D otherCollider); + bool CheckCollision(Vector2 point, ICollider2D otherCollider, out Vector2 normal); void RecalculateVertices(); } diff --git a/Game/Physics2D/Collider2DBehaviour.cs b/Game/Physics2D/Collider2DBehaviour.cs index e9672c7..0480eef 100644 --- a/Game/Physics2D/Collider2DBehaviour.cs +++ b/Game/Physics2D/Collider2DBehaviour.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; using Microsoft.Xna.Framework; using Syntriax.Engine.Core; @@ -13,26 +14,46 @@ public class Collider2DBehaviour(IList vertices) : BehaviourOverride, I { private List triangles = new List(32); private readonly List _vertices = new List(32); + private IRigidBody2D? _rigidBody2D = null; public Action? OnTransformAssigned { get => GameObject.OnTransformAssigned; set => GameObject.OnTransformAssigned = value; } public Action? OnCollision { get; set; } = null; + + private IList verticesOriginal { get; } = vertices; + public Vector2 OffsetPosition { get; set; } = Vector2.Zero; public Vector2 OffsetScale { get; set; } = Vector2.One; public float OffsetRotation { get; set; } = 0f; ITransform IAssignableTransform.Transform => Transform; + public IReadOnlyList Vertices => _vertices; + + public IRigidBody2D? RigidBody2D + { + get + { + if (_rigidBody2D is null) + BehaviourController.TryGetBehaviour(out _rigidBody2D); + + return _rigidBody2D; + } + } public bool Assign(ITransform transform) => GameObject.Assign(transform); - public bool CheckCollision(Vector2 point, ICollider2D otherCollider) + public bool CheckCollision(Vector2 point, ICollider2D otherCollider, out Vector2 normal) { + normal = Vector2.Zero; + foreach (var triangle in triangles) { if (!isInside(point, triangle)) continue; OnCollision?.Invoke(this, otherCollider); + + normal = Transform.Position - otherCollider.Transform.Position; return true; } @@ -44,7 +65,7 @@ public class Collider2DBehaviour(IList vertices) : BehaviourOverride, I triangles.Clear(); _vertices.Clear(); - foreach (var vertex in VerticesOriginal) + foreach (var vertex in verticesOriginal) _vertices.Add(vertex + Transform.Position); Triangle superTriangle = GetSuperTriangle(_vertices); @@ -227,7 +248,4 @@ public class Collider2DBehaviour(IList vertices) : BehaviourOverride, I return result; } - - public IList VerticesOriginal { get; } = vertices; - public IReadOnlyList Vertices => _vertices; } diff --git a/Game/Physics2D/CollisionInformation.cs b/Game/Physics2D/CollisionInformation.cs new file mode 100644 index 0000000..d7da43d --- /dev/null +++ b/Game/Physics2D/CollisionInformation.cs @@ -0,0 +1,12 @@ +using Microsoft.Xna.Framework; +using Syntriax.Engine.Physics2D.Abstract; + +namespace Syntriax.Engine.Physics2D; + +public record CollisionInformation +( + Vector2 Normal, + float Impulse, + IRigidBody2D? RigidBodyX, + IRigidBody2D? RigidBodyY +); diff --git a/Game/Physics2D/PhysicsEngine2D.cs b/Game/Physics2D/PhysicsEngine2D.cs index 35209da..7567262 100644 --- a/Game/Physics2D/PhysicsEngine2D.cs +++ b/Game/Physics2D/PhysicsEngine2D.cs @@ -59,10 +59,14 @@ public class PhysicsEngine2D : IPhysicsEngine2D for (int colliderIY = colliderIX + 1; colliderIY < colliders.Count; colliderIY++) foreach (var vertex in colliderX.Vertices) { - if (!colliders[colliderIY].CheckCollision(vertex, colliderX)) + if (!colliders[colliderIY].CheckCollision(vertex, colliderX, out var collisionInformation)) continue; - Console.WriteLine($"Collision"); + // Console.WriteLine($"Collision"); + // if (colliders[colliderIX].BehaviourController.TryGetBehaviour(out IRigidBody2D? rigidX)) + // rigidX.Velocity = -rigidX.Velocity; + // if (colliders[colliderIY].BehaviourController.TryGetBehaviour(out IRigidBody2D? rigidY)) + // rigidY.Velocity = -rigidY.Velocity; break; } }