summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatheus <matheus.guedes.mg.m@gmail.com>2025-09-10 12:34:20 -0300
committerMatheus <matheus.guedes.mg.m@gmail.com>2025-09-10 12:34:37 -0300
commitb8962990ddb75b874a49c83d8eeaba7b7e45c196 (patch)
tree68124e2d5b87f17c6f778e8088a148745621feb9
parentc6bbb834f7758027c0df338f1520f34fad3befea (diff)
Centralização da lógica de distância.
-rw-r--r--scripts/Entities/Actors/AI/HostileEnemyAI.cs3
-rw-r--r--scripts/Utils/Grid.cs31
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));
+ }
}