mirror of
https://github.com/godotengine/godot-docs-l10n.git
synced 2026-01-04 10:09:56 +03:00
Currently including `zh_CN` and `es` which both have very high completion ratios. Others will be added once they reach a significant percentage too. These RST files will be used by godot-docs in place of its `classes` folder after we sync with https://github.com/godotengine/godot-docs/pull/5458. The update workflow is manual for now (example for `zh_CN`): - Build `godotengine/godot` in the branch we currently track (now `3.x`) - Run `godot --doctool -l zh_CN` - Run `cd doc && make rst LANGARG=zh_CN` - Copy `doc/_build/rst/*` to `classes/zh_CN/` here - Make sure to have `classes/zh_CN/index.rst` copied from `docs/classes`
363 lines
25 KiB
ReStructuredText
363 lines
25 KiB
ReStructuredText
:github_url: hide
|
|
|
|
.. Generated automatically by doc/tools/make_rst.py in Godot's source tree.
|
|
.. DO NOT EDIT THIS FILE, but the AStar.xml source instead.
|
|
.. The source is found in doc/classes or modules/<name>/doc_classes.
|
|
|
|
.. _class_AStar:
|
|
|
|
AStar
|
|
=====
|
|
|
|
**Inherits:** :ref:`Reference<class_Reference>` **<** :ref:`Object<class_Object>`
|
|
|
|
An implementation of A\* to find the shortest paths among connected points in space.
|
|
|
|
Descripción
|
|
----------------------
|
|
|
|
A\* (A star) is a computer algorithm that is widely used in pathfinding and graph traversal, the process of plotting short paths among vertices (points), passing through a given set of edges (segments). It enjoys widespread use due to its performance and accuracy. Godot's A\* implementation uses points in three-dimensional space and Euclidean distances by default.
|
|
|
|
You must add points manually with :ref:`add_point<class_AStar_method_add_point>` and create segments manually with :ref:`connect_points<class_AStar_method_connect_points>`. Then you can test if there is a path between two points with the :ref:`are_points_connected<class_AStar_method_are_points_connected>` function, get a path containing indices by :ref:`get_id_path<class_AStar_method_get_id_path>`, or one containing actual coordinates with :ref:`get_point_path<class_AStar_method_get_point_path>`.
|
|
|
|
It is also possible to use non-Euclidean distances. To do so, create a class that extends ``AStar`` and override methods :ref:`_compute_cost<class_AStar_method__compute_cost>` and :ref:`_estimate_cost<class_AStar_method__estimate_cost>`. Both take two indices and return a length, as is shown in the following example.
|
|
|
|
::
|
|
|
|
class MyAStar:
|
|
extends AStar
|
|
|
|
func _compute_cost(u, v):
|
|
return abs(u - v)
|
|
|
|
func _estimate_cost(u, v):
|
|
return min(0, abs(u - v) - 1)
|
|
|
|
\ :ref:`_estimate_cost<class_AStar_method__estimate_cost>` should return a lower bound of the distance, i.e. ``_estimate_cost(u, v) <= _compute_cost(u, v)``. This serves as a hint to the algorithm because the custom ``_compute_cost`` might be computation-heavy. If this is not the case, make :ref:`_estimate_cost<class_AStar_method__estimate_cost>` return the same value as :ref:`_compute_cost<class_AStar_method__compute_cost>` to provide the algorithm with the most accurate information.
|
|
|
|
If the default :ref:`_estimate_cost<class_AStar_method__estimate_cost>` and :ref:`_compute_cost<class_AStar_method__compute_cost>` methods are used, or if the supplied :ref:`_estimate_cost<class_AStar_method__estimate_cost>` method returns a lower bound of the cost, then the paths returned by A\* will be the lowest-cost paths. Here, the cost of a path equals the sum of the :ref:`_compute_cost<class_AStar_method__compute_cost>` results of all segments in the path multiplied by the ``weight_scale``\ s of the endpoints of the respective segments. If the default methods are used and the ``weight_scale``\ s of all points are set to ``1.0``, then this equals the sum of Euclidean distances of all segments in the path.
|
|
|
|
Métodos
|
|
--------------
|
|
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`float<class_float>` | :ref:`_compute_cost<class_AStar_method__compute_cost>` **(** :ref:`int<class_int>` from_id, :ref:`int<class_int>` to_id **)** |virtual| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`float<class_float>` | :ref:`_estimate_cost<class_AStar_method__estimate_cost>` **(** :ref:`int<class_int>` from_id, :ref:`int<class_int>` to_id **)** |virtual| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| void | :ref:`add_point<class_AStar_method_add_point>` **(** :ref:`int<class_int>` id, :ref:`Vector3<class_Vector3>` position, :ref:`float<class_float>` weight_scale=1.0 **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`bool<class_bool>` | :ref:`are_points_connected<class_AStar_method_are_points_connected>` **(** :ref:`int<class_int>` id, :ref:`int<class_int>` to_id, :ref:`bool<class_bool>` bidirectional=true **)** |const| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| void | :ref:`clear<class_AStar_method_clear>` **(** **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| void | :ref:`connect_points<class_AStar_method_connect_points>` **(** :ref:`int<class_int>` id, :ref:`int<class_int>` to_id, :ref:`bool<class_bool>` bidirectional=true **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| void | :ref:`disconnect_points<class_AStar_method_disconnect_points>` **(** :ref:`int<class_int>` id, :ref:`int<class_int>` to_id, :ref:`bool<class_bool>` bidirectional=true **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`int<class_int>` | :ref:`get_available_point_id<class_AStar_method_get_available_point_id>` **(** **)** |const| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`int<class_int>` | :ref:`get_closest_point<class_AStar_method_get_closest_point>` **(** :ref:`Vector3<class_Vector3>` to_position, :ref:`bool<class_bool>` include_disabled=false **)** |const| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`Vector3<class_Vector3>` | :ref:`get_closest_position_in_segment<class_AStar_method_get_closest_position_in_segment>` **(** :ref:`Vector3<class_Vector3>` to_position **)** |const| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`PoolIntArray<class_PoolIntArray>` | :ref:`get_id_path<class_AStar_method_get_id_path>` **(** :ref:`int<class_int>` from_id, :ref:`int<class_int>` to_id **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`int<class_int>` | :ref:`get_point_capacity<class_AStar_method_get_point_capacity>` **(** **)** |const| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`PoolIntArray<class_PoolIntArray>` | :ref:`get_point_connections<class_AStar_method_get_point_connections>` **(** :ref:`int<class_int>` id **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`int<class_int>` | :ref:`get_point_count<class_AStar_method_get_point_count>` **(** **)** |const| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`PoolVector3Array<class_PoolVector3Array>` | :ref:`get_point_path<class_AStar_method_get_point_path>` **(** :ref:`int<class_int>` from_id, :ref:`int<class_int>` to_id **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`Vector3<class_Vector3>` | :ref:`get_point_position<class_AStar_method_get_point_position>` **(** :ref:`int<class_int>` id **)** |const| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`float<class_float>` | :ref:`get_point_weight_scale<class_AStar_method_get_point_weight_scale>` **(** :ref:`int<class_int>` id **)** |const| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`Array<class_Array>` | :ref:`get_points<class_AStar_method_get_points>` **(** **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`bool<class_bool>` | :ref:`has_point<class_AStar_method_has_point>` **(** :ref:`int<class_int>` id **)** |const| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| :ref:`bool<class_bool>` | :ref:`is_point_disabled<class_AStar_method_is_point_disabled>` **(** :ref:`int<class_int>` id **)** |const| |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| void | :ref:`remove_point<class_AStar_method_remove_point>` **(** :ref:`int<class_int>` id **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| void | :ref:`reserve_space<class_AStar_method_reserve_space>` **(** :ref:`int<class_int>` num_nodes **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| void | :ref:`set_point_disabled<class_AStar_method_set_point_disabled>` **(** :ref:`int<class_int>` id, :ref:`bool<class_bool>` disabled=true **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| void | :ref:`set_point_position<class_AStar_method_set_point_position>` **(** :ref:`int<class_int>` id, :ref:`Vector3<class_Vector3>` position **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
| void | :ref:`set_point_weight_scale<class_AStar_method_set_point_weight_scale>` **(** :ref:`int<class_int>` id, :ref:`float<class_float>` weight_scale **)** |
|
|
+-------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
|
|
|
Descripciones de Métodos
|
|
------------------------------------------------
|
|
|
|
.. _class_AStar_method__compute_cost:
|
|
|
|
- :ref:`float<class_float>` **_compute_cost** **(** :ref:`int<class_int>` from_id, :ref:`int<class_int>` to_id **)** |virtual|
|
|
|
|
Llamado cuando se calcula el coste entre dos puntos conectados.
|
|
|
|
Nota que esta funcion esta oculta en la clase ``AStar`` por defecto.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method__estimate_cost:
|
|
|
|
- :ref:`float<class_float>` **_estimate_cost** **(** :ref:`int<class_int>` from_id, :ref:`int<class_int>` to_id **)** |virtual|
|
|
|
|
Llamado cuando se estima el coste entre un punto y la ruta del punto final.
|
|
|
|
Nota que esta funcion esta oculto en la clase ``AStar`` por defecto.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_add_point:
|
|
|
|
- void **add_point** **(** :ref:`int<class_int>` id, :ref:`Vector3<class_Vector3>` position, :ref:`float<class_float>` weight_scale=1.0 **)**
|
|
|
|
Adds a new point at the given position with the given identifier. The ``id`` must be 0 or larger, and the ``weight_scale`` must be 1 or larger.
|
|
|
|
The ``weight_scale`` is multiplied by the result of :ref:`_compute_cost<class_AStar_method__compute_cost>` when determining the overall cost of traveling across a segment from a neighboring point to this point. Thus, all else being equal, the algorithm prefers points with lower ``weight_scale``\ s to form a path.
|
|
|
|
::
|
|
|
|
var astar = AStar.new()
|
|
astar.add_point(1, Vector3(1, 0, 0), 4) # Adds the point (1, 0, 0) with weight_scale 4 and id 1
|
|
|
|
If there already exists a point for the given ``id``, its position and weight scale are updated to the given values.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_are_points_connected:
|
|
|
|
- :ref:`bool<class_bool>` **are_points_connected** **(** :ref:`int<class_int>` id, :ref:`int<class_int>` to_id, :ref:`bool<class_bool>` bidirectional=true **)** |const|
|
|
|
|
Devuelve si dos puntos dados estan directamente conectados por un segmento. Si ``bidirectional`` es ``false``, devuelve si el movimiento desde ``id`` a ``to_id`` es posible a traves del segmento.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_clear:
|
|
|
|
- void **clear** **(** **)**
|
|
|
|
Limpia todos los puntos y segmentos.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_connect_points:
|
|
|
|
- void **connect_points** **(** :ref:`int<class_int>` id, :ref:`int<class_int>` to_id, :ref:`bool<class_bool>` bidirectional=true **)**
|
|
|
|
Crea un segmento entre los puntos dados. Si ``bidirectional`` es ``false``, solo el movimiento desde ``id`` a ``to_id`` es permitido, no la direccion inversa.
|
|
|
|
::
|
|
|
|
var astar = AStar.new()
|
|
astar.add_point(1, Vector3(1, 1, 0))
|
|
astar.add_point(2, Vector3(0, 5, 0))
|
|
astar.connect_points(1,2, false)
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_disconnect_points:
|
|
|
|
- void **disconnect_points** **(** :ref:`int<class_int>` id, :ref:`int<class_int>` to_id, :ref:`bool<class_bool>` bidirectional=true **)**
|
|
|
|
Elimina el segmento entre los puntos dados. Si ``bidirectional`` es ``false``, solo el movimiento desde ``id`` a ``to_id`` es prevenido, y una segmento unidireccional posiblemente se mantiene.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_get_available_point_id:
|
|
|
|
- :ref:`int<class_int>` **get_available_point_id** **(** **)** |const|
|
|
|
|
Devuelve el punto de Ide proximo disponible con ningun punto asociado a el.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_get_closest_point:
|
|
|
|
- :ref:`int<class_int>` **get_closest_point** **(** :ref:`Vector3<class_Vector3>` to_position, :ref:`bool<class_bool>` include_disabled=false **)** |const|
|
|
|
|
Devuelve el ID del punto mas cercano a ``to_position``, opcionalmente tomando puntos deshabilitados en cuenta. Devuelve ``-1`` si no hay puntos el grupo(pool) de puntos.
|
|
|
|
\ **Nota:** Si varios puntos son los más cercanos a ``to_position``, el pundo con el menor ID será devuelto, asegurando un resultado deterministico.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_get_closest_position_in_segment:
|
|
|
|
- :ref:`Vector3<class_Vector3>` **get_closest_position_in_segment** **(** :ref:`Vector3<class_Vector3>` to_position **)** |const|
|
|
|
|
Devuelve la posicion mas cercana a ``to_position`` que reside dentro de un segmento entre dos puntos conectados.
|
|
|
|
::
|
|
|
|
var astar = AStar.new()
|
|
astar.add_point(1, Vector3(0, 0, 0))
|
|
astar.add_point(2, Vector3(0, 5, 0))
|
|
astar.connect_points(1,2)
|
|
var res = astar.get_closest_position_in_segment(Vector3(3, 3, 0)) # Devuelve (0, 3, 0)
|
|
|
|
El resultado esta en el segmento que va desde ``y = 0`` a ``y = 5``. Es la posicion mas cercana el segmento de un punto dado.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_get_id_path:
|
|
|
|
- :ref:`PoolIntArray<class_PoolIntArray>` **get_id_path** **(** :ref:`int<class_int>` from_id, :ref:`int<class_int>` to_id **)**
|
|
|
|
Devuelve un array con los IDs de los puntos que forman la ruta encontrada por un A estrella entre los puntos dados. El array es ordenado desde el punto de comienzo al punto final de la ruta.
|
|
|
|
::
|
|
|
|
var astar = AStar.new()
|
|
astar.add_point(1, Vector3(0, 0, 0))
|
|
asta.add_point(2, Vector3(0, 1, 0), 1) # Peso por defecto es 1
|
|
astar.add_point(3, Vector3(1, 1, 0))
|
|
astar.add_point(4, Vector3(2, 0, 0))
|
|
|
|
astar.connect_points(1, 2, false)
|
|
astar.connect_points(2, 3, false)
|
|
astar.connect_points(4, 3, false)
|
|
astar.connect_points(1, 4, false)
|
|
|
|
var res = astar.get_id_path(1, 3) # Devuelve [1, 2, 3]
|
|
|
|
Si tu cambiar el peso del segundo punto a 3, entonces el resultado sera ``[1, 4, 3]``, porque ahora aunque la distanica es mayor, es mas facil (menos coste) ir a traves de 4 que a traves del punto 2.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_get_point_capacity:
|
|
|
|
- :ref:`int<class_int>` **get_point_capacity** **(** **)** |const|
|
|
|
|
Devuelve la capacidad de la estructura que respalda los puntos, usado junto con ``reserve_space``.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_get_point_connections:
|
|
|
|
- :ref:`PoolIntArray<class_PoolIntArray>` **get_point_connections** **(** :ref:`int<class_int>` id **)**
|
|
|
|
Devuelve un array con los IDs de los puntos que forman la conneccion con el punto dado.
|
|
|
|
::
|
|
|
|
var astar = AStar.new()
|
|
astar.add_point(1, Vector3(0, 0, 0))
|
|
astar.add_point(2, Vector1(0, 1, 0))
|
|
astar.add_point(3, Vector3(1, 1, 0))
|
|
astar.add_point(4, Vector3(2, 0, 0))
|
|
|
|
astar.connect_points(1, 2, true)
|
|
astar.connect_points(1, 3, true)
|
|
|
|
var vecinos = astar.get_point_connections() # Devuelve [2, 3]
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_get_point_count:
|
|
|
|
- :ref:`int<class_int>` **get_point_count** **(** **)** |const|
|
|
|
|
Devuelve el numero de puntos actualmente en el grupo(pool) de puntos.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_get_point_path:
|
|
|
|
- :ref:`PoolVector3Array<class_PoolVector3Array>` **get_point_path** **(** :ref:`int<class_int>` from_id, :ref:`int<class_int>` to_id **)**
|
|
|
|
Returns an array with the points that are in the path found by AStar between the given points. The array is ordered from the starting point to the ending point of the path.
|
|
|
|
\ **Note:** This method is not thread-safe. If called from a :ref:`Thread<class_Thread>`, it will return an empty :ref:`PoolVector3Array<class_PoolVector3Array>` and will print an error message.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_get_point_position:
|
|
|
|
- :ref:`Vector3<class_Vector3>` **get_point_position** **(** :ref:`int<class_int>` id **)** |const|
|
|
|
|
Devuelve la posicion del punto asociado con el ``id`` dado.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_get_point_weight_scale:
|
|
|
|
- :ref:`float<class_float>` **get_point_weight_scale** **(** :ref:`int<class_int>` id **)** |const|
|
|
|
|
Devuelve el peso del punto asociado con el ``id`` dado.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_get_points:
|
|
|
|
- :ref:`Array<class_Array>` **get_points** **(** **)**
|
|
|
|
Devuelve un array con todos los puntos.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_has_point:
|
|
|
|
- :ref:`bool<class_bool>` **has_point** **(** :ref:`int<class_int>` id **)** |const|
|
|
|
|
Devuelve si un punto asociado con el ``id`` existe.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_is_point_disabled:
|
|
|
|
- :ref:`bool<class_bool>` **is_point_disabled** **(** :ref:`int<class_int>` id **)** |const|
|
|
|
|
Devuelve si un punto esta deshabilitado or no para el buscador de rutas. Por defecto, todos los puntos estan habilitados.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_remove_point:
|
|
|
|
- void **remove_point** **(** :ref:`int<class_int>` id **)**
|
|
|
|
Elimina el punto asociado con el ``id`` dado del grupo(pool) de puntos.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_reserve_space:
|
|
|
|
- void **reserve_space** **(** :ref:`int<class_int>` num_nodes **)**
|
|
|
|
Espacio de reserva interna para puntos ``num_nodes``, util si tu estas añadiendo un gran numero de puntos a la vez, para un grid por ejemplo. Las nuevas capacidades debes ser mayores o iguales que la anterior capacidad.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_set_point_disabled:
|
|
|
|
- void **set_point_disabled** **(** :ref:`int<class_int>` id, :ref:`bool<class_bool>` disabled=true **)**
|
|
|
|
Deshabilita o habilita el punto especificado para el buscador de rutas. Util para crear obstaculos temporales.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_set_point_position:
|
|
|
|
- void **set_point_position** **(** :ref:`int<class_int>` id, :ref:`Vector3<class_Vector3>` position **)**
|
|
|
|
Coloca la ``position`` para el punto con el ``id`` dado.
|
|
|
|
----
|
|
|
|
.. _class_AStar_method_set_point_weight_scale:
|
|
|
|
- void **set_point_weight_scale** **(** :ref:`int<class_int>` id, :ref:`float<class_float>` weight_scale **)**
|
|
|
|
Sets the ``weight_scale`` for the point with the given ``id``. The ``weight_scale`` is multiplied by the result of :ref:`_compute_cost<class_AStar_method__compute_cost>` when determining the overall cost of traveling across a segment from a neighboring point to this point.
|
|
|
|
.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)`
|
|
.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)`
|
|
.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)`
|