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
Module và system

Đăng ký module, system, phase; truy cập registry và event của EnTT. Tiếp...

Classes

struct  njin::sys_desc
 Mô tả một system kèm ràng buộc thứ tự, dùng với ecs_register(). Tiếp...
struct  njin::mod_desc
 Mô tả một module: một nhóm system có tên. Tiếp...

Typedefs

using njin::sys_fnc = void (*)(context &ctx)
 Một system là một hàm thường nhận context của engine.

Enumerations

enum  njin::sys_phase {
  njin::phase_startup , njin::phase_pre_update , njin::phase_fixed_update , njin::phase_update ,
  njin::phase_post_update , njin::phase_pre_render , njin::phase_render , njin::phase_post_render ,
  njin::phase_shutdown , njin::phase_count
}
 Các phase của một frame, chạy theo đúng thứ tự khai báo. Tiếp...

Các hàm

entt::registry & njin::world (context &ctx)
 Trả về registry của EnTT chứa mọi entity và component của game.
entt::dispatcher & njin::events (context &ctx)
 Trả về dispatcher của EnTT để gửi và nhận event giữa các system.
void njin::ecs_register (context &ctx, sys_phase phase, sys_fnc fnc, const char *name=nullptr)
 Thêm một system vào lịch chạy của một phase.
void njin::ecs_register (context &ctx, sys_phase phase, const sys_desc &desc)
 Thêm một system kèm ràng buộc thứ tự vào lịch chạy của một phase.
void njin::mod_register (context &ctx, const mod_desc &desc)
 Chạy setup của module và đưa các system của nó vào lịch chạy.
void njin::mod_register (context &ctx, std::initializer_list< mod_desc > mods)
 Đăng ký nhiều module một lần, theo đúng thứ tự trong danh sách.
void njin::mod_register (context &ctx, std::span< const mod_desc > mods)
 Đăng ký nhiều module từ một danh sách tạo lúc chạy, ví dụ một std::vector<mod_desc> hay std::array.

Mô tả chi tiết

Đăng ký module, system, phase; truy cập registry và event của EnTT.

Thông tin về Typedef

◆ sys_fnc

using njin::sys_fnc = void (*)(context &ctx)

Một system là một hàm thường nhận context của engine.

System được đăng ký vào một sys_phase bằng ecs_register() và được gọi mỗi lần phase đó chạy.

Thông tin về Enumeration Type

◆ sys_phase

Các phase của một frame, chạy theo đúng thứ tự khai báo.

phase_startup chạy một lần trước frame đầu tiên và phase_shutdown chạy một lần sau khi cửa sổ đóng. Các phase còn lại chạy mỗi frame.

phase_pre_render, phase_render và phase_post_render chạy giữa lúc bắt đầu và kết thúc vẽ. Module camera của engine vẽ phase_render trong không gian thế giới (qua camera đang dùng) và phase_post_render trong không gian màn hình, nên dùng phase_post_render cho UI.

phase_fixed_update chạy theo nhịp cố định (mặc định 60 lần mỗi giây, xem config::fixed_hz): 0, 1 hay nhiều lần trong một frame tùy FPS. Trong phase này delta() trả về đúng một nhịp. Đặt vật lý ở đây để kết quả không phụ thuộc FPS.

Enumerator
phase_startup 

Một lần, trước frame đầu tiên.

phase_pre_update 

Mỗi frame, trước khi cập nhật.

phase_fixed_update 

Theo nhịp cố định, 0 hoặc nhiều lần mỗi frame. Cho vật lý.

phase_update 

Mỗi frame, logic chính của game.

phase_post_update 

Mỗi frame, sau khi cập nhật. Event được phát ngay sau phase này.

phase_pre_render 

Mỗi frame, trước khi vẽ thế giới.

phase_render 

Mỗi frame, vẽ trong không gian thế giới.

phase_post_render 

Mỗi frame, vẽ trong không gian màn hình (UI).

phase_shutdown 

Một lần, sau khi cửa sổ đóng.

phase_count 

Số lượng phase. Không phải một phase thật.

Thông tin về hàm

◆ world()

entt::registry & njin::world ( context & ctx)

Trả về registry của EnTT chứa mọi entity và component của game.

EnTT là một phần của API module, nên system có thể tự định nghĩa component và truy vấn registry trực tiếp.

Các tham số
ctxContext của engine.
Giá trị trả về
Registry của game.

◆ events()

entt::dispatcher & njin::events ( context & ctx)

Trả về dispatcher của EnTT để gửi và nhận event giữa các system.

Event đã enqueue được phát ngay sau phase_post_update.

Các tham số
ctxContext của engine.
Giá trị trả về
Dispatcher của game.

◆ ecs_register() [1/2]

void njin::ecs_register ( context & ctx,
sys_phase phase,
sys_fnc fnc,
const char * name = nullptr )

Thêm một system vào lịch chạy của một phase.

Chỉ hợp lệ bên trong callback setup của module. Gọi ở nơi khác sẽ bị bỏ qua và ghi cảnh báo. Các module chạy theo thứ tự đăng ký.

Các tham số
ctxContext của engine.
phasePhase mà system chạy trong đó.
fncHàm system.
nameTên system, hiện trong njin_inspector. Có thể null.

◆ ecs_register() [2/2]

void njin::ecs_register ( context & ctx,
sys_phase phase,
const sys_desc & desc )

Thêm một system kèm ràng buộc thứ tự vào lịch chạy của một phase.

Trong cùng một module và phase, các system được sắp theo sys_desc (xem _mod.h): ràng buộc after/before được đảm bảo trước, sau đó system có order nhỏ hơn chạy trước, còn bằng nhau thì theo thứ tự đăng ký.

Các tham số
ctxContext của engine.
phasePhase mà system chạy trong đó.
descMô tả system và thứ tự của nó.

◆ mod_register() [1/3]

void njin::mod_register ( context & ctx,
const mod_desc & desc )

Chạy setup của module và đưa các system của nó vào lịch chạy.

Phải gọi trước run(). Tên module chỉ được đăng ký một lần.

Các tham số
ctxContext của engine.
descMô tả module.

◆ mod_register() [2/3]

void njin::mod_register ( context & ctx,
std::initializer_list< mod_desc > mods )

Đăng ký nhiều module một lần, theo đúng thứ tự trong danh sách.

Giống hệt gọi mod_register() cho từng module lần lượt: module đứng trước chạy trước trong cùng phase, và một module lỗi (trùng tên, đăng ký sau run()) chỉ bị bỏ qua riêng nó.

njin::mod_register(*ctx, {input_module(), physics_module(), ui_module()});
void mod_register(context &ctx, const mod_desc &desc)
Chạy setup của module và đưa các system của nó vào lịch chạy.
Các tham số
ctxContext của engine.
modsCác module, theo thứ tự đăng ký.

◆ mod_register() [3/3]

void njin::mod_register ( context & ctx,
std::span< const mod_desc > mods )

Đăng ký nhiều module từ một danh sách tạo lúc chạy, ví dụ một std::vector<mod_desc> hay std::array.

Cùng quy tắc với bản nhận danh sách trực tiếp.

Các tham số
ctxContext của engine.
modsCác module, theo thứ tự đăng ký.