public AABBCollisionComponent(GameObject parent, bool active) : base(parent) { this.CollisionBoxes = new List<AABB>(); this.Active = active; this.Collided = false; this.ProjectionSegment = new SegmentVec2(Vector2.Zero, Vector2.Zero); }
public AABB(PositionComponent parentPosition, Vector2 offsetPosition, int width, int height) { this.Position = offsetPosition; this.Width = width; this.Height = height; this._parentPositionComponent = parentPosition; this.Collided = false; this.ProjectionSegment = new SegmentVec2(Vector2.Zero, Vector2.Zero); }
private void findCollisions(GameObject obj1, GameObject obj2) { PositionComponent obj1PosComponent = (PositionComponent)obj1.GetComponent(ComponentType.Position); PositionComponent obj2PosComponent = (PositionComponent)obj2.GetComponent(ComponentType.Position); AABBCollisionComponent obj1ColComponent = (AABBCollisionComponent)obj1.GetComponent(ComponentType.AABBCollision); AABBCollisionComponent obj2ColComponent = (AABBCollisionComponent)obj2.GetComponent(ComponentType.AABBCollision); SegmentVec2 projectionSegment = new SegmentVec2(Vector2.Zero, Vector2.Zero); SegmentVec2 overlapSegment; SegmentVec2 smallestOverlapSegment = new SegmentVec2(Vector2.Zero, new Vector2(999, 999)); bool collision = true; foreach (AABB box in obj2ColComponent.CollisionBoxes) { box.Collided = false; } foreach (AABB box1 in obj1ColComponent.CollisionBoxes) { box1.Collided = false; foreach (AABB box2 in obj2ColComponent.CollisionBoxes) { collision = true; foreach (LineParametric axis in this._axes) { SegmentParametric box1Proj = LibFunc.GetParametricProjection(axis, box1.GetVertices()); SegmentParametric box2Proj = LibFunc.GetParametricProjection(axis, box2.GetVertices()); overlapSegment = LibFunc.GetOverlapSegmentVec2(box1Proj, box2Proj); if (overlapSegment.GetVector2().LengthSquared() == 0) { collision = false; break; } else { if (overlapSegment.GetVector2().LengthSquared() < smallestOverlapSegment.GetVector2().LengthSquared()) { smallestOverlapSegment = overlapSegment; } } } if (collision) { box1.Collided = true; box2.Collided = true; if (smallestOverlapSegment.GetVector2().LengthSquared() > projectionSegment.GetVector2().LengthSquared()) { projectionSegment = smallestOverlapSegment; } } } } if (projectionSegment.GetVector2().LengthSquared() != 0) { obj1ColComponent.Collided = true; obj1ColComponent.ProjectionSegment = projectionSegment; } }