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);
 }
예제 #2
0
 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);
 }
예제 #3
0
        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;
            }
        }