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
Va chạm giữa entity

Collider, lớp và mặt nạ, event enter/stay/exit, di chuyển có vật cản, truy vấn, raycast. Tiếp...

Classes

struct  njin::collider
 Hình va chạm của một entity. Tiếp...
struct  njin::platform_rider
 Tag: entity được bục di chuyển chở theo khi đứng trên nó, và bị bục đẩy khi bục đâm vào. Tiếp...
struct  njin::collision_enter
 Hai collider bắt đầu chồng nhau. Tiếp...
struct  njin::collision_stay
 Hai collider vẫn đang chồng nhau, gửi mỗi frame sau frame enter. Tiếp...
struct  njin::collision_exit
 Hai collider thôi chồng nhau: tách ra, bị tắt, bị gỡ, hoặc bị hủy. Tiếp...
struct  njin::collision_move_result
 Kết quả của collision_move(). Tiếp...
struct  njin::collision_move_opts
 Tùy chọn của collision_move(). Tiếp...
struct  njin::raycast_hit
 Kết quả của collision_raycast(). Tiếp...

Enumerations

enum  njin::collider_shape { njin::collider_box , njin::collider_circle , njin::collider_tiles }
 Hình của một collider. Tiếp...

Các hàm

constexpr u32 njin::layer_bit (i32 n)
 Bit của lớp va chạm thứ n (0..31), để đặt tên lớp cho dễ đọc: constexpr u32 layer_enemy = njin::layer_bit(2);.
rect njin::collider_bounds (const transform &tr, const collider &col)
 Hình chữ nhật bao quanh một collider hộp hoặc tròn, trong thế giới.
collision_move_result njin::collision_move (context &ctx, entt::entity entity, vec2 delta)
 Di chuyển một entity có collider, dừng lại khi đụng collider không phải trigger (kể cả ô của collider_tiles), rồi ghi vị trí mới vào transform.
collision_move_result njin::collision_move (context &ctx, entt::entity entity, vec2 delta, const collision_move_opts &opts)
 Như bản trên, kèm tùy chọn: bục một chiều, dính dốc, chỉ dò.
void njin::collision_move_platform (context &ctx, entt::entity platform, vec2 delta)
 Di chuyển một bục (entity có collider hộp, thường là one_way hoặc vật cản) không bị chặn, và mang theo những gì đứng trên nó.
i32 njin::collision_overlap_rect (const context &ctx, rect area, std::vector< entt::entity > *out=nullptr, u32 mask=layer_all, bool include_triggers=true)
 Tìm mọi entity có collider chồng lên hình chữ nhật area.
i32 njin::collision_overlap_circle (const context &ctx, circle area, std::vector< entt::entity > *out=nullptr, u32 mask=layer_all, bool include_triggers=true)
 Như collision_overlap_rect() với một hình tròn: vùng nổ, tầm nhìn.
i32 njin::collision_overlap_point (const context &ctx, vec2 point, std::vector< entt::entity > *out=nullptr, u32 mask=layer_all, bool include_triggers=true)
 Như collision_overlap_rect() với một điểm: chuột đang chỉ vào gì.
raycast_hit njin::collision_raycast (const context &ctx, vec2 from, vec2 to, u32 mask=layer_all, bool include_triggers=false, entt::entity ignore=entt::null)
 Bắn một tia từ from đến to, trả về vật trúng gần nhất: tầm nhìn của quái, đạn tức thời, laser, kiểm tra đứng trên đất.
bool njin::collision_line_of_sight (const context &ctx, vec2 from, vec2 to, u32 mask=layer_all, entt::entity ignore=entt::null)
 Có nhìn thấy nhau không: tia từ from đến to không trúng vật cản nào.
void njin::collision_set_debug (context &ctx, bool on)
 Vẽ khung mọi collider hộp và tròn trong phase_render, trên sprite: xanh lá cho vật cản, vàng cho trigger.
void njin::collision_set_cell_size (context &ctx, f32 size)
 Cỡ ô của lưới tìm cặp va chạm, đơn vị thế giới.

Các biến

constexpr u32 njin::layer_all = 0xFFFFFFFFu
 Mọi lớp va chạm. Giá trị mặc định của collider::mask.

Mô tả chi tiết

Collider, lớp và mặt nạ, event enter/stay/exit, di chuyển có vật cản, truy vấn, raycast.

Thông tin về Enumeration Type

◆ collider_shape

Hình của một collider.

Enumerator
collider_box 

Hình chữ nhật thẳng trục, cỡ size. Không xoay theo transform.

collider_circle 

Hình tròn bán kính radius.

collider_tiles 

Mọi ô không trống của njin::tilemap trên cùng entity là vật cản.

Dùng cho collision_move(), truy vấn và raycast; không sinh event va chạm.

Thông tin về hàm

◆ layer_bit()

u32 njin::layer_bit ( i32 n)
constexpr

Bit của lớp va chạm thứ n (0..31), để đặt tên lớp cho dễ đọc: constexpr u32 layer_enemy = njin::layer_bit(2);.

Các tham số
nSố thứ tự lớp, 0..31.
Giá trị trả về
1 << n.

◆ collider_bounds()

rect njin::collider_bounds ( const transform & tr,
const collider & col )
inline

Hình chữ nhật bao quanh một collider hộp hoặc tròn, trong thế giới.

Các tham số
trTransform của entity.
colCollider.
Giá trị trả về
Hình chữ nhật bao. Với collider_tiles là hình rỗng tại tr.pos.

◆ collision_move() [1/2]

collision_move_result njin::collision_move ( context & ctx,
entt::entity entity,
vec2 delta )

Di chuyển một entity có collider, dừng lại khi đụng collider không phải trigger (kể cả ô của collider_tiles), rồi ghi vị trí mới vào transform.

Giống tilemap_move(): đi trục ngang trước rồi trục dọc, nên trượt dọc theo tường. Hình tròn được di chuyển như hình hộp bao quanh nó. Chỉ chặn bởi collider mà cả hai chiều layer/mask cho phép, và bỏ qua collider của chính các entity con trực tiếp (njin::child_of) để vũ khí không chặn chủ.

Mỗi trục được quét liên tục, nên bước dài đến đâu cũng không xuyên qua tường mỏng. Vật cản đang chồng lên entity từ trước bị bỏ qua, để entity bị kẹt vẫn đi ra được. Chạy trong phase_fixed_update cho ổn định.

Các tham số
ctxContext của engine.
entityEntity có transform và collider hộp hoặc tròn.
deltaĐộ dời mong muốn.
Giá trị trả về
Độ dời thật và vật chặn trên từng trục.

◆ collision_move() [2/2]

collision_move_result njin::collision_move ( context & ctx,
entt::entity entity,
vec2 delta,
const collision_move_opts & opts )

Như bản trên, kèm tùy chọn: bục một chiều, dính dốc, chỉ dò.

Ô tilemap theo tilemap::shapes: tile_none không chặn, tile_one_way chỉ chặn khi rơi xuống từ phía trên mặt của nó, các tile_slope_* đỡ entity theo mặt dốc tại điểm giữa đáy của hình hộp. Đi ngang lên hết dốc sang ô đặc cao bằng đỉnh dốc là liền mạch. Mặt đứng cao của ô dốc chặn như tường.

Các tham số
ctxContext của engine.
entityEntity có transform và collider hộp hoặc tròn.
deltaĐộ dời mong muốn.
optsTùy chọn.
Giá trị trả về
Độ dời thật, vật chặn, và trạng thái mặt đất.

◆ collision_move_platform()

void njin::collision_move_platform ( context & ctx,
entt::entity platform,
vec2 delta )

Di chuyển một bục (entity có collider hộp, thường là one_way hoặc vật cản) không bị chặn, và mang theo những gì đứng trên nó.

Entity đứng trên mặt bục (đáy chạm mặt bục, chồng nhau theo chiều ngang) có njin::platformer_body, njin::topdown_body hoặc njin::platform_rider được dời cùng độ dời bằng collision_move(), nên vẫn bị tường chặn. Bục không phải một chiều còn đẩy các entity đó ra khi đâm vào chúng. Gọi trong phase_fixed_update, trước khi nhân vật di chuyển. njin::path_mover gọi hàm này cho bạn.

Các tham số
ctxContext của engine.
platformEntity bục, có transform và collider.
deltaĐộ dời của bục.

◆ collision_overlap_rect()

i32 njin::collision_overlap_rect ( const context & ctx,
rect area,
std::vector< entt::entity > * out = nullptr,
u32 mask = layer_all,
bool include_triggers = true )

Tìm mọi entity có collider chồng lên hình chữ nhật area.

Các tham số
ctxContext của engine.
areaVùng cần tìm, trong thế giới.
outNhận các entity tìm thấy (được thêm vào cuối, không xóa trước). Có thể null.
maskChỉ xét collider có layer & mask != 0.
include_triggersCó xét collider trigger không.
Giá trị trả về
Số entity tìm thấy.

◆ collision_overlap_circle()

i32 njin::collision_overlap_circle ( const context & ctx,
circle area,
std::vector< entt::entity > * out = nullptr,
u32 mask = layer_all,
bool include_triggers = true )

Như collision_overlap_rect() với một hình tròn: vùng nổ, tầm nhìn.

Các tham số
ctxContext của engine.
areaVùng cần tìm.
outNhận các entity tìm thấy. Có thể null.
maskChỉ xét collider có layer & mask != 0.
include_triggersCó xét collider trigger không.
Giá trị trả về
Số entity tìm thấy.

◆ collision_overlap_point()

i32 njin::collision_overlap_point ( const context & ctx,
vec2 point,
std::vector< entt::entity > * out = nullptr,
u32 mask = layer_all,
bool include_triggers = true )

Như collision_overlap_rect() với một điểm: chuột đang chỉ vào gì.

Các tham số
ctxContext của engine.
pointĐiểm, trong thế giới (dùng scr2w() cho vị trí chuột).
outNhận các entity tìm thấy. Có thể null.
maskChỉ xét collider có layer & mask != 0.
include_triggersCó xét collider trigger không.
Giá trị trả về
Số entity tìm thấy.

◆ collision_raycast()

raycast_hit njin::collision_raycast ( const context & ctx,
vec2 from,
vec2 to,
u32 mask = layer_all,
bool include_triggers = false,
entt::entity ignore = entt::null )

Bắn một tia từ from đến to, trả về vật trúng gần nhất: tầm nhìn của quái, đạn tức thời, laser, kiểm tra đứng trên đất.

Tia bắt đầu bên trong một collider thì trúng ngay tại from.

Các tham số
ctxContext của engine.
fromĐiểm đầu.
toĐiểm cuối.
maskChỉ xét collider có layer & mask != 0.
include_triggersCó xét collider trigger không. Mặc định không.
ignoreEntity bỏ qua, thường là chính người bắn.
Giá trị trả về
Vật trúng, hoặc hit == false.

◆ collision_line_of_sight()

bool njin::collision_line_of_sight ( const context & ctx,
vec2 from,
vec2 to,
u32 mask = layer_all,
entt::entity ignore = entt::null )
inline

Có nhìn thấy nhau không: tia từ from đến to không trúng vật cản nào.

Dùng cho tầm nhìn của quái. Ô tile_none và trigger không che; bục một chiều chỉ che khi nhìn từ trên xuống.

Các tham số
ctxContext của engine.
fromĐiểm nhìn.
toĐiểm cần thấy.
maskChỉ xét collider có layer & mask != 0.
ignoreEntity bỏ qua, thường là chính người nhìn.
Giá trị trả về
true nếu không có gì chắn giữa hai điểm.

◆ collision_set_debug()

void njin::collision_set_debug ( context & ctx,
bool on )

Vẽ khung mọi collider hộp và tròn trong phase_render, trên sprite: xanh lá cho vật cản, vàng cho trigger.

Để dò lỗi hitbox.

Các tham số
ctxContext của engine.
onBật hay tắt.

◆ collision_set_cell_size()

void njin::collision_set_cell_size ( context & ctx,
f32 size )

Cỡ ô của lưới tìm cặp va chạm, đơn vị thế giới.

Mặc định 64. Nên gần bằng cỡ collider phổ biến trong game; chỉ ảnh hưởng tốc độ, không đổi kết quả.

Các tham số
ctxContext của engine.
sizeCỡ ô, lớn hơn 0.