private bool CheckShapeIntersection(Vector2 posA, float cosA, float sinA, float scaleA, CollisionShape shapeA,
                                            Vector2 posB, float cosB, float sinB, float scaleB, CollisionShape shapeB)
        {
            CircleCollisionShape  circleA  = shapeA as CircleCollisionShape;
            PolygonCollisionShape polygonA = shapeA as PolygonCollisionShape;

            CircleCollisionShape  circleB  = shapeB as CircleCollisionShape;
            PolygonCollisionShape polygonB = shapeB as PolygonCollisionShape;

            if (circleA != null && circleB != null)
            {
                return(CheckCircleCircleIntersection(posA, circleA,
                                                     posB, circleB));
            }

            if (circleB != null && polygonA != null)
            {
                return(CheckPolygonCircleIntersection(posA, cosA, sinA, scaleA, polygonA,
                                                      posB, circleB));
            }
            if (circleA != null && polygonB != null)
            {
                return(CheckPolygonCircleIntersection(posB, cosB, sinB, scaleB, polygonB,
                                                      posA, circleA));
            }

            if (polygonA != null && polygonB != null)
            {
                return(CheckPolygonPolygonIntersection(posA, cosA, sinA, scaleA, polygonA,
                                                       posB, cosB, sinB, scaleB, polygonB));
            }

            return(false);
        }
        private bool CheckPolygonCircleIntersection(Vector2 posA, float cosA, float sinA, float scaleA, PolygonCollisionShape polygonA,
                                                    Vector2 posB, CircleCollisionShape circleB)
        {
            Vector2[] worldPolyA = new Vector2[polygonA.Vertices.Length];
            for (int i = 0; i < polygonA.Vertices.Length; i++)
            {
                worldPolyA[i] = new Vector2(cosA * polygonA.Vertices[i].X - sinA * polygonA.Vertices[i].Y,
                                            sinA * polygonA.Vertices[i].X + cosA * polygonA.Vertices[i].Y) * scaleA + posA;
            }

            BoundingCircle worldCircleB = new BoundingCircle(posB, circleB.Radius);

            for (int i = 0; i < worldPolyA.Length; i++)
            {
                int j = (i + 1) % worldPolyA.Length;

                Vector2 v1 = worldPolyA[j];
                Vector2 v2 = worldPolyA[i];

                // Check vertices; guarenteed to intersect if vertices
                // are contained and less expensive than a segment intersection
                // test.
                if (worldCircleB.Contains(v1) || worldCircleB.Contains(v2))
                {
                    return(true);
                }

                // Cast circle position onto segment
                Vector2 segment         = v2 - v1;
                float   circleOnSegment = Vector2.Dot(segment, worldCircleB.Position);
                // Make sure segment is along the segment
                if (circleOnSegment < 0)
                {
                    continue;
                }
                if (circleOnSegment * circleOnSegment > segment.LengthSquared())
                {
                    continue;
                }
                // Find point along segment
                segment.Normalize();
                Vector2 intersectionPoint = segment * circleOnSegment + v1;
                // Check for intersection of intersection point
                if (worldCircleB.Contains(intersectionPoint))
                {
                    return(true);
                }
            }

            return(false);
        }
 private bool CheckCircleCircleIntersection(Vector2 posA, CircleCollisionShape circleA,
                                            Vector2 posB, CircleCollisionShape circleB)
 {
     return((posB - posA).LengthSquared() < circleB.RadiusSquared + circleA.RadiusSquared);
 }
Ejemplo n.º 4
0
        public void Draw(Matrix transformMatrix, float dt)
        {
            SpriteBatch.Begin(SpriteSortMode.Deferred,
                              BlendState.Opaque,
                              SamplerState.PointClamp,
                              null,
                              null,
                              null,
                              transformMatrix);

            foreach (Entity entity in _collisionEntities)
            {
                CollisionComponent collisionComp = entity.GetComponent <CollisionComponent>();
                TransformComponent transformComp = entity.GetComponent <TransformComponent>();

                Vector2 position = transformComp.Position * FlipY;


                float cos   = (float)Math.Cos(-transformComp.Rotation);
                float sin   = (float)Math.Sin(-transformComp.Rotation);
                float scale = transformComp.Scale;

                foreach (CollisionShape shape in collisionComp.CollisionShapes)
                {
                    Vector2 rotatedOffset = rotateAroundOrigin(shape.Offset, cos, sin);

                    BoundingRect AABB = shape.GetAABB(cos, sin, scale);
                    AABB.Min += position;
                    AABB.Max += position;
                    SpriteBatch.DrawRectangle(new Rectangle((int)AABB.Left,
                                                            (int)AABB.Bottom,
                                                            (int)AABB.Width,
                                                            (int)AABB.Height),
                                              Color.BlueViolet,
                                              1);

                    CircleCollisionShape circleCollisionShape = shape as CircleCollisionShape;
                    if (circleCollisionShape != null)
                    {
                        SpriteBatch.DrawCircle(position + rotatedOffset * scale,
                                               circleCollisionShape.Radius * scale,
                                               25,
                                               Color.YellowGreen);
                    }

                    PolygonCollisionShape polygonCollisionShape = shape as PolygonCollisionShape;
                    if (polygonCollisionShape != null)
                    {
                        for (int i = 0; i < polygonCollisionShape.Vertices.Length; i++)
                        {
                            Vector2 v1 = polygonCollisionShape.Vertices[i] * FlipY;
                            Vector2 v2 = polygonCollisionShape.Vertices[(i + 1) % polygonCollisionShape.Vertices.Length] * FlipY;
                            SpriteBatch.DrawLine(position + (rotatedOffset + rotateAroundOrigin(v1, cos, sin)) * scale,
                                                 position + (rotatedOffset + rotateAroundOrigin(v2, cos, sin)) * scale,
                                                 Color.YellowGreen);
                        }
                    }
                }
            }

            SpriteBatch.End();
        }