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.
Checking the stable version of the documentation...
AStarGrid2D
Eredita: RefCounted < Object
Un'implementazione di A* per trovare il percorso più breve tra due punti su una griglia parziale 2D.
Descrizione
AStarGrid2D è una variante di AStar2D che è specializzata per le griglie 2D parziali. È più semplice da usare perché non richiede di creare manualmente i punti e collegarli insieme. Questa classe supporta anche più tipi di euristica, modalità per movimento diagonale, e una modalità di salto per velocizzare i calcoli.
Per utilizzare AStarGrid2D, è sufficiente solo impostare la regione (region) della griglia, impostando facoltativamente le dimensioni della cella (cell_size), e infine chiamare il metodo update():
var astar_grid = AStarGrid2D.new()
astar_grid.region = Rect2i(0, 0, 32, 32)
astar_grid.cell_size = Vector2(16, 16)
astar_grid.update()
print(astar_grid.get_id_path(Vector2i(0, 0), Vector2i(3, 4))) # Stampa [(0, 0), (1, 1), (2, 2), (3, 3), (3, 4)]
print(astar_grid.get_point_path(Vector2i(0, 0), Vector2i(3, 4))) # Stampa [(0, 0), (16, 16), (32, 32), (48, 48), (48, 64)]
AStarGrid2D astarGrid = new AStarGrid2D();
astarGrid.Region = new Rect2I(0, 0, 32, 32);
astarGrid.CellSize = new Vector2I(16, 16);
astarGrid.Update();
GD.Print(astarGrid.GetIdPath(Vector2I.Zero, new Vector2I(3, 4))); // Stampa [(0, 0), (1, 1), (2, 2), (3, 3), (3, 4)]
GD.Print(astarGrid.GetPointPath(Vector2I.Zero, new Vector2I(3, 4))); // Stampa [(0, 0), (16, 16), (32, 32), (48, 48), (48, 64)]
Per rimuovere un punto dalla griglia di rilevamento del percorso, deve essere impostato come "solido" con set_point_solid().
Tutorial
Proprietà
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
Metodi
_compute_cost(from_id: Vector2i, to_id: Vector2i) virtual const |
|
_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) |
get_id_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false) |
|
get_point_data_in_region(region: Rect2i) const |
|
get_point_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false) |
|
get_point_position(id: Vector2i) const |
|
get_point_weight_scale(id: Vector2i) const |
|
is_dirty() const |
|
is_in_bounds(x: int, y: int) const |
|
is_in_boundsv(id: Vector2i) const |
|
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() |
Enumerazioni
enum Heuristic: 🔗
Heuristic HEURISTIC_EUCLIDEAN = 0
L'euristico euclideo da utilizzare per la ricerca del percorso, utilizzando la seguente formula:
dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
risultato = sqrt(dx * dx + dy * dy)
Nota: Questo è anche l'euristico interno utilizzato in AStar3D e AStar2D per impostazione predefinita (con l'inclusione di possibile coordinate sull'asse z).
Heuristic HEURISTIC_MANHATTAN = 1
L'euristico di Manhattan da utilizzare per la ricerca del percorso, utilizzando la seguente formula:
dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
risultato = dx + dy
Nota: Questo euristico è destinato a essere utilizzato con movimenti ortogonali a 4 lati, forniti impostando diagonal_mode a DIAGONAL_MODE_NEVER.
Heuristic HEURISTIC_OCTILE = 2
L'euristico ottale da utilizzare per la ricerca del percorso utilizzando la seguente formula:
dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
f = sqrt(2) - 1
risultato = (dx < dy) ? f * dx + dy : f * dy + dx;
Heuristic HEURISTIC_CHEBYSHEV = 3
L'euristico di Čebyšëv da utilizzare per la ricerca del percorso utilizzando la seguente formula:
dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
risultato = max(dx, dy)
Heuristic HEURISTIC_MAX = 4
Rappresenta la dimensione dell'enumerazione Heuristic.
enum DiagonalMode: 🔗
DiagonalMode DIAGONAL_MODE_ALWAYS = 0
L'algoritmo di ricerca del percorso ignorerà i vicini solidi intorno alla cella di destinazione e permetterà di passare tramite le diagonali.
DiagonalMode DIAGONAL_MODE_NEVER = 1
L'algoritmo di ricerca del percorso ignorerà tutte le diagonali e la strada sarà sempre ortogonale.
DiagonalMode DIAGONAL_MODE_AT_LEAST_ONE_WALKABLE = 2
L'algoritmo di ricerca del percorso eviterà di usare le diagonali se almeno due ostacoli sono stati posti intorno alle celle vicine del segmento specifico del percorso.
DiagonalMode DIAGONAL_MODE_ONLY_IF_NO_OBSTACLES = 3
L'algoritmo di ricerca del percorso eviterà di usare le diagonali se qualsiasi ostacolo è stato posto intorno alle celle vicine del segmento specifico del percorso.
DiagonalMode DIAGONAL_MODE_MAX = 4
Rappresenta la dimensione dell'enumerazione DiagonalMode.
enum CellShape: 🔗
CellShape CELL_SHAPE_SQUARE = 0
Forma di cella rettangolare.
CellShape CELL_SHAPE_ISOMETRIC_RIGHT = 1
Forma di cella a diamante (per un aspetto isometrico). La disposizione delle coordinate delle celle in cui l'asse orizzontale va verso l'alto e a destra, e quello verticale va verso il basso e a destra.
CellShape CELL_SHAPE_ISOMETRIC_DOWN = 2
Forma di cella a diamante (per un aspetto isometrico). La disposizione delle coordinate delle celle in cui l'asse orizzontale va verso il basso e a destra, e quello verticale va verso l'alto e a destra.
CellShape CELL_SHAPE_MAX = 3
Rappresenta la dimensione dell'enumerazione CellShape.
Descrizioni delle proprietà
La forma delle celle. Influenza come le posizioni sono collocate nella griglia. Se cambiata, bisogna chiamare update() prima di trovare il prossimo percorso.
Vector2 cell_size = Vector2(1, 1) 🔗
Le dimensioni delle celle dei punti che verranno applicate per calcolare la posizione del punto risultante restituita da get_point_path(). Se cambiata, bisogna chiamare update() prima di trovare il prossimo percorso.
Heuristic default_compute_heuristic = 0 🔗
L'euristica (Heuristic) predefinita che verrà utilizzata per calcolare il costo tra due punti se _compute_cost() non è stato sovrascritto.
Heuristic default_estimate_heuristic = 0 🔗
L'euristica (Heuristic) predefinita che verrà utilizzata per calcolare il costo tra il punto e il punto finale se _estimate_cost() non è stato sovrascritto.
DiagonalMode diagonal_mode = 0 🔗
void set_diagonal_mode(value: DiagonalMode)
DiagonalMode get_diagonal_mode()
Una specifica modalità di diagonale (DiagonalMode) che costringe il percorso a evitare o accettare le diagonali specificate.
bool jumping_enabled = false 🔗
Abilita o disabilita il salto per saltare i punti intermedi e velocizzare l'algoritmo di ricerca.
Nota: Attualmente, abilitare questa opzione disabilita la considerazione della scala del peso nella ricerca del percorso.
Vector2 offset = Vector2(0, 0) 🔗
Lo scostamento della griglia che verrà applicato per calcolare la posizione del punto risultante restituita da get_point_path(). Se cambiato, bisogna chiamare update() prima di trovare il prossimo percorso.
Rect2i region = Rect2i(0, 0, 0, 0) 🔗
La regione delle celle della griglia disponibile per la ricerca del percorso. Se cambiato, bisogna chiamare update() prima di trovare il prossimo percorso.
Vector2i size = Vector2i(0, 0) 🔗
Deprecato: Use region instead.
Le dimensioni della griglia (numero di celle di dimensione cell_size su ogni asse). Se cambiate, bisogna chiamare update() prima di trovare il prossimo percorso.
Descrizioni dei metodi
float _compute_cost(from_id: Vector2i, to_id: Vector2i) virtual const 🔗
Chiamato quando si calcola il costo tra due punti collegati.
Si noti che questa funzione è nascosta nella classe predefinita AStarGrid2D.
float _estimate_cost(from_id: Vector2i, end_id: Vector2i) virtual const 🔗
Chiamato quando si stima il costo tra un punto e il punto finale del percorso.
Si noti che questa funzione è nascosta nella classe predefinita AStarGrid2D.
void clear() 🔗
Cancella la griglia e imposta region a Rect2i(0, 0, 0, 0).
void fill_solid_region(region: Rect2i, solid: bool = true) 🔗
Riempi la determinata regione region sulla griglia con il valore specificato per il flag solido.
Nota: Chiamare update() non è necessario dopo aver chiamato questa funzione.
void fill_weight_scale_region(region: Rect2i, weight_scale: float) 🔗
Riempie la determinata regione region sulla griglia con il valore specificato per la scala di peso.
Nota: Chiamare update() non è necessario dopo aver chiamato questa funzione.
Array[Vector2i] get_id_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false) 🔗
Restituisce un array con i punti che formano il percorso trovato da AStar2D tra i punti indicati. L'array è ordinato dal punto iniziale al punto finale del percorso.
Se il punto from_id è disabilitato, restituisce un array vuoto (anche se from_id == to_id).
Se il punto from_id non è disabilitato, non esiste un percorso valido verso la destinazione e allow_partial_path è true, restituisce un percorso verso il punto più vicino alla destinazione che può essere raggiunto.
Nota: quando allow_partial_path è true e to_id è solido, la ricerca potrebbe richiedere un tempo insolitamente lungo per essere completata.
Array[Dictionary] get_point_data_in_region(region: Rect2i) const 🔗
Restituisce un array di dizionari con i dati dei punti (id: Vector2i, position: Vector2, solid: bool, weight_scale: float) all'interno della regione region.
PackedVector2Array get_point_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false) 🔗
Restituisce un array con i punti che sono presenti nel percorso trovato da AStarGrid2D tra i punti indicati. L'array è ordinato dal punto iniziale al punto finale del percorso.
Se il punto from_id è disabilitato, restituisce un array vuoto (anche se from_id == to_id).
Se il punto from_id non è disabilitato, non esiste un percorso valido verso la destinazione e allow_partial_path è true, restituisce un percorso verso il punto più vicino alla destinazione che può essere raggiunto.
Nota: Questo metodo non è thread-safe; si può usare solo da un singolo Thread alla volta. Si consiglia di utilizzare Mutex per garantire l'accesso esclusivo a un thread ed evitare accessi concorrenti.
Inoltre, quando allow_partial_path è true e to_id è solido, la ricerca potrebbe richiedere un tempo insolitamente lungo per essere completata.
Vector2 get_point_position(id: Vector2i) const 🔗
Restituisce la posizione del punto associato all'id fornito.
float get_point_weight_scale(id: Vector2i) const 🔗
Restituisce la scala di peso del punto associato all'id fornito.
Indica che i parametri della griglia sono stati modificati ed è necessario chiamare update().
bool is_in_bounds(x: int, y: int) const 🔗
Restituisce true se il x e y è una valida coordinate di griglia (id), cioè se è all'interno di region. Equivalente a region.has_point(Vector2i(x, y)).
bool is_in_boundsv(id: Vector2i) const 🔗
Restituisce true se il vettore id è una valida coordinata di griglia, cioè se è all'interno di region. Equivalente a region.has_point(id).
bool is_point_solid(id: Vector2i) const 🔗
Restituisce true se un punto è disabilitato per il rilevamento del percorso. Per impostazione predefinita, tutti i punti sono abilitati.
void set_point_solid(id: Vector2i, solid: bool = true) 🔗
Disabilita o abilita il punto specificato per il rilevamento del percorso. Utile per creare un ostacolo. Per impostazione predefinita, tutti i punti sono abilitati.
Nota: Non è necessario chiamare update() dopo aver chiamato questa funzione.
void set_point_weight_scale(id: Vector2i, weight_scale: float) 🔗
Imposta la scala del peso (weight_scale) per il punto con l'id fornito. weight_scale viene moltiplicato per il risultato di _compute_cost() quando si determina il costo complessivo del viaggio attraverso un segmento da un punto vicino a questo punto.
Nota: Non è necessario chiamare update() dopo aver chiamato questa funzione.
void update() 🔗
Aggiorna lo stato interno della griglia in base ai parametri per prepararla alla ricerca del percorso. Deve essere chiamato se vengono modificati parametri come region, cell_size o offset. is_dirty() restituirà true se questo è il caso e deve essere chiamato.
Nota: Tutti i dati dei punti (solidità e scala del peso) verranno cancellati.