Exemplo n.º 1
0
        private Tuple <Vector2, bool> CollisionByVectorSubstraction(SpriteBase collisioner, SpriteBase collisioned)
        {
            var x1 = collisioner.Position.X;
            var y1 = collisioner.Position.Y;
            var w1 = collisioner.CyclicalFrameSize.X;
            var h1 = collisioner.CyclicalFrameSize.Y;

            var x2 = collisioned.Position.X;
            var y2 = collisioned.Position.Y;
            var w2 = collisioned.Size.X;
            var h2 = collisioned.Size.Y;

            if ((y1 <= y2 && y1 + h1 > y2) ||
                (y1 >= y2 && y1 <= y2 + h2) ||
                (y1 >= y2 && y1 >= y2 + h2))
            {
                if (x1 > x2 && x1 + w1 < x2 + w2)
                {
                    return(new Tuple <Vector2, bool>(new Vector2(0, -collisioner.Speed.Y), true));
                }

                double dx = x1 <= x2 && x1 + w1 > x2
                    ? Math.Abs(x1 + w1 - x2)
                    : x1 > x2 && x1 < x2 + w2
                        ? Math.Abs(x1 - x2 + w2)
                        : 0;

                if (dx.Equals(0))
                {
                    return(_tupleZero);
                }

                double dy = y1 >= y2?Math.Abs(y1 - y2) : Math.Abs(y1 - y2 + h2);

                return(dx >= dy
                    ? new Tuple <Vector2, bool>(new Vector2(-collisioner.Speed.X, 0), false)
                    : new Tuple <Vector2, bool>(new Vector2(0, -collisioner.Speed.Y), true));
            }
            return(_tupleZero);
        }
Exemplo n.º 2
0
        private Tuple <Vector2, bool> CollisionByMinimumDistanceOfGreatestVector(
            SpriteBase collisioner,
            SpriteBase collisioned)
        {
            var x1 = (int)collisioner.Position.X;
            var y1 = (int)collisioner.Position.Y;
            var w1 = (int)collisioner.CyclicalFrameSize.X;
            var h1 = (int)collisioner.CyclicalFrameSize.Y;

            var x2 = (int)collisioned.Position.X;
            var y2 = (int)collisioned.Position.Y;
            var w2 = (int)collisioned.Size.X;
            var h2 = (int)collisioned.Size.Y;

            var collisionVector = GetGreatestVector(collisioned, x1, w1, y1, h1, x2, y2);

            if (!collisionVector.Equals(Vector2.Zero))
            {
                var componentX = Math.Abs(collisionVector.X);
                var componentY = Math.Abs(collisionVector.Y);

                if (componentX < componentY)
                {
                    return(new Tuple <Vector2, bool>(-new Vector2(componentX, 0), false));
                }
                else if (componentX.Equals(componentY))
                {
                    return(new Tuple <Vector2, bool>(-new Vector2(componentX, componentY), false));
                }
                else
                {
                    return(new Tuple <Vector2, bool>(-new Vector2(0, componentY), true));
                }
            }
            return(new Tuple <Vector2, bool>(Vector2.Zero, false));
        }
Exemplo n.º 3
0
 public bool InCollision(SpriteBase spriteBase)
 {
     return(RectangleCollision.Intersects(spriteBase.RectangleCollision));
 }
Exemplo n.º 4
0
        private Vector2 GetGreatestVector(SpriteBase collisioned, int x1, int w1, int y1, int h1, int x2, int y2)
        {
            var vector = new Tuple <Vector2, double>(Vector2.Zero, 0);

            for (int i = 0; i < 4; i++)
            {
                var x1PlusW1 = x1 + w1;
                var y1PlusH1 = y1 + h1;

                switch (i)
                {
                case 0:
                {
                    if (collisioned.RectangleCollision.Contains(x1, y1))
                    {
                        var candidate = GetVectorFromPointToPoint(x1, y1, x2, y2);
                        if (candidate.Item2 > vector.Item2)
                        {
                            vector.Item1 = candidate.Item1;
                        }
                    }
                    break;
                }

                case 1:
                {
                    if (collisioned.RectangleCollision.Contains(x1PlusW1, y1))
                    {
                        var candidate = GetVectorFromPointToPoint(x1PlusW1, y1, x2, y2);
                        if (candidate.Item2 > vector.Item2)
                        {
                            vector.Item1 = candidate.Item1;
                        }
                    }
                    break;
                }

                case 2:
                {
                    if (collisioned.RectangleCollision.Contains(x1, y1PlusH1))
                    {
                        var candidate = GetVectorFromPointToPoint(x1, y1PlusH1, x2, y2);
                        if (candidate.Item2 > vector.Item2)
                        {
                            vector.Item1 = candidate.Item1;
                        }
                    }
                    break;
                }

                case 3:
                {
                    if (collisioned.RectangleCollision.Contains(x1PlusW1, y1PlusH1))
                    {
                        var candidate = GetVectorFromPointToPoint(x1PlusW1, y1PlusH1, x2, y2);
                        if (candidate.Item2 > vector.Item2)
                        {
                            vector.Item1 = candidate.Item1;
                        }
                    }
                    break;
                }
                }
            }
            return(vector.Item1);
        }
Exemplo n.º 5
0
 private Tuple <Vector2, bool> Collision(SpriteBase collisioner, SpriteBase collisioned)
 {
     return(collisionMethod.Invoke(collisioner, collisioned));
 }
Exemplo n.º 6
0
 private Tuple <Vector2, bool> HandleCollision(SpriteBase spriteUser, SpriteBase sprite)
 {
     return(Collision(spriteUser, sprite));
 }