namespace Pong.Scripts.Data; /// /// a record class that represents the game area. /// public record GameArea { /// /// the X coordinate of the GameArea wrapped in a struct that makes operating on it easier. this is divided /// by 2 in the constructor to represent both sides of the screen by either negative or positive of the number. /// public GameCoordinate X { get; } /// /// the Y coordinate of the GameArea wrapped in a struct that makes operating on it easier. this is divided /// by 2 in the constructor to represent both sides of the screen by either negative or positive of the number. /// public GameCoordinate Y { get; } /// /// take a global position inside the game area and normalize it to a value between 0 and 1 which represents the game area. /// /// a Vector2 containing a global position inside the game area. public Vector2 NormalizePosition(Vector2 globalPosition) { float normalizedX = (float)Mathf.InverseLerp(-X.ByWallSizeExtents, X.ByWallSizeExtents, globalPosition.X); float normalizedY = (float)Mathf.InverseLerp(-Y.ByWallSizeExtents, Y.ByWallSizeExtents, globalPosition.Y); return new Vector2(normalizedX, normalizedY); } /// /// take a normalized position and convert it back into a globalized position. /// /// a Vector2 containing a normalized position. public Vector2 GlobalizePosition(Vector2 normalizedPosition) { float globalizedX = (float)Mathf.Lerp(-X.ByWallSizeExtents, X.ByWallSizeExtents, normalizedPosition.X); float globalizedY = (float)Mathf.Lerp(-Y.ByWallSizeExtents, Y.ByWallSizeExtents, normalizedPosition.Y); return new Vector2(globalizedX, globalizedY); } public GameArea(Vector2 area) { X = new GameCoordinate(area.X / 2); Y = new GameCoordinate(area.Y / 2); } }