njin
Engine 2D gọn nhẹ để tự tay làm game theo ý mình. Vibe coding cũng ổn luôn
Loading...
Searching...
No Matches
njin_nav.h
1#pragma once
2#include "_math.h"
3#include "_tilemap.h"
4#include "_types.h"
5#include <utility>
6#include <vector>
7
8namespace njin {
9struct context;
10
13
18struct nav_grid {
20 vec2 cell_size{16.0f, 16.0f};
21 i32 width = 0;
22 i32 height = 0;
26 std::vector<u8> cost;
27};
28
36nav_grid nav_grid_make(vec2 origin, vec2 cell_size, i32 width, i32 height, u8 cost = 1);
37
49nav_grid nav_grid_from_world(const context &ctx, rect area, vec2 cell_size, u32 mask = 0xFFFFFFFFu);
50
55cell nav_cell_at(const nav_grid &grid, vec2 pos);
56
62
67u8 nav_cost(const nav_grid &grid, cell c);
68
73void nav_set_cost(nav_grid &grid, cell c, u8 cost);
74
80void nav_set_area(nav_grid &grid, rect area, u8 cost = 0);
81
85 bool diagonal = true;
88 bool cut_corners = false;
91 bool smooth = true;
95 bool partial = true;
98 i32 max_nodes = 20000;
103 f32 greed = 1.0f;
104};
105
121bool nav_find_path(const nav_grid &grid, vec2 from, vec2 to, std::vector<vec2> &out,
122 const nav_path_opts &opts = {});
123
129bool nav_line_clear(const nav_grid &grid, vec2 a, vec2 b);
130
132struct nav_agent {
133 std::vector<vec2> path;
134 i32 next = 0;
135 f32 reach = 3.0f;
136
138 void set(std::vector<vec2> p) {
139 path = std::move(p);
140 next = 0;
141 }
142
143 bool done() const { return next >= (i32)path.size(); }
144};
145
154} // namespace njin
bool nav_find_path(const nav_grid &grid, vec2 from, vec2 to, std::vector< vec2 > &out, const nav_path_opts &opts={})
Tìm đường ngắn nhất (A*) từ from đến to.
vec2 nav_cell_center(const nav_grid &grid, cell c)
Tâm của một ô trong thế giới.
nav_grid nav_grid_make(vec2 origin, vec2 cell_size, i32 width, i32 height, u8 cost=1)
Tạo một lưới trống, mọi ô có cùng chi phí.
nav_grid nav_grid_from_world(const context &ctx, rect area, vec2 cell_size, u32 mask=0xFFFFFFFFu)
Dựng lưới phủ area từ vật cản đang có trong thế giới: mọi ô chồng lên một collider không phải trigger...
cell nav_cell_at(const nav_grid &grid, vec2 pos)
Ô chứa một điểm trong thế giới (có thể nằm ngoài lưới).
void nav_set_cost(nav_grid &grid, cell c, u8 cost)
Đặt chi phí một ô.
u8 nav_cost(const nav_grid &grid, cell c)
Chi phí của một ô.
bool nav_line_clear(const nav_grid &grid, vec2 a, vec2 b)
Đoạn thẳng từ a tới b có đi qua ô vật cản nào không.
void nav_set_area(nav_grid &grid, rect area, u8 cost=0)
Đánh dấu vật cản mọi ô chồng lên area: một cái rương vừa đặt xuống, một cánh cửa vừa đóng.
vec2 nav_steer(nav_agent &agent, vec2 pos)
Hướng cần đi để theo đường, độ dài 1, hoặc {0, 0} khi đã tới cuối.
std::uint8_t u8
Số nguyên không dấu 8 bit.
Definition _types.h:20
std::int32_t i32
Số nguyên có dấu 32 bit.
Definition _types.h:14
float f32
Số thực 32 bit.
Definition _types.h:28
std::uint32_t u32
Số nguyên không dấu 32 bit.
Definition _types.h:22
Vị trí một ô trong lưới. Có thể âm.
Definition _tilemap.h:43
Một con đường đang được đi theo, dùng với nav_steer().
Definition njin_nav.h:132
std::vector< vec2 > path
Các điểm cần đi qua, từ nav_find_path().
Definition njin_nav.h:133
i32 next
Điểm đang đi tới.
Definition njin_nav.h:134
void set(std::vector< vec2 > p)
Đặt đường mới và đi lại từ điểm đầu.
Definition njin_nav.h:138
bool done() const
Đã đi hết đường chưa.
Definition njin_nav.h:143
f32 reach
Cách điểm bao xa thì coi là đã tới.
Definition njin_nav.h:135
Lưới tìm đường: mỗi ô có một chi phí để đi vào, 0 là không đi được.
Definition njin_nav.h:18
std::vector< u8 > cost
Chi phí đi vào từng ô, theo hàng: cost[y * width + x].
Definition njin_nav.h:26
i32 width
Số cột.
Definition njin_nav.h:21
i32 height
Số hàng.
Definition njin_nav.h:22
vec2 cell_size
Kích thước một ô, đơn vị thế giới.
Definition njin_nav.h:20
vec2 origin
Góc trên trái của ô (0, 0) trong thế giới.
Definition njin_nav.h:19
Tùy chọn của nav_find_path().
Definition njin_nav.h:83
bool cut_corners
Đi chéo qua góc của vật cản.
Definition njin_nav.h:88
f32 greed
Độ "tham" của A*: chi phí ước lượng tới đích nhân với số này.
Definition njin_nav.h:103
bool diagonal
Đi chéo được. Tắt cho game chỉ đi 4 hướng.
Definition njin_nav.h:85
bool smooth
Rút gọn đường: bỏ các điểm giữa khi đi thẳng được từ điểm trước tới điểm sau, nên quái đi xiên thay v...
Definition njin_nav.h:91
i32 max_nodes
Số ô tối đa được xét, để một đích không tới được trên bản đồ lớn không làm chậm frame.
Definition njin_nav.h:98
bool partial
Khi không tới được đích: vẫn trả về đường tới ô gần đích nhất đã tìm thấy (hàm trả về false).
Definition njin_nav.h:95
Hình chữ nhật thẳng trục: pos là góc trên trái, size là rộng và cao.
Definition _math.h:13
Vector 2 chiều. Dùng cho vị trí, kích thước, độ dời.
Definition _types.h:39