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
Tìm đường

Lưới ô, A*, tầm nhìn và đi theo đường cho quái. Tiếp...

Classes

struct  njin::nav_grid
 Lưới tìm đường: mỗi ô có một chi phí để đi vào, 0 là không đi được. Tiếp...
struct  njin::nav_path_opts
 Tùy chọn của nav_find_path(). Tiếp...
struct  njin::nav_agent
 Một con đường đang được đi theo, dùng với nav_steer(). Tiếp...

Các hàm

nav_grid njin::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 njin::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 (hộp, tròn, hay ô collider_tiles khác tile_none) có layer & mask != 0 là vật cản.
cell njin::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).
vec2 njin::nav_cell_center (const nav_grid &grid, cell c)
 Tâm của một ô trong thế giới.
u8 njin::nav_cost (const nav_grid &grid, cell c)
 Chi phí của một ô.
void njin::nav_set_cost (nav_grid &grid, cell c, u8 cost)
 Đặt chi phí một ô.
void njin::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.
bool njin::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.
bool njin::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.
vec2 njin::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.

Mô tả chi tiết

Lưới ô, A*, tầm nhìn và đi theo đường cho quái.

Thông tin về hàm

◆ nav_grid_make()

nav_grid njin::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í.

Các tham số
originGóc trên trái trong thế giới.
cell_sizeKích thước ô.
widthSố cột.
heightSố hàng.
costChi phí mọi ô. 1 là đi được, 0 là vật cản.
Giá trị trả về
Lưới.

◆ nav_grid_from_world()

nav_grid njin::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 (hộp, tròn, hay ô collider_tiles khác tile_none) có layer & mask != 0 là vật cản.

Dùng mask để chỉ lấy tường và bỏ qua nhân vật, quái: nav_grid_from_world(ctx, level_bounds(ctx, lv), {16, 16}, layer_walls).

Các tham số
ctxContext của engine.
areaVùng thế giới cần phủ.
cell_sizeKích thước ô, thường bằng ô tilemap.
maskLớp va chạm được coi là vật cản.
Giá trị trả về
Lưới.

◆ nav_cell_at()

cell njin::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).

Các tham số
gridLưới.
posĐiểm.
Giá trị trả về
Ô.

◆ nav_cell_center()

vec2 njin::nav_cell_center ( const nav_grid & grid,
cell c )

Tâm của một ô trong thế giới.

Các tham số
gridLưới.
cÔ.
Giá trị trả về
Tâm ô.

◆ nav_cost()

u8 njin::nav_cost ( const nav_grid & grid,
cell c )

Chi phí của một ô.

Ô ngoài lưới là 0.

Các tham số
gridLưới.
cÔ.
Giá trị trả về
Chi phí, 0 là vật cản.

◆ nav_set_cost()

void njin::nav_set_cost ( nav_grid & grid,
cell c,
u8 cost )

Đặt chi phí một ô.

Ô ngoài lưới bị bỏ qua.

Các tham số
gridLưới.
cÔ.
costChi phí, 0 là vật cản.

◆ nav_set_area()

void njin::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.

Các tham số
gridLưới.
areaVùng thế giới.
costChi phí gán cho các ô đó, mặc định 0 (vật cản).

◆ nav_find_path()

bool njin::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.

out được xóa rồi nhận các điểm cần đi qua, trong thế giới, không kèm điểm xuất phát; điểm cuối là to khi tới được. Dùng với nav_steer().

std::vector<njin::vec2> path;
if (njin::nav_find_path(g.nav, enemy_pos, player_pos, path)) { ... }
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.
Các tham số
gridLưới.
fromĐiểm xuất phát.
toĐiểm đích.
outNhận đường đi.
optsTùy chọn.
Giá trị trả về
true nếu tới được đích. false nếu không (khi đó out có thể chứa đường tới chỗ gần nhất, xem nav_path_opts::partial).

◆ nav_line_clear()

bool njin::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.

Các tham số
gridLưới.
aĐiểm đầu.
bĐiểm cuối.
Giá trị trả về
true nếu mọi ô nó đi qua đều đi được.

◆ nav_steer()

vec2 njin::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.

Tự chuyển sang điểm kế khi tới gần điểm hiện tại. Gán kết quả cho topdown_body::input.move.

Các tham số
agentĐường đang đi.
posVị trí hiện tại.
Giá trị trả về
Hướng đi.