#path-finding #gamedev #width-height #field-of-view

torchbearer

在更暗的地下城中找到你的路径

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 游戏开发

Apache-2.0

45KB
824

Docs Crates.io Crates.io

一套工具,用于在基于网格的地下城中找到你的路径。视野、路径查找...

tcod-rsbracket-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) {
    // (…)
}

无运行时依赖