/// <summary> /// Get the direction as a <see cref="Vector2"/> /// </summary> /// <param name="dir"></param> /// <returns></returns> public static Vector2 ToVector2(this EDirection8 dir) { switch (dir) { case EDirection8.None: return(Vector2.zero); case EDirection8.Up: return(Vector2.up); case EDirection8.UpRight: return(Vector2.up + Vector2.right); case EDirection8.Right: return(Vector2.right); case EDirection8.DownRight: return(Vector2.down + Vector2.right); case EDirection8.Down: return(Vector2.down); case EDirection8.DownLeft: return(Vector2.down + Vector2.left); case EDirection8.Left: return(Vector2.left); case EDirection8.UpLeft: return(Vector2.up + Vector2.left); default: throw new ArgumentOutOfRangeException("dir", dir, null); } }
/// <summary> /// Converts a <see cref="EDirection8"/> to a <see cref="EDirection2"/>. /// </summary> /// <param name="dir8"></param> /// <returns></returns> public static EDirection2 To2(this EDirection8 dir8) { switch (dir8) { case EDirection8.None: return(EDirection2.None); case EDirection8.Up: case EDirection8.Down: return(EDirection2.Vertical); case EDirection8.Right: case EDirection8.Left: return(EDirection2.Horizontal); case EDirection8.DownRight: case EDirection8.DownLeft: case EDirection8.UpLeft: case EDirection8.UpRight: throw new InvalidEnumArgumentException("Direction cannot be diagonal"); default: throw new ArgumentOutOfRangeException("dir8", dir8, null); } }
/// <summary> /// Get the opposite <see cref="EDirection8"/> of the given value /// </summary> /// <param name="dir"></param> /// <returns></returns> public static EDirection8 Opposite(this EDirection8 dir) { if (dir == EDirection8.None) { return(EDirection8.None); } return((EDirection8)(((int)dir + 3) % (dir.Count() - 1) + 1)); }
/// <summary> /// Converts an <see cref="EDirection8"/> to <see cref="EDirection4"/>. Throws an exception if given value is diagonal. /// </summary> /// <param name="dir8"></param> /// <returns></returns> public static EDirection4 To4(this EDirection8 dir8) { if (dir8 == EDirection8.None) { return(EDirection4.None); } if (((int)dir8).IsEven()) { throw new InvalidEnumArgumentException("dir8", (int)dir8, dir8.GetType()); } return((EDirection4)(((int)dir8 + 1) / 2)); }
/// <summary> /// Check to see if both <see cref="EDirection8s"/> are opposite to each other /// </summary> /// <param name="lhs"></param> /// <param name="rhs"></param> /// <returns>True if opposite</returns> public static bool IsOpposite(this EDirection8 lhs, EDirection8 rhs) { return(lhs != EDirection8.None && rhs != EDirection8.None && Math.Abs((int)lhs - (int)rhs) == 4); }