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
Muốn làm X thì dùng gì

Bảng tra nhanh: tìm việc bạn muốn làm ở cột trái, dùng thứ ở cột giữa, đọc trang ở cột phải. Mọi thứ nằm trong njin:: và chỉ cần #include <njin.h>. Muốn xem đầy đủ tham số của một hàm thì bấm vào tên nó, hoặc vào Nhóm API.

Chưa biết bắt đầu từ đâu? Đọc 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ột nhân vật chạy được trong 50 dòng. Chưa quen entt::registry? Đọc Entity, component và event.

Khởi động và cấu trúc game

Muốn Dùng Xem
Mở cửa sổ, chạy, đóng njin::create(), njin::run(), njin::destroy() Bắt đầu
Thoát game từ trong game njin::quit() Cửa sổ, file và lưu game
Gom logic của game vào một chỗ njin::mod_desc với setup, đăng ký bằng njin::mod_register() Module, system và phase
Chạy một hàm mỗi frame, hay một lần lúc bắt đầu njin::ecs_register() với một njin::sys_phase Vòng lặp game
Vật lý chạy đều, không phụ thuộc FPS phase_fixed_update Thời gian, fixed update, timer và tween
Tạo entity, gắn component njin::world() rồi registry.create(), emplace<>() Entity, component và event
Báo tin giữa các system njin::events() Entity, component và event
Tạo nhiều entity giống nhau (quái, đạn) njin::prefab_register(), njin::prefab_spawn() Prefab và transform cha–con
Chia game thành menu, màn chơi, game over njin::scene_register(), njin::scene_set() Scene
Chuyển cảnh mờ dần njin::scene_fade() Scene

Nhân vật và chuyển động

Muốn Dùng Xem
Nhân vật platformer chạy, nhảy njin::platformer_body + njin::platformer_input_map Nhân vật nhảy được trong 50 dòng, Làm game platformer
Nhảy đôi, trượt tường, nhảy tường air_jumps, wall_slide_speed, wall_jump của njin::platformer_body Làm game platformer
Nhân vật top-down đi 8 hướng, lướt njin::topdown_body + njin::topdown_input_map Nhân vật đi 8 hướng trong 50 dòng, Làm game top-down
Đẩy lùi khi trúng đòn ghi thẳng vào velocity của body Làm game platformer
Bục di chuyển, lính gác đi tuần njin::path_mover Làm game platformer
Quái đuổi theo, tìm đường tránh tường njin::nav_grid_from_world(), njin::nav_find_path(), njin::nav_steer() Làm game top-down
Cho một vật chạy tới một điểm trong một khoảng thời gian njin::tween_move() Màn hình ảo, hẹn giờ và tween
Tự viết bộ điều khiển di chuyển njin::collision_move() Va chạm

Va chạm

Muốn Dùng Xem
Cho vật có hình va chạm njin::collider (hộp hoặc tròn) Va chạm
Biết hai vật vừa chạm nhau (đạn trúng quái, nhặt đồ) event njin::collision_enter, njin::collision_exit, trigger = true Va chạm
Chọn cái gì va chạm với cái gì layer và mask của njin::collider, njin::layer_bit() Va chạm
Tường và mặt đất từ bản đồ ô collider collider_tiles trên entity của njin::tilemap Va chạm, Tilemap
Có gì trong vùng đánh, vùng nổ, dưới con chuột njin::collision_overlap_rect(), njin::collision_overlap_circle(), njin::collision_overlap_point() Va chạm
Bắn tia, kiểm tra tầm nhìn njin::collision_raycast(), njin::collision_line_of_sight() Va chạm, Làm game top-down
Nhìn thấy khung va chạm để debug njin::collision_set_debug() Va chạm

Bản đồ và màn chơi

Muốn Dùng Xem
Vẽ bản đồ ô vuông bằng code njin::tilemap, njin::tilemap_set() Tilemap
Viết bản đồ bằng chữ, mỗi ký tự một ô (không cần Tiled hay LDtk) njin::tilemap_from_text(), njin::tilemap_from_rows() Tilemap
Ô là dốc, bục một chiều, không va chạm njin::tilemap_set_shape() Làm game platformer
Nước, đuốc chuyển động njin::tilemap_animate() Tilemap
Tự sinh bản đồ top-down (đảo, vùng đất) từ nhiễu njin::generate_topdown(), njin::noise_2d() Sinh bản đồ tự động
Tự sinh màn platformer chơi được (hố, hang, bục) njin::generate_platformer() Sinh bản đồ tự động
Làm bản đồ sinh ra bớt vụn: xoá chấm lẻ, thêm viền, rải hoa njin::grid_majority(), njin::grid_border(), njin::grid_scatter() Sinh bản đồ tự động
Góc bo tròn tự nhiên cho đất, nước, tường (autotile) njin::grid_autotile(), njin::autotile_index() Bo góc tự nhiên: autotile
Sinh bản đồ bằng Wave Function Collapse, từ mẫu hoặc luật tự viết njin::wfc_learn(), njin::wfc_generate() Sinh bản đồ tự động
Đưa lưới sinh ra vào tilemap njin::tilemap_from_grid() Sinh bản đồ tự động
Nạp màn chơi vẽ trong Tiled hoặc LDtk njin::level_load(), njin::level_load_ldtk() Level từ Tiled và LDtk
Tìm điểm xuất hiện, cửa, quái đặt trong màn njin::level_find() Level từ Tiled và LDtk
Xem ô nào ở vị trí nào, có chạm ô không njin::tilemap_cell_at(), njin::tilemap_overlaps(), njin::tilemap_move() Tilemap

Camera

Muốn Dùng Xem
Tạo camera njin::camera_spawn() Camera
Camera bám nhân vật, không lộ ra ngoài màn njin::camera_follow, bounds từ njin::level_bounds() Camera, Làm game platformer
Đổi vị trí chuột thành vị trí trong thế giới njin::scr2w() (ngược lại njin::w2scr()) Camera
Bỏ qua vẽ những gì ngoài màn hình njin::camera_bounds() Camera
Rung màn hình njin::camera_shake() Particle và hiệu ứng
Pixel art với độ phân giải cố định njin::window_set_virtual_size(), hoặc virtual_size trong njin::config Vẽ hình và chữ, Màn hình ảo, hẹn giờ và tween

Nhập liệu

Muốn Dùng Xem
Hỏi "nút nhảy có bấm không" (không hỏi phím cụ thể) njin::action_define(), njin::action_pressed() Nhập liệu
Trục ngang/dọc từ hai phím hoặc cần analog njin::axis_define(), njin::axis_value() Nhập liệu
Đọc thẳng phím, chuột, tay cầm njin::key_pressed(), njin::mouse_pos(), njin::pad_axis() Nhập liệu
Gõ chữ njin::text_char() Nhập liệu
Cho người chơi đổi phím njin::action_rebind(), njin::input_bindings_save() Cài đặt của người chơi
Rung tay cầm njin::pad_rumble() Cài đặt của người chơi

Vẽ

Muốn Dùng Xem
Vẽ hình chữ nhật, tròn, đường thẳng njin::draw_rect(), njin::draw_circle(), njin::draw_line() Vẽ hình và chữ
Vẽ chữ (kể cả tiếng Việt) njin::draw_text(), njin::font_load() Vẽ hình và chữ
Đo hay ngắt dòng chữ njin::text_measure(), njin::text_wrap() Vẽ hình và chữ
Nạp và vẽ ảnh njin::texture_load(), njin::texture_draw() Vẽ ảnh và shader
Ảnh pixel art không bị mờ njin::texture_set_filter() với filter_nearest Vẽ ảnh và shader
Nhân vật có ảnh njin::sprite Sprite và animation
Sắp xếp ai đứng trước ai (top-down) njin::draw_set_y_sort() Làm game top-down
Ghép nhiều ảnh nhỏ vào một trang njin::atlas_create(), njin::atlas_load() Vẽ ảnh và shader
Ánh sáng: đèn điểm, đèn nón, đèn hướng, ban đêm, mặt trời njin::lighting_set(), njin::light_2d Ánh sáng 2D (PBR)
Bóng đổ đúng từng pixel của sprite (cây, bụi, đá, nhân vật) njin::light_occluder_pixels Ánh sáng 2D (PBR)
Bóng đổ từ tường, hàng rào, hình hình học njin::light_occluder, njin::light_occluder_capsule(), njin::light_occluder_sprite Ánh sáng 2D (PBR)
Bóng đổ từ tường của tilemap njin::light_occluders_from_tiles() Ánh sáng 2D (PBR)
Sprite nổi khối, kim loại, bóng gương dưới đèn sprite::normal, sprite::material (PBR, xếp kênh MRA như raylib) Ánh sáng 2D (PBR)
Sprite tự phát sáng (hoa dạ quang, mắt quái, cửa sổ) sprite::emissive, sprite::emissive_power Ánh sáng 2D (PBR)
Đổi cách nén HDR (Reinhard, ACES) njin::lighting_desc::tonemap Ánh sáng 2D (PBR)
Shader riêng njin::shader_load(), njin::shader_set_f32() Vẽ ảnh và shader
Shader đọc thêm một ảnh (bảng màu, nhiễu, mặt nạ) njin::shader_set_texture() Shader nâng cao: ảnh phụ, mảng uniform, ánh sáng
Shader nhận một danh sách (các nguồn sáng) njin::shader_set_vec4_array() Shader nâng cao: ảnh phụ, mảng uniform, ánh sáng
Một shader chạy trên cả khung hình: đêm có đèn, hoàng hôn, sương mù njin::camera_set_post_shader() kèm ảnh phụ và mảng uniform Shader nâng cao: ảnh phụ, mảng uniform, ánh sáng
Vẽ hàng nghìn hình giống nhau bằng một lệnh vẽ njin::instance_buffer_create(), njin::draw_instanced() Instancing: hàng nghìn hình bằng một lệnh vẽ
Lưu render texture (sprite sheet đã bake) ra PNG njin::render_texture_save() Vẽ trước một lần, đọc lại mỗi frame
Vẽ trước các hình vào một sprite sheet, đọc lại mỗi frame njin::render_texture_begin(), njin::draw_instanced() kèm render texture, njin::render_texture_set_filter() Vẽ trước một lần, đọc lại mỗi frame
Thanh máu, vòng hồi chiêu, bóng đổ vẽ bằng công thức (SDF) njin::shader_begin() quanh một ảnh kéo giãn, njin::shader_set_vec2() Bài 11: SDF: vẽ hình bằng khoảng cách
Vẽ vào một ảnh ngoài màn hình njin::render_texture_load(), njin::render_texture_begin() Vẽ ảnh và shader

Sprite và animation

Muốn Dùng Xem
Animation từ một sprite sheet đều ô njin::sprite_anim Sprite và animation
Animation từ Aseprite njin::anim_sheet_load() Animation và máy trạng thái
Chuyển idle, run, jump theo trạng thái njin::anim_graph_create(), njin::animator_set_bool(), njin::animator_play() Animation và máy trạng thái

Hiệu ứng và cảm giác chơi

Muốn Dùng Xem
Nổ, bụi, tia lửa, khói, lửa njin::particles_spawn() với mẫu trong njin::fx:: Particle và hiệu ứng
Dừng hình một chút khi trúng đòn njin::hitstop() Particle và hiệu ứng
Nháy trắng một sprite, nháy cả màn hình njin::sprite_flash(), njin::screen_flash() Particle và hiệu ứng
Kẻ địch chết: sprite tan biến (hoặc hiện ra dần) njin::sprite_dissolve(), njin::dissolve_fx Particle và hiệu ứng
Slow motion, tạm dừng njin::time_set_scale(), njin::time_set_paused() Thời gian, fixed update, timer và tween
Làm mờ, CRT, bloom, vignette toàn màn njin::post_fx_set() Hậu kỳ (post-processing)
Chuyển mượt giữa hai bộ hiệu ứng njin::post_fx_lerp() Hậu kỳ (post-processing)

Thời gian và ngẫu nhiên

Muốn Dùng Xem
Thời gian của frame để nhân vào vận tốc njin::delta() Thời gian, fixed update, timer và tween
Làm gì đó sau N giây njin::timer_after() Màn hình ảo, hẹn giờ và tween
Làm gì đó cứ mỗi N giây (sinh quái, hồi máu) njin::timer_every() Màn hình ảo, hẹn giờ và tween
Chạy một giá trị từ A đến B, mượt njin::tween_value(), njin::tween_move() Màn hình ảo, hẹn giờ và tween
Số ngẫu nhiên njin::random() Toán học, va chạm, số ngẫu nhiên
Hình học: vec2, hình chữ nhật, va chạm cơ bản njin::vec2, njin::rect, njin::collide_rects() Toán học, va chạm, số ngẫu nhiên

Âm thanh

Muốn Dùng Xem
Phát tiếng động njin::sound_load(), njin::sound_play_once() Âm thanh
Tiếng động theo vị trí, nhỏ dần khi ở xa njin::sound_play_at() Âm thanh
Nhạc nền, chuyển nhạc mượt njin::music_load(), njin::music_play(), njin::music_crossfade() Âm thanh
Thanh âm lượng nhạc, hiệu ứng, giao diện njin::audio_set_bus_volume() Cài đặt của người chơi

Giao diện, hộp thoại, đa ngôn ngữ

Muốn Dùng Xem
Menu có nút, thanh trượt, dùng được với tay cầm njin::ui_begin(), njin::ui_button(), njin::ui_slider() UI: menu, nút, thanh trượt
Thông báo nhỏ "Đã lưu game" njin::ui_toast() UI: menu, nút, thanh trượt
Hỏi xác nhận (popup) njin::ui_popup() UI: menu, nút, thanh trượt
Hộp thoại NPC, chữ chạy, lựa chọn njin::dialog_load(), njin::dialog_start() Hộp thoại và đa ngôn ngữ
Nhiều ngôn ngữ njin::i18n_load(), njin::i18n_set_language(), njin::tr() Hộp thoại và đa ngôn ngữ

Lưu game, cài đặt, cửa sổ

Muốn Dùng Xem
Đường dẫn lưu game của người dùng njin::save_path() Cửa sổ, file và lưu game
Đọc và ghi file njin::file_read(), njin::file_write() Cửa sổ, file và lưu game
Lưu game dạng JSON njin::json_save(), njin::json_load() JSON và lưu game
Lưu và nạp âm lượng, phím đã đổi njin::settings_save(), njin::settings_load() Cài đặt của người chơi
Toàn màn hình njin::window_set_fullscreen() Cửa sổ, file và lưu game
Chụp màn hình njin::screenshot() Cửa sổ, file và lưu game

Debug

Muốn Dùng Xem
Xem FPS, entity, collider, log trong cửa sổ riêng njin::debug_server_start() rồi mở njin_inspector Công cụ debug: njin_inspector
Theo dõi một giá trị đang đổi njin::debug_watch() Công cụ debug: njin_inspector
Quay cửa sổ game thành GIF (bấm F9 trong inspector) njin::debug_server_start() rồi mở njin_inspector Quay màn hình
Hiện component tự định nghĩa trong inspector njin::debug_component Công cụ debug: njin_inspector
Ghi log NJIN_INFO, NJIN_WARN, NJIN_ERROR Ghi log
Sửa ảnh và shader khi game đang chạy njin::hot_reload_enable() Vẽ ảnh và shader