14个版本
0.6.1 | 2023年1月10日 |
---|---|
0.6.0 | 2023年1月9日 |
0.5.3 | 2022年6月6日 |
0.5.2 | 2022年1月7日 |
0.3.6 | 2020年10月28日 |
#534 in 游戏开发
45KB
824 行
一套工具,用于在基于网格的地下城中找到你的路径。视野、路径查找...
受 tcod-rs 和 bracket-pathfinding 的启发,它旨在比 tcod 更简单易用,不需要 sdl2 依赖,并且比 bracket-pathfinding 更快。
开始使用
实现 VisionMap
特性以使用视野算法,或实现 PathMap
特性以使用路径查找算法。
use torchbearer::Point;
use torchbearer::fov::{field_of_view, VisionMap};
use torchbearer::path::{astar_path_fourwaygrid, PathMap};
struct SampleMap {
width: i32,
height: i32,
transparent: Vec<bool>,
walkable: Vec<bool>,
}
impl SampleMap {
fn new(width: i32, height: i32) -> Self {
// (…)
# SampleMap {
# width,
# height,
# transparent: vec![true; (width * height) as usize],
# walkable: vec![true; (width * height) as usize],
# }
}
}
impl VisionMap for SampleMap {
fn dimensions(&self) -> (i32, i32) {
(self.width, self.height)
}
fn is_transparent(&self, (x, y): Point) -> bool {
self.transparent[(x + y * self.width) as usize]
}
}
impl PathMap for SampleMap {
fn dimensions(&self) -> (i32, i32) {
(self.width, self.height)
}
fn is_walkable(&self, (x, y): Point) -> bool {
self.walkable[(x + y * self.width) as usize]
}
}
let sample_map = SampleMap::new(16, 10);
// (…) You probably want at this point to add some walls to your map.
let from = (1,1);
let to = (3,8);
let radius = 5;
for visible_position in field_of_view(&sample_map, from, radius) {
// (…)
}
if let Some(path) = astar_path_fourwaygrid(&sample_map, from, to) {
// (…)
}
尽管 torchbearer 默认提供用于四向网格图(意味着,你可以向北、南、东和西移动)的简单路径查找函数,但你也可以实现自己的图,以支持其他类型的移动(8个方向,北、东北、东、东南、南、西南、西、西北)或传灵,或... 你也可以简单地决定你想要调整你的启发式算法,以便沿着道路移动比爬山更容易,例如。
use torchbearer::path::{astar_path, Graph, NodeId};
struct MyMap {}
impl Graph for MyMap {
// (..)
# fn node_count(&self) -> usize {
# 3
# }
#
# fn cost_between(&self, a: NodeId, b: NodeId) -> f32 {
# 1.0
# }
#
# fn heuristic(&self, a: NodeId, b: NodeId) -> f32 {
# 1.0
# }
#
# fn neighboors(&self, a: NodeId, into: &mut Vec<NodeId>) {}
}
let my_map = MyMap {};
let from = (1) as NodeId;
let to = (2) as NodeId;
if let Some(path) = astar_path(&my_map, to, from) {
// (…)
}