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

njin là một engine game nhỏ viết bằng C++20, làm cả game 2D lẫn 3D. Nó dùng EnTT cho ECS và raylib cho cửa sổ, đồ họa, nhập liệu. raylib được giấu hoàn toàn: game chỉ include njin.h và không bao giờ thấy raylib.

Phần lớn API (module, system, ECS, nhập liệu, thời gian, âm thanh, UI, particle/hiệu ứng, debug) dùng chung cho 2D và 3D. Vẽ hình, sprite, tilemap, camera và va chạm ở Phần 2–4 là 2D (njin_draw.h, njin_camera.h, njin_collision.h...); Đồ họa 3D là trang 3D riêng (njin_3d.h): camera phối cảnh, hình khối và SDF, model glTF, ánh sáng có bóng đổ, instancing. Một game chỉ dùng phần nào mình cần; hai phần dựng trên cùng ECS và cùng vòng lặp nên trộn được (ví dụ HUD 2D vẽ đè lên cảnh 3D).

Trang này là tài liệu để dùng njin và để hiểu nó.

Mã nguồn: https://github.com/tptindev/njin. Báo lỗi và góp ý ở mục Issues của repo. Lịch sử phiên bản nằm trong CHANGELOG.md ở thư mục gốc.

Lộ trình cho người mới

Chưa quen C, C++, CMake hay shader? Đọc nhóm 13 bài Kiến thức nền: học trước khi làm game trước (bỏ qua nếu đã biết). Rồi đi theo thứ tự này:

  1. Cài môi trường : cài môi trường (bỏ qua nếu đã có trình biên dịch C++20, CMake, Ninja và Git)
  2. Bắt đầu : build và chạy chương trình đầu tiên
  3. Nhân vật nhảy được trong 50 dòng (platformer) hoặc Nhân vật đi 8 hướng trong 50 dòng (top-down) : một nhân vật chạy được trên bản đồ, dưới 50 dòng
  4. Entity, component và event : entt::registry và view, nếu các bài trên còn lạ. Mười thao tác là đủ
  5. Sprite và animation và Animation và máy trạng thái : thay hình chữ nhật bằng nhân vật có ảnh
  6. Level từ Tiled và LDtk : vẽ màn chơi trong Tiled hoặc LDtk thay vì viết từng ô bằng code
  7. Âm thanh, UI: menu, nút, thanh trượt, Hộp thoại và đa ngôn ngữ : tiếng, menu, hộp thoại
  8. Game mẫu và đóng gói : đọc một game đầy đủ
  9. Muốn làm X thì dùng gì : tra khi cần biết "muốn làm X thì dùng hàm nào"

Tài liệu chia thành 7 phần

Các trang xếp theo độ khó tăng dần: đi từ Phần 1 xuống Phần 7, hoặc nhảy thẳng tới phần bạn cần. Thanh bên trái cũng hiện đúng cây này. Cột Phạm vi nói API của phần đó dùng cho loại game nào: "Chung" chạy được với cả game 2D lẫn 3D (module, ECS, nhập liệu, âm thanh, UI, đóng gói...); "2D" là vẽ hình, sprite, tilemap, camera và va chạm 2D; "3D" chỉ Đồ họa 3D, trang riêng cho njin_3d.h trong Phần 7.

Phần Mức Phạm vi Bạn được gì
Phần 1: Bắt đầu Người mới Chung Cài môi trường, chạy chương trình đầu tiên, có ngay một nhân vật chạy được. Kèm 13 bài nền về C, C++, CMake, shader
Phần 2: Khái niệm cốt lõi Cơ bản Chung Hiểu module, system, một frame chạy thế nào, entity và component, nhập liệu, thời gian, toán, log
Phần 3: Hình ảnh và chuyển động Cơ bản 2D Vẽ hình và chữ, sprite, animation, camera, particle, pixel art
Phần 4: Thế giới và gameplay Trung cấp 2D Bản đồ ô vuông, Tiled và LDtk, va chạm, prefab; ghép lại thành game platformer và top-down
Phần 5: Âm thanh và giao diện Trung cấp Chung Tiếng động và nhạc, menu, hộp thoại, đa ngôn ngữ
Phần 6: Hoàn thiện và phát hành Trung cấp Chung Chia màn chơi, lưu game, cài đặt của người chơi, cửa sổ, đọc game mẫu, đóng gói
Phần 7: Nâng cao Nâng cao 2D + 3D Shader, instancing, hậu kỳ, sinh bản đồ tự động, Đồ họa 3D (3D), debug bằng inspector

Sau bảy phần có Phụ lục , gồm bảng tra nhanh "muốn làm X thì dùng gì", tra cứu từng hàm theo nhóm API, và kiến trúc bên trong engine.

Một chương trình nhỏ nhất

#include <njin.h>
int main() {
const njin::config cfg{.title = "njin",
.width = 1280.0f,
.height = 720.0f,
.target_fps = 60.0f};
njin::context *ctx = njin::create(cfg);
njin::run(*ctx);
return 0;
}
void run(context &ctx)
Chạy vòng lặp chính cho đến khi cửa sổ đóng.
context * create(const config &cfg)
Mở cửa sổ và trả về context của engine.
void destroy(context *ctx)
Giải phóng mọi tài nguyên của engine và đóng cửa sổ.
Cấu hình cửa sổ và vòng lặp, truyền vào create().
Definition njin_cfg.h:11

Hàm run chạy vòng lặp đến khi cửa sổ đóng. Mọi logic của game nằm trong module, xem Module, system và phase.

Một game hoàn chỉnh

src/games/pong là một game Pong đầy đủ viết trên njin: menu, chơi với máy hoặc hai người, tạm dừng, slow motion ở điểm quyết định, âm thanh tự sinh, lưu kỷ lục, cửa sổ đổi kích thước được. Đọc từ trên xuống như một chuyến tham quan engine. Build target njin_pong rồi chạy build\bin\njin_pong.exe.

Cấu trúc mã nguồn

src/
engine/
api/ header công khai. Chỉ include njin.h là đủ
runtime/ phần cài đặt, dùng raylib. Game không include trực tiếp
games/
sandbox/ game mẫu
pong/ game Pong hoàn chỉnh
tools/
inspector/ njin_inspector, công cụ debug chạy cạnh game