Beispiel #1
0
 public static List<Point> FindCollisionTile(int Direction, Vector2 position, float testMagnitude, int Width, int Height, bool fallThrough = false, bool fall2 = false, int gravDir = 1, bool checkCardinals = true, bool checkSlopes = false)
 {
     List<Point> list = new List<Point>();
     switch (Direction)
     {
     case 0:
     case 1:
     {
         Vector2 vector = (Direction == 0) ? (Vector2.UnitX * testMagnitude) : (-Vector2.UnitX * testMagnitude);
         Vector4 vec = new Vector4(position, vector.X, vector.Y);
         int num = (int)(position.X + (float)((Direction == 0) ? Width : 0)) / 16;
         float num2 = Math.Min(16f - position.Y % 16f, (float)Height);
         float num3 = num2;
         if (checkCardinals && Collision.TileCollision(position - vector, vector, Width, (int)num2, fallThrough, fall2, gravDir) != vector)
         {
             list.Add(new Point(num, (int)position.Y / 16));
         }
         else if (checkSlopes && Collision.SlopeCollision(position, vector, Width, (int)num2, (float)gravDir, fallThrough).XZW() != vec.XZW())
         {
             list.Add(new Point(num, (int)position.Y / 16));
         }
         while (num3 + 16f <= (float)(Height - 16))
         {
             if (checkCardinals && Collision.TileCollision(position - vector + Vector2.UnitY * num3, vector, Width, 16, fallThrough, fall2, gravDir) != vector)
             {
                 list.Add(new Point(num, (int)(position.Y + num3) / 16));
             }
             else if (checkSlopes && Collision.SlopeCollision(position + Vector2.UnitY * num3, vector, Width, 16, (float)gravDir, fallThrough).XZW() != vec.XZW())
             {
                 list.Add(new Point(num, (int)(position.Y + num3) / 16));
             }
             num3 += 16f;
         }
         int height = Height - (int)num3;
         if (checkCardinals && Collision.TileCollision(position - vector + Vector2.UnitY * num3, vector, Width, height, fallThrough, fall2, gravDir) != vector)
         {
             list.Add(new Point(num, (int)(position.Y + num3) / 16));
         }
         else if (checkSlopes && Collision.SlopeCollision(position + Vector2.UnitY * num3, vector, Width, height, (float)gravDir, fallThrough).XZW() != vec.XZW())
         {
             list.Add(new Point(num, (int)(position.Y + num3) / 16));
         }
         break;
     }
     case 2:
     case 3:
     {
         Vector2 vector = (Direction == 2) ? (Vector2.UnitY * testMagnitude) : (-Vector2.UnitY * testMagnitude);
         Vector4 vec = new Vector4(position, vector.X, vector.Y);
         int num = (int)(position.Y + (float)((Direction == 2) ? Height : 0)) / 16;
         float num4 = Math.Min(16f - position.X % 16f, (float)Width);
         float num5 = num4;
         if (checkCardinals && Collision.TileCollision(position - vector, vector, (int)num4, Height, fallThrough, fall2, gravDir) != vector)
         {
             list.Add(new Point((int)position.X / 16, num));
         }
         else if (checkSlopes && Collision.SlopeCollision(position, vector, (int)num4, Height, (float)gravDir, fallThrough).YZW() != vec.YZW())
         {
             list.Add(new Point((int)position.X / 16, num));
         }
         while (num5 + 16f <= (float)(Width - 16))
         {
             if (checkCardinals && Collision.TileCollision(position - vector + Vector2.UnitX * num5, vector, 16, Height, fallThrough, fall2, gravDir) != vector)
             {
                 list.Add(new Point((int)(position.X + num5) / 16, num));
             }
             else if (checkSlopes && Collision.SlopeCollision(position + Vector2.UnitX * num5, vector, 16, Height, (float)gravDir, fallThrough).YZW() != vec.YZW())
             {
                 list.Add(new Point((int)(position.X + num5) / 16, num));
             }
             num5 += 16f;
         }
         int width = Width - (int)num5;
         if (checkCardinals && Collision.TileCollision(position - vector + Vector2.UnitX * num5, vector, width, Height, fallThrough, fall2, gravDir) != vector)
         {
             list.Add(new Point((int)(position.X + num5) / 16, num));
         }
         else if (checkSlopes && Collision.SlopeCollision(position + Vector2.UnitX * num5, vector, width, Height, (float)gravDir, fallThrough).YZW() != vec.YZW())
         {
             list.Add(new Point((int)(position.X + num5) / 16, num));
         }
         break;
     }
     }
     return list;
 }