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::platformer_body Struct Tham chiếu

Nhân vật platformer: chạy, nhảy, rơi, trèo dốc, đứng trên bục di chuyển. Tiếp...

#include <njin_body.h>

Các thuộc tính Public

f32 run_speed = 110.0f
 Tốc độ chạy tối đa.
f32 ground_accel = 1200.0f
 Tăng tốc trên đất.
f32 ground_decel = 1600.0f
 Giảm tốc trên đất khi thả nút (hoặc đổi hướng).
f32 air_accel = 800.0f
 Tăng tốc trên không.
f32 air_decel = 500.0f
 Giảm tốc trên không.
f32 gravity = 1000.0f
 Gia tốc rơi khi đang lên.
f32 fall_gravity = 1600.0f
 Gia tốc rơi khi đang xuống. Lớn hơn gravity cho cú nhảy chắc tay.
f32 max_fall = 360.0f
 Tốc độ rơi tối đa.
f32 jump_speed = 300.0f
 Vận tốc lên lúc bắt đầu nhảy.
f32 jump_cut = 0.45f
 Nhân vào vận tốc lên khi thả nút nhảy sớm. 1 là tắt.
f32 coyote_time = 0.09f
 Giây sau khi rời mép vẫn nhảy được.
f32 jump_buffer = 0.12f
 Giây nhớ lệnh nhảy bấm sớm.
i32 air_jumps = 0
 Số lần nhảy thêm trên không. 1 là nhảy đôi.
f32 wall_slide_speed = 0.0f
 Tốc độ trượt tường khi áp vào tường lúc rơi. 0 là tắt.
vec2 wall_jump {0.0f, 0.0f}
 Vận tốc khi nhảy khỏi tường (x ra xa tường, y lên). 0 là tắt.
f32 wall_jump_lock = 0.15f
 Giây bỏ qua move_x sau khi nhảy tường, để bật ra được.
platformer_input input {}
 Điều khiển, game ghi vào.
vec2 velocity {}
 Vận tốc hiện tại. Game được ghi (đẩy lùi, lò xo).
bool grounded = false
 Đang đứng trên đất, dốc hoặc bục.
bool on_slope = false
 Đang đứng trên dốc.
i32 on_wall = 0
 -1 áp tường bên trái, 1 bên phải, 0 không.
i32 facing = 1
 Hướng nhìn: -1 trái, 1 phải. Theo input.move_x.
entt::entity ground = entt::null
 Entity đang đứng lên (tilemap hoặc bục).
bool jumped = false
 Vừa nhảy trong nhịp vật lý cuối cùng.
bool landed = false
 Vừa chạm đất trong nhịp vật lý cuối cùng.
f32 coyote_timer = 0.0f
 Thời gian coyote còn lại.
f32 buffer_timer = 0.0f
 Thời gian lệnh nhảy còn được nhớ.
f32 drop_timer = 0.0f
 Thời gian còn xuyên bục một chiều.
f32 wall_lock_timer = 0.0f
 Thời gian còn bỏ qua move_x sau nhảy tường.
i32 air_jumps_left = 0
 Số lần nhảy trên không còn lại.
bool rising = false
 Đang lên từ một cú nhảy mà nút còn được giữ.
bool ground_one_way = false
 Mặt đang đứng là bục một chiều.

Mô tả chi tiết

Nhân vật platformer: chạy, nhảy, rơi, trèo dốc, đứng trên bục di chuyển.

Cần transform và njin::collider hộp trên cùng entity. Module body của engine, trong phase_fixed_update, đọc input, tính velocity và di chuyển entity bằng collision_move(), rồi ghi lại trạng thái (grounded, on_wall...). Game chỉ cần đặt input và đọc trạng thái để chọn animation.

Các cảm giác quen thuộc của platformer đều có sẵn:

  • coyote time: rời mép rồi vẫn nhảy được trong coyote_time giây;
  • jump buffer: bấm nhảy sớm trước khi chạm đất trong jump_buffer giây vẫn được tính;
  • nhảy thấp khi thả sớm: thả nút lúc đang lên thì vận tốc nhân jump_cut;
  • rơi nhanh hơn lên (fall_gravity), giới hạn tốc độ rơi (max_fall);
  • nhảy trên không (air_jumps), trượt tường và nhảy tường (tắt mặc định);
  • dính dốc khi đi xuống dốc, nhảy xuyên xuống bục một chiều (input.drop).

Muốn đẩy lùi khi trúng đòn thì ghi thẳng vào velocity.

Mọi đơn vị là pixel và giây. Gửi event njin::body_jumped và njin::body_landed qua events().