Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

AStarGrid2D

Hérite de : RefCounted < Object

Une implémentation de A* pour trouver le chemin le plus court entre deux points sur une grille 2D.

Description

AStarGrid2D est une variante de AStar2D spécialisée dans les grilles 2D partielles. Elle est plus simple à utiliser parce qu'elle ne vous oblige pas à créer manuellement des points et à les connecter ensemble. Cette classe prend également en charge plusieurs types d'heuristiques, de modes de mouvement diagonal, et un mode de saut pour accélérer les calculs.

Pour utiliser AStarGrid2D, vous n'avez qu'à définir la region de la grille, définir optionnellement la taille de cellule cell_size, puis appeler la méthode update() :

var grille_astar = AStarGrid2D.new()
grille_astar.region = Rect2i(0, 0, 32, 32)
grille_astar.cell_size = Vector2(16, 16)
grille_astar.update()
print(grille_astar.get_id_path(Vector2i(0, 0), Vector2i(3, 4))) # Affiche [(0, 0), (1, 1), (2, 2), (3, 3), (3, 4)]
print(grille_astar.get_point_path(Vector2i(0, 0), Vector2i(3, 4))) # Affiche [(0, 0), (16, 16), (32, 32), (48, 48), (48, 64)]

Pour supprimer un point de la grille de recherche de chemin, il doit être défini comme "solide" avec set_point_solid().

Tutoriels

Propriétés

CellShape

cell_shape

0

Vector2

cell_size

Vector2(1, 1)

Heuristic

default_compute_heuristic

0

Heuristic

default_estimate_heuristic

0

DiagonalMode

diagonal_mode

0

bool

jumping_enabled

false

Vector2

offset

Vector2(0, 0)

Rect2i

region

Rect2i(0, 0, 0, 0)

Vector2i

size

Vector2i(0, 0)

Méthodes

float

_compute_cost(from_id: Vector2i, to_id: Vector2i) virtual const

float

_estimate_cost(from_id: Vector2i, end_id: Vector2i) virtual const

void

clear()

void

fill_solid_region(region: Rect2i, solid: bool = true)

void

fill_weight_scale_region(region: Rect2i, weight_scale: float)

Array[Vector2i]

get_id_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false)

Array[Dictionary]

get_point_data_in_region(region: Rect2i) const

PackedVector2Array

get_point_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false)

Vector2

get_point_position(id: Vector2i) const

float

get_point_weight_scale(id: Vector2i) const

bool

is_dirty() const

bool

is_in_bounds(x: int, y: int) const

bool

is_in_boundsv(id: Vector2i) const

bool

is_point_solid(id: Vector2i) const

void

set_point_solid(id: Vector2i, solid: bool = true)

void

set_point_weight_scale(id: Vector2i, weight_scale: float)

void

update()


Énumérations

enum Heuristic: 🔗

Heuristic HEURISTIC_EUCLIDEAN = 0

L'heuristique Euclidienne à utiliser pour la recherche de chemin utilisant la formule suivante :

dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
resultat = sqrt(dx * dx + dy * dy)

Note : C'est aussi l'heuristique interne utilisé par défaut dans AStar3D et AStar2D (avec l'inclusion d'une éventuelle coordonnée sur l'axe Z).

Heuristic HEURISTIC_MANHATTAN = 1

L'heuristique de Manhattan à utiliser pour la recherche de chemin utilisant la formule suivante :

dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
resultat = dx + dy

Note : Cette heuristique est destinée à être utilisé avec des mouvements orthogonaux à 4 côtés, fournis en définissant diagonal_mode à DIAGONAL_MODE_NEVER.

Heuristic HEURISTIC_OCTILE = 2

L'heuristique Octile à utiliser pour la recherche de chemin utilisant la formule suivante :

dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
f = sqrt(2) - 1
resultat = (dx < dy)? f * dx + dy : f * dy + dx;

Heuristic HEURISTIC_CHEBYSHEV = 3

L'heuristique de Chebyshev à utiliser pour la recherche de chemin utilisant la formule suivante :

dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
resultat = max(dx, dy)

Heuristic HEURISTIC_MAX = 4

Représente la taille de l'énumération Heuristic.


enum DiagonalMode: 🔗

DiagonalMode DIAGONAL_MODE_ALWAYS = 0

L'algorithme de recherche de chemin ignorera les voisins solides autour de la cellule cible et permettra de passer en utilisant des diagonales.

DiagonalMode DIAGONAL_MODE_NEVER = 1

L'algorithme de recherche de chemin ignorera toutes les diagonales et le chemin sera toujours orthogonal.

DiagonalMode DIAGONAL_MODE_AT_LEAST_ONE_WALKABLE = 2

L'algorithme de recherche de chemin évitera d'utiliser des diagonales si au moins deux obstacles ont été placés autour des cellules voisines du segment de chemin spécifique.

DiagonalMode DIAGONAL_MODE_ONLY_IF_NO_OBSTACLES = 3

L'algorithme de recherche de chemin évitera d'utiliser des diagonales si un obstacle a été placé autour des cellules voisines du segment de chemin spécifique.

DiagonalMode DIAGONAL_MODE_MAX = 4

Représente la taille de l'énumération DiagonalMode.


enum CellShape: 🔗

CellShape CELL_SHAPE_SQUARE = 0

Forme de cellule rectangulaire.

CellShape CELL_SHAPE_ISOMETRIC_RIGHT = 1

Forme de cellule en diamant (pour un style isométrique). Disposition de coordonnées de cellule où l'axe horizontal va en haut à droite, et l'axe vertical va en bas à droite.

CellShape CELL_SHAPE_ISOMETRIC_DOWN = 2

Forme de cellule en diamant (pour un style isométrique). Disposition de coordonnées de cellule où l'axe horizontal va en bas à droite, et l'axe vertical va en bas à gauche.

CellShape CELL_SHAPE_MAX = 3

Représente la taille de l'énumération CellShape.


Descriptions des propriétés

CellShape cell_shape = 0 🔗

La forme de la cellule. Affecte comment les positions sont placées dans le réseau. Si elle est modifiée, update() doit être appelée avant de chercher le chemin suivant.


Vector2 cell_size = Vector2(1, 1) 🔗

La taille de la cellule de point qui sera appliquée pour calculer la position des points résultants renvoyés par get_point_path(). Si elle est modifiée, update() doit être appelée avant de chercher le chemin suivant.


Heuristic default_compute_heuristic = 0 🔗

  • void set_default_compute_heuristic(value: Heuristic)

  • Heuristic get_default_compute_heuristic()

L'heuristique par défaut Heuristic qui sera utilisée pour calculer le coût entre deux points si _compute_cost() n'a pas été redéfinie.


Heuristic default_estimate_heuristic = 0 🔗

  • void set_default_estimate_heuristic(value: Heuristic)

  • Heuristic get_default_estimate_heuristic()

La valeur Heuristic par défaut qui sera utilisée pour calculer le coût entre le point et le point final si _estimate_cost() n'a pas été redéfinie.


DiagonalMode diagonal_mode = 0 🔗

Un mode spécifique DiagonalMode qui forcera le chemin à éviter ou accepter les diagonales spécifiées.


bool jumping_enabled = false 🔗

  • void set_jumping_enabled(value: bool)

  • bool is_jumping_enabled()

Active ou désactive le saut pour ignorer les points intermédiaires et accélère l'algorithme de recherche.

Note : À l'heure actuelle, l'activer désactive la prise en compte du facteur de poids dans la recherche de chemin.


Vector2 offset = Vector2(0, 0) 🔗

Le décalage de la grille qui sera appliqué pour calculer la position des points résultants renvoyés par get_point_path(). Si il est modifié, update() doit être appelée avant de chercher le chemin suivant.


Rect2i region = Rect2i(0, 0, 0, 0) 🔗

La région des cellules de la grille disponibles pour la recherche de chemin. Si elle est modifiée, update() doit être appelée avant de trouver le chemin suivant.


Vector2i size = Vector2i(0, 0) 🔗

Obsolète : Use region instead.

La taille de la grille (le nombre de cellule de taille cell_size sur chaque axe). Si elle est modifiée, update() doit être appelée avant de chercher le chemin suivant.


Descriptions des méthodes

float _compute_cost(from_id: Vector2i, to_id: Vector2i) virtual const 🔗

Appelée lors du calcul du coût entre deux points connectés.

À noter que cette fonction est cachée dans la classe AStarGrid2D par défaut.


float _estimate_cost(from_id: Vector2i, end_id: Vector2i) virtual const 🔗

Appelée lors du calcul du coût entre un point et le point final du chemin.

À noter que cette fonction est cachée dans la classe AStarGrid2D par défaut.


void clear() 🔗

Efface la grille et fixe la region à Rect2i(0, 0, 0, 0).


void fill_solid_region(region: Rect2i, solid: bool = true) 🔗

Remplit la region donnée sur la grille avec la valeur spécifiée pour le drapeau solide.

Note : L'appel à update() n'est pas nécessaire après l'appel de cette fonction.


void fill_weight_scale_region(region: Rect2i, weight_scale: float) 🔗

Remplit la region donnée sur la grille avec la valeur spécifiée pour le facteur de poids.

Note : L'appel à update() n'est pas nécessaire après l'appel de cette fonction.


Array[Vector2i] get_id_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false) 🔗

Renvoie un tableau avec les points qui sont dans le chemin trouvé par AStar2D entre les points donnés. Le tableau est trié du point de départ au point final du chemin.

Si le point from_id est désactivé, renvoie un tableau vide (même si from_id == to_id).

Si le point from_id n'est pas désactivé, qu'il n'y a pas de chemin valide vers la cible, et que allow_partial_path vaut true, renvoie un chemin vers le point le plus proche de la cible qui peut être atteint.

Note : Lorsque allow_partial_path vaut true et que to_id est solide, la recherche peut prendre un temps inhabituellement long pour se terminer.


Array[Dictionary] get_point_data_in_region(region: Rect2i) const 🔗

Renvoie un tableau de dictionnaires avec les données des points (id : Vector2i, position : Vector2, solid : bool, weight_scale : float) dans une region.


PackedVector2Array get_point_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false) 🔗

Renvoie un tableau avec les points qui sont dans le chemin trouvé par AStarGrid2D entre les points donnés. Le tableau est trié du point de départ au point final du chemin.

Si from_id point est désactivé, retourne un tableau vide (même si from_id == to_id).

Si from_id point n'est pas désactivé, qu'il n'y a pas de chemin valide vers la cible, et que allow_partial_path vaut true, renvoie un chemin vers le point le plus proche de la cible qui peut être atteint.

Note : Cette méthode n'est pas thread-safe, elle ne peut être utilisée qu'à partir d'un seul Thread à un moment donné. Envisagez d'utiliser Mutex pour garantir un accès exclusif à un thread pour éviter les race conditions.

De plus, lorsque allow_partial_path vaut true et que to_id est solide, la recherche peut prendre un temps inhabituellement long pour se terminer.


Vector2 get_point_position(id: Vector2i) const 🔗

Renvoie la position du point associé à l'identifiant id donné.


float get_point_weight_scale(id: Vector2i) const 🔗

Renvoie le facteur de poids du point associé à l'identifiant id donné.


bool is_dirty() const 🔗

Indique que les paramètres de la grille ont été changés et que update() doit être appelée.


bool is_in_bounds(x: int, y: int) const 🔗

Renvoie true si x et y sont une coordonnée de grille valide (id), c'est-à-dire si elle est à l'intérieur de la region. Équivalent à region.has_point(Vector2i(x, y)).


bool is_in_boundsv(id: Vector2i) const 🔗

Renvoie true si le vecteur id est une coordonnée de grille valide, c'est-à-dire si il est à l'intérieur de region. Équivalent à region.has_point(id).


bool is_point_solid(id: Vector2i) const 🔗

Renvoie true si un point est désactivé pour le calcul du chemin. Par défaut, tous les points sont activés.


void set_point_solid(id: Vector2i, solid: bool = true) 🔗

Désactive ou active le point spécifié pour la recherche de chemin. Utile pour faire un obstacle. Par défaut, tous les points sont activés.

Note : L'appel à update() n'est pas nécessaire après l'appel de cette fonction.


void set_point_weight_scale(id: Vector2i, weight_scale: float) 🔗

Définit le facteur de poids weight_scale pour le point avec l'identifiant id donné. Le facteur de poids weight_scale est multiplié par le résultat de _compute_cost() pour déterminer le coût global de voyage le long d'un segment d'un point voisin à ce point.

Note : L'appel à update() n'est pas nécessaire après l'appel de cette fonction.


void update() 🔗

Met à jour de l'état interne de la grille selon les paramètres pour la préparer à la recherche du chemin. Il convient d'appeler cette méthode si des paramètres comme region, cell_size ou offset sont changés. is_dirty() renverra true si c'est le cas et que ceci doit être appelé.

Note : Toutes les données de point (solidité et facteur de poids) seront effacées.