Tetstests

This commit is contained in:
Syntriax 2023-12-05 14:47:17 +03:00
parent 1e8cc82dc4
commit b8706e82d8
3 changed files with 104 additions and 18 deletions

View File

@ -112,6 +112,12 @@ public class Game1 : Game
goPlayAreaLeft.BehaviourController.AddBehaviour<Collider2DBehaviour>((System.Collections.Generic.IList<Vector2>)[new Vector2(.5f, .5f), new Vector2(-.5f, .5f), new Vector2(.5f, -.5f), new Vector2(-.5f, -.5f)]);
engine.AddRigidBody(goPlayAreaLeft.BehaviourController.AddBehaviour<RigidBody2D>());
// IGameObject goPlayAreaCenter = gameManager.InstantiateGameObject<GameObject>();
// goPlayAreaCenter.Transform.Position = new Vector2(100f, 100f);
// goPlayAreaCenter.Transform.Scale = new Vector2(40f, 40f);
// // goPlayAreaCenter.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>().Assign(spriteBox);
// goPlayAreaCenter.BehaviourController.AddBehaviour<Collider2DBehaviour>((System.Collections.Generic.IList<Vector2>)[new Vector2(.5f, .5f), new Vector2(-.5f, .5f), new Vector2(.5f, -.5f), new Vector2(-.5f, -.5f)]);
// engine.AddRigidBody(goPlayAreaCenter.BehaviourController.AddBehaviour<RigidBody2D>());
// TODO: use this.Content to load your game content here
}
@ -150,8 +156,17 @@ public class Game1 : Game
if (Keyboard.GetState().IsKeyDown(Keys.Space))
seconds += gameTime.ElapsedGameTime.Milliseconds * .0005f;
if (Keyboard.GetState().IsKeyDown(Keys.B))
{
seconds -= gameTime.ElapsedGameTime.Milliseconds * .0005f;
while (physicsTimer - 0.01f > seconds)
{
Console.WriteLine($"Physics Timer: {physicsTimer}");
physicsTimer -= 0.01f;
engine.Step(-.01f);
}
}
// TODO: Add your update logic here
while (physicsTimer + 0.01f < seconds)
{
Console.WriteLine($"Physics Timer: {physicsTimer}");

View File

@ -64,15 +64,12 @@ public class Collider2DBehaviour(IList<Vector2> vertices) : BehaviourOverride, I
Vector2 contactPoint = ClosestPointOnEdge(point, edge);
Vector2 normal = contactPoint - point;
if (normal.LengthSquared() < 0.001f)
normal = new Vector2(0f, 1f);
normal.Normalize();
collisionInformation = new CollisionInformation(normal, contactPoint);
GameObject gameObject = Game1.gameManager.InstantiateGameObject<GameObject>();
gameObject.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>().Assign(Game1.spriteBox);
gameObject.Transform.Position = point;
gameObject.Transform.Scale = new Vector2(1f, .01f) * 100f;
gameObject.Transform.Rotation = (float)Math.Atan2(normal.Y, normal.X);
break;
}
return true;
@ -142,18 +139,54 @@ public class Collider2DBehaviour(IList<Vector2> vertices) : BehaviourOverride, I
triangles.RemoveAt(i);
}
// for (int i = 0; i < triangles.Count; i++)
// {
// Triangle triangle = triangles[i];
// triangle.A += Transform.Position;
// triangle.B += Transform.Position;
// triangle.C += Transform.Position;
// triangles[i] = triangle;
// }
for (int i = gameObjects.Count - 1; i >= 0; i--)
{
IGameObject gameObject = gameObjects[i];
Game1.gameManager.RemoveGameObject(gameObject);
gameObjects.RemoveAt(i);
}
for (int i = 0; i < triangles.Count; i++)
{
Triangle triangle = triangles[i];
foreach (var edge in GetEdges(triangle))
{
GameObject gameObject = Game1.gameManager.InstantiateGameObject<GameObject>();
DisplayableSpriteBehaviour displayableSpriteBehaviour = gameObject.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>();
displayableSpriteBehaviour.Color = Color.Aqua;
displayableSpriteBehaviour.Origin = new(0.5f, 1f);
displayableSpriteBehaviour.Assign(Game1.spriteBox);
gameObject.Transform.Position = edge.A;
Vector2 vector2 = edge.B - edge.A;
gameObject.Transform.Scale = new Vector2(2f, .0f) + Vector2.UnitY * vector2.Length();
gameObject.Transform.Rotation = (float)Math.Atan2(vector2.X, vector2.Y);
gameObjects.Add(gameObject);
gameObject = Game1.gameManager.InstantiateGameObject<GameObject>();
displayableSpriteBehaviour = gameObject.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>();
displayableSpriteBehaviour.Color = Color.Crimson;
displayableSpriteBehaviour.Assign(Game1.spriteBox);
gameObject.Transform.Position = edge.B;
gameObject.Transform.Scale = new Vector2(4f, 4f);
gameObjects.Add(gameObject);
}
}
foreach (var vertex in Vertices)
{
GameObject gameObject = Game1.gameManager.InstantiateGameObject<GameObject>();
DisplayableSpriteBehaviour displayableSpriteBehaviour = gameObject.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>();
displayableSpriteBehaviour.Color = Color.GreenYellow;
displayableSpriteBehaviour.Assign(Game1.spriteBox);
gameObject.Transform.Position = vertex;
gameObject.Transform.Scale = new Vector2(2f, 2f);
gameObjects.Add(gameObject);
}
}
private List<IGameObject> gameObjects = new List<IGameObject>(32);
private Vector2 ClosestPointOnEdge(Vector2 point, Edge edge)
{
// Convert edge points to vectors

View File

@ -1,7 +1,10 @@
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Pong;
using Syntriax.Engine.Core;
using Syntriax.Engine.Core.Abstract;
using Syntriax.Engine.Graphics.TwoDimensional;
using Syntriax.Engine.Physics2D.Abstract;
namespace Syntriax.Engine.Physics2D;
@ -54,10 +57,10 @@ public class PhysicsEngine2D : IPhysicsEngine2D
for (int colliderIY = colliderIX + 1; colliderIY < colliders.Count; colliderIY++)
for (int verticesIndex = 0; verticesIndex < colliderX.Vertices.Count; verticesIndex++)
{
if (!colliders[colliderIY].CheckCollision(colliderX.Vertices[verticesIndex], colliderX, out var collisionInformation))
ICollider2D colliderY = colliders[colliderIY];
if (!colliderY.CheckCollision(colliderX.Vertices[verticesIndex], colliderX, out var collisionInformation))
continue;
ICollider2D colliderY = colliders[colliderIY];
if (colliderX.BehaviourController.TryGetBehaviour(out IRigidBody2D? rigidX))
{
Vector2 xVertex = colliderX.Vertices[verticesIndex];
@ -68,10 +71,45 @@ public class PhysicsEngine2D : IPhysicsEngine2D
rigidX.Velocity = Vector2.Reflect(rigidX.Velocity, collisionInformation.Normal);
rigidX.Transform.Position -= xVertex - vertexNewPosition;
// {
// GameObject gameObject = Game1.gameManager.InstantiateGameObject<GameObject>();
// DisplayableSpriteBehaviour displayableSpriteBehaviour = gameObject.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>();
// displayableSpriteBehaviour.Assign(Game1.spriteBox);
// gameObject.Transform.Position = collisionInformation.ContactPosition;
// gameObject.Transform.Scale = new Vector2(1f, .01f) * 100f;
// gameObject.Transform.Rotation = (float)Math.Atan2(collisionInformation.Normal.Y, collisionInformation.Normal.X);
// }
// {
// GameObject gameObject = Game1.gameManager.InstantiateGameObject<GameObject>();
// DisplayableSpriteBehaviour displayableSpriteBehaviour = gameObject.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>();
// displayableSpriteBehaviour.Color = Color.Aqua;
// displayableSpriteBehaviour.Assign(Game1.spriteBox);
// gameObject.Transform.Position = collisionInformation.ContactPosition;
// gameObject.Transform.Scale = new Vector2(1f, .01f) * 100f;
// gameObject.Transform.Rotation = (float)Math.Atan2(rigidX.Velocity.Y, rigidX.Velocity.X);
// }
// {
// GameObject gameObject = Game1.gameManager.InstantiateGameObject<GameObject>();
// DisplayableSpriteBehaviour displayableSpriteBehaviour = gameObject.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>();
// displayableSpriteBehaviour.Color = Color.Pink;
// displayableSpriteBehaviour.Assign(Game1.spriteBox);
// gameObject.Transform.Position = collisionInformation.ContactPosition;
// gameObject.Transform.Scale = new Vector2(1f, .01f) * 100f;
// gameObject.Transform.Rotation = (float)Math.Atan2(edgeDirection.Y, edgeDirection.X);
// }
// {
// GameObject gameObject = Game1.gameManager.InstantiateGameObject<GameObject>();
// DisplayableSpriteBehaviour displayableSpriteBehaviour = gameObject.BehaviourController.AddBehaviour<DisplayableSpriteBehaviour>();
// displayableSpriteBehaviour.Color = Color.DarkGoldenrod;
// displayableSpriteBehaviour.Assign(Game1.spriteBox);
// gameObject.Transform.Position = collisionInformation.ContactPosition;
// gameObject.Transform.Scale = new Vector2(1f, .01f) * 100f;
// gameObject.Transform.Rotation = (float)Math.Atan2((xVertex - p1).Y, (xVertex - p1).X);
// }
StepRigidBody(rigidX, intervalDeltaTime * (1f - t));
colliders[colliderIX].RecalculateVertices();
}
Console.WriteLine($"/////////////////////////////////////////////");
// Console.WriteLine($"Collision");
}