Bảy chương trình trong src/games để đọc, chạy và sửa. Mới bắt đầu? Làm 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) trước: mỗi bài dưới 50 dòng, rồi quay lại đây xem một game đầy đủ.
| Game | Là gì | Đọc để học |
|---|---|---|
| njin_platformer | Mầm Leo Núi: hai màn Tiled với dốc, bục một chiều, bục di chuyển, nhảy tường, quái, checkpoint, hộp thoại | Làm game platformer |
| njin_topdown | Rừng Cổ Thạch: bản đồ Tiled có nước động, kiếm, quái đuổi theo A*, cây che nhân vật, rương, hộp thoại | Làm game top-down |
| njin_debug_demo | Bóng nảy để thử inspector: mỗi phím tốn CPU, RAM hay GPU một chút và inspector hiện ra ngay | Công cụ debug: njin_inspector |
| njin_render_demo | Rừng 128 x 96 ô với 3000 cây đá: phím bật tắt atlas, hạt GPU/CPU, vsync, blur, bloom, CRT, và phím 7 đến 9 cho đêm có đèn, hoàng hôn bằng bảng màu, sương mù bằng nhiễu; phím L, N, O, M, P cho ánh sáng PBR với bóng đổ, normal map và kim loại; HUD hiện số sprite bị cắt và số lệnh vẽ | Vẽ ảnh và shader, Particle và hiệu ứng, Shader nâng cao: ảnh phụ, mảng uniform, ánh sáng, Ánh sáng 2D (PBR) |
| njin_fps | Bắn súng góc nhìn thứ nhất: đi lại và bắn mục tiêu trên lưới 5x5, model glTF (khẩu súng), bóng đổ, sương mù, đèn màu, đèn pin, vệt đạn và mục tiêu trúng phát sáng (bloom), hạt 3D, rung camera | Đồ họa 3D |
| njin_sokoban | Đẩy thùng 2.5D: camera nghiêng, sàn/tường instanced, thùng có texture, nhân vật hình SDF viên nang có viền sáng, đèn trên ô đích, hạt bụi và lấp lánh | Đồ họa 3D |
| njin_platformer3d | Nhảy qua mây: platformer 3D góc nhìn thứ ba trên vật lý Jolt, nhân vật nhảy đôi, bục di chuyển, thùng đẩy được, checkpoint, vòng đích | Vật lý và va chạm |
njin_fps là ví dụ 3D, chuyển thể từ fps_tutorial của Biped-Potato (Bevy) sang njin; model khẩu súng (assets/models/ak.glb) là của tác giả đó, giấy phép MIT (assets/models/LICENSE.txt). njin_sokoban sinh texture thùng từ script Python, không có file nhị phân không rõ nguồn. njin_platformer3d vẽ mọi thứ bằng hình khối và hình SDF, không có file asset nào. Cả ba không có menu, cài đặt hay nhạc: đọc Đồ họa 3D để xem API 3D chúng dùng.
njin_render_demo không có menu hay tiếng: nó chỉ để thấy các tính năng vẽ làm gì. Đi quanh bản đồ bằng WASD hoặc phím mũi tên, đọc phím ở dòng cuối của HUD (hoặc đầu main.cpp). Thử phím 1 với 3000 cây đá bật: số lệnh vẽ rơi từ vài trăm xuống còn vài lệnh. Nó cũng mở cổng debug, nên chạy run_inspected.bat render_demo để xem cùng các số đó trong inspector.
Cả hai game đầu có menu chính, tạm dừng, cài đặt (âm lượng, toàn màn hình, ngôn ngữ, đổi phím cho bàn phím và tay cầm), hai ngôn ngữ (Việt, Anh), nhạc và tiếng, và màn hình ảo 640 x 360. Phần dùng chung nằm ở src/games/shared (menu cài đặt); mọi hình, tiếng, bản đồ đều sinh ra từ script Python tools/make_assets.py của từng game, nên không có file nhị phân không rõ nguồn. topdown dùng font Be Vietnam Pro (giấy phép SIL OFL, kèm OFL.txt) cho chữ tiếng Việt. platformer là pixel art đến tận UI: font VT323 (SIL OFL, kèm OFL-VT323.txt, font pixel có đủ tiếng Việt) vẽ bằng njin::font_pixel ở cỡ 16 và 32, panel và nút vuông góc, màn hình ảo 640 x 360 phóng theo số nguyên với lọc nearest, và crisp_text tắt.
Mọi game trong src/games đều mở cổng cho njin_inspector khi build bản debug (bảy game ở bảng trên cùng njin_pong và njin_sandbox; njin_debug_demo và njin_render_demo luôn mở), nên run_inspected.bat <tên game> chạy game kèm inspector cho bất kỳ game nào. Khi inspector đang nối, log của game hiện ở inspector thay vì console.
Mỗi game có assets riêng nên chạy từ thư mục riêng của nó, build/bin/<game>/ (exe và assets nằm cạnh nhau). Chạy:
Số phiên bản của njin (semver) nằm ở một chỗ duy nhất: src/engine/api/njin_version.h. CMake, log lúc khởi động, njin::version() và njin_inspector đều đọc từ đó; njin_package() mặc định dùng nó làm phiên bản của game nếu bạn không đặt VERSION. Trước 1.0 API còn có thể đổi giữa hai bản MINOR. Lịch sử nằm ở CHANGELOG.md; 0.1.0 là bản phát hành mở đầu từ source tree hiện tại. So NJIN_VERSION với njin::version() để phát hiện game và engine build từ hai bản khác nhau.
Trong CMakeLists của game:
Kết quả là build-release/dist/my_game-1.0.0.zip chứa exe, thư mục assets và các file kèm theo. Trên Windows, exe được gắn icon và thông tin phiên bản, và không có cửa sổ console trừ bản Debug (cần console để đọc log). Game tìm assets/... cạnh exe dù chạy từ thư mục nào.
Nhớ tắt cổng debug trong bản phát hành: debug_server_start() chỉ trong #ifndef NDEBUG.