diff options
| author | Matheus <matheus.guedes.mg.m@gmail.com> | 2025-09-10 12:34:20 -0300 |
|---|---|---|
| committer | Matheus <matheus.guedes.mg.m@gmail.com> | 2025-09-10 12:34:37 -0300 |
| commit | b8962990ddb75b874a49c83d8eeaba7b7e45c196 (patch) | |
| tree | 68124e2d5b87f17c6f778e8088a148745621feb9 | |
| parent | c6bbb834f7758027c0df338f1520f34fad3befea (diff) | |
Centralização da lógica de distância.
| -rw-r--r-- | scripts/Entities/Actors/AI/HostileEnemyAI.cs | 3 | ||||
| -rw-r--r-- | scripts/Utils/Grid.cs | 31 |
2 files changed, 33 insertions, 1 deletions
diff --git a/scripts/Entities/Actors/AI/HostileEnemyAI.cs b/scripts/Entities/Actors/AI/HostileEnemyAI.cs index dbcf98d..2f925c1 100644 --- a/scripts/Entities/Actors/AI/HostileEnemyAI.cs +++ b/scripts/Entities/Actors/AI/HostileEnemyAI.cs @@ -1,5 +1,6 @@ using Godot; using TheLegendOfGustav.Entities.Actions; +using TheLegendOfGustav.Utils; namespace TheLegendOfGustav.Entities.Actors.AI; @@ -21,7 +22,7 @@ public partial class HostileEnemyAI : BaseAI Vector2I offset = target.GridPosition - Body.GridPosition; // Distância entre o inimigo e o jogador. Leva em consideração somente // um dos eixos. - int distance = int.Max(int.Abs(offset.X), int.Abs(offset.Y)); + int distance = Grid.Distance(Body.GridPosition, target.GridPosition); // A ação executada no turno pode ser de ataque ou de movimento. Action action; diff --git a/scripts/Utils/Grid.cs b/scripts/Utils/Grid.cs index b744c60..e1fcde6 100644 --- a/scripts/Utils/Grid.cs +++ b/scripts/Utils/Grid.cs @@ -10,15 +10,46 @@ namespace TheLegendOfGustav.Utils; /// </summary> public abstract partial class Grid : GodotObject { + /// <summary> + /// Tamanho de cada tile em pixels. + /// </summary> public static readonly Vector2I tileSize = new(16, 16); + /// <summary> + /// Converte coordenadas do mundo (em pixels) para coordenadas do mapa (tiles). + /// </summary> + /// <param name="coord">Coordenada em pixels.</param> + /// <returns>Coordenada em tiles.</returns> public static Vector2I WorldToGrid(Vector2 coord) { return (Vector2I)(coord / tileSize); } + /// <summary> + /// Converte coordenadas do mapa (em tiles) para coordenadas do mundo (em pixels) + /// </summary> + /// <param name="coord">Coordenada em tiles</param> + /// <returns>Coordenada em pixels.</returns> public static Vector2 GridToWorld(Vector2I coord) { return coord * tileSize; } + + /// <summary> + /// Calcula a distância entre pontos A e B no mapa. + /// </summary> + /// <remarks> + /// A distância retornada não é a distância real mas sim a + /// maior distância em um único eixo. + /// Isso significa que uma área em volta de um ponto não é um + /// círculo, mas um quadrado. + /// Veja: https://en.wikipedia.org/wiki/Chebyshev_distance + /// </remarks> + /// <param name="a">Um ponto no mapa</param> + /// <param name="b">Um ponto no mapa</param> + /// <returns>A distância entre pontos <c>a</c> e <c>b.</c></returns> + public static int Distance(Vector2I a, Vector2I b) { + Vector2I distanceVector = b - a; + return int.Max(int.Abs(distanceVector.X), int.Abs(distanceVector.Y)); + } } |
