Crates.io | bracket-algorithm-traits |
lib.rs | bracket-algorithm-traits |
version | 0.8.7 |
source | src |
created_at | 2020-02-21 18:12:37.725318 |
updated_at | 2022-10-04 18:54:30.946926 |
description | Traits required for the bracket-* crates. Adapt your maps to the traits with Algorithm2D, Algorithm3D and BaseMap. |
homepage | https://github.com/thebracket/bracket-lib |
repository | https://github.com/thebracket/bracket-lib |
max_upload_size | |
id | 211255 |
size | 17,800 |
This crate provides traits for use in the bracket-pathfinding
and bracket-geometry
crates. It is part of the overall bracket-lib
system.
Using a trait interface means that bracket-lib
doesn't have to know or care about how you store your data, and can still provide useful geometry and path-finding functions. Defaults are provided, allowing you to get up and running quickly.
Everything is exported via bracket_algorithm_traits::prelude
.
A truly minimal implementation (replace TestMap
with your map structure):
struct TestMap{};
impl BaseMap for TestMap {}
impl Algorithm2D for TestMap{
fn dimensions(&self) -> Point {
Point::new(2, 2)
}
}
This is sufficient to provide the following services:
in_bounds(Point)
: is a point within the dimensions of the map?point2d_to_index(Point) -> usize
: provides an array index for a point, within the map dimensions. It assumes that your array has striding by column.index_to_point2d(usize) -> Point
: provides an x/y
coordinate for a given array index, assuming the same striding.If you don't like the default implementations, feel free to override them.
There is an equivalent Algorithm3D
for 3D grid-based maps (substitute Point3D
for Point
).
The BaseMap
trait helps you define the map. If you want to use path-finding, you need to implement the is_opaque
function:
impl BaseMap for MyMap {
fn is_opaque(&self, _idx: usize) -> bool {
false
}
}
To support path-finding, you need to implement two more functions:
impl BaseMap for MyMap {
fn get_available_exits(&self, idx: usize) -> SmallVec<[(usize, f32); 10]> {
Vec::new()
// Provide a list of exit indices (you can use point2d_to_index to generate them) for this
// tile inside the array.
// Do NOT include the current tile as an available exit.
}
fn get_pathing_distance(&self, _idx1: usize, _idx2: usize) -> f32 {
1.0
// This should be a distance, using whatever heuristic you prefer.
}