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. | |
Collider, lớp và mặt nạ, event enter/stay/exit, di chuyển có vật cản, truy vấn, raycast.
| enum njin::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. |
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);.
| n | Số thứ tự lớp, 0..31. |
Hình chữ nhật bao quanh một collider hộp hoặc tròn, trong thế giới.
| tr | Transform của entity. |
| col | Collider. |
| 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.
| ctx | Context của engine. |
| entity | Entity có transform và collider hộp hoặc tròn. |
| delta | Độ dời mong muốn. |
| 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.
| ctx | Context của engine. |
| entity | Entity có transform và collider hộp hoặc tròn. |
| delta | Độ dời mong muốn. |
| opts | Tùy chọn. |
| 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.
| ctx | Context của engine. |
| platform | Entity bục, có transform và collider. |
| delta | Độ dời của bục. |
| 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.
| ctx | Context của engine. |
| area | Vùng cần tìm, trong thế giới. |
| out | Nhận các entity tìm thấy (được thêm vào cuối, không xóa trước). Có thể null. |
| mask | Chỉ xét collider có layer & mask != 0. |
| include_triggers | Có xét collider trigger không. |
| 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.
| ctx | Context của engine. |
| area | Vùng cần tìm. |
| out | Nhận các entity tìm thấy. Có thể null. |
| mask | Chỉ xét collider có layer & mask != 0. |
| include_triggers | Có xét collider trigger không. |
| 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ì.
| ctx | Context của engine. |
| point | Điểm, trong thế giới (dùng scr2w() cho vị trí chuột). |
| out | Nhận các entity tìm thấy. Có thể null. |
| mask | Chỉ xét collider có layer & mask != 0. |
| include_triggers | Có xét collider trigger không. |
| 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.
| ctx | Context của engine. |
| from | Điểm đầu. |
| to | Điểm cuối. |
| mask | Chỉ xét collider có layer & mask != 0. |
| include_triggers | Có xét collider trigger không. Mặc định không. |
| ignore | Entity bỏ qua, thường là chính người bắn. |
|
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.
| ctx | Context của engine. |
| from | Điểm nhìn. |
| to | Điểm cần thấy. |
| mask | Chỉ xét collider có layer & mask != 0. |
| ignore | Entity bỏ qua, thường là chính người nhìn. |
| 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.
| ctx | Context của engine. |
| on | Bật hay tắt. |
| 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ả.
| ctx | Context của engine. |
| size | Cỡ ô, lớn hơn 0. |