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

Cấu hình cửa sổ và vòng lặp, truyền vào create(). Tiếp...

#include <njin_cfg.h>

Các thuộc tính Public

const char * title
 Tiêu đề cửa sổ.
f32 width
 Chiều rộng cửa sổ (pixel).
f32 height
 Chiều cao cửa sổ (pixel).
f32 target_fps
 FPS mục tiêu của vòng lặp.
rgba clear_bg_color = { .r = 1.0, .g = 1.0, .b = 1.0, .a = 1.0 }
 Màu nền xóa mỗi frame. Mặc định là trắng.
f32 fixed_hz = 60.0f
 Số lần phase_fixed_update chạy mỗi giây. Mặc định 60.
key_code exit_key = key_escape
 Phím đóng game ngay lập tức.
bool resizable = false
 Cho phép người dùng kéo đổi kích thước cửa sổ.
const char * app_name = nullptr
 Tên thư mục lưu game, xem save_path(). Để trống thì dùng title.
vec2 virtual_size {}
 Độ phân giải ảo, ví dụ {320, 180} cho pixel art.
bool integer_scale = true
 Với độ phân giải ảo: chỉ phóng theo bội số nguyên (mọi pixel ảo to bằng nhau), phần thừa của cửa sổ là viền.
bool vsync = false
 Đồng bộ dọc: mỗi frame chờ màn hình làm tươi xong mới hiện, nên không xé hình và GPU, CPU nghỉ giữa các frame (đỡ tốn pin).
bool crisp_text = true
 Vẽ chữ ở độ phân giải thật của cửa sổ khi máy có GPU thật, để chữ nét ở mọi cỡ cửa sổ (mặc định bật).
bool smooth_ui = false
 Vẽ giao diện ở độ phân giải thật của cửa sổ, cho UI mịn.
i32 render_scale = 1
 Khử răng cưa bằng supersampling: thế giới và giao diện được vẽ ở độ phân giải gấp render_scale lần (theo mỗi chiều) rồi thu nhỏ lại bằng lọc mượt khi lên màn hình.

Mô tả chi tiết

Cấu hình cửa sổ và vòng lặp, truyền vào create().

Thông tin về Member Data

◆ exit_key

key_code njin::config::exit_key = key_escape

Phím đóng game ngay lập tức.

Mặc định là Esc. Đặt key_none để tắt, khi game cần dùng Esc cho việc khác (ví dụ mở menu tạm dừng).

◆ virtual_size

vec2 njin::config::virtual_size {}

Độ phân giải ảo, ví dụ {320, 180} cho pixel art.

{0, 0} là tắt. Xem window_set_virtual_size().

◆ vsync

bool njin::config::vsync = false

Đồng bộ dọc: mỗi frame chờ màn hình làm tươi xong mới hiện, nên không xé hình và GPU, CPU nghỉ giữa các frame (đỡ tốn pin).

Mặc định tắt. Bật thì target_fps vẫn còn tác dụng như một mức trần thêm. Xem window_set_vsync().

◆ crisp_text

bool njin::config::crisp_text = true

Vẽ chữ ở độ phân giải thật của cửa sổ khi máy có GPU thật, để chữ nét ở mọi cỡ cửa sổ (mặc định bật).

Với độ phân giải ảo (virtual_size), cảnh được vẽ nhỏ rồi phóng lên và chữ vẽ trong đó sẽ bị mờ; bật thì chữ trên màn hình (UI, HUD) được vẽ sau khi phóng, từ font dựng đúng cỡ trên màn hình. Xem trang Vẽ và chữ. Máy chỉ có renderer phần mềm luôn vẽ chữ trong ảnh ảo.

◆ smooth_ui

bool njin::config::smooth_ui = false

Vẽ giao diện ở độ phân giải thật của cửa sổ, cho UI mịn.

Với độ phân giải ảo (virtual_size) mặc định cả frame vẽ vào ảnh nhỏ rồi phóng lên bằng lọc nearest, nên panel bo góc, nút và thanh trượt bị vỡ hạt theo mức phóng. Bật thì world vẫn vẽ trong ảnh ảo (pixel art), còn phase_post_render (UI, HUD), hội thoại, toast, flash và fade vẽ sau khi ảnh đã phóng, thẳng vào cửa sổ: hình khối và chữ đều mịn ở mọi cỡ cửa sổ, tọa độ vẫn tính theo pixel ảo. Mặc định tắt: UI giữ nguyên kiểu pixel. Bật thì crisp_text không còn cần. Xem trang Vẽ và chữ.

◆ render_scale

i32 njin::config::render_scale = 1

Khử răng cưa bằng supersampling: thế giới và giao diện được vẽ ở độ phân giải gấp render_scale lần (theo mỗi chiều) rồi thu nhỏ lại bằng lọc mượt khi lên màn hình.

1 là tắt (mặc định). 2, 4 hay 8 cho cạnh mượt hơn, tốn thêm bấy nhiêu lần pixel GPU phải vẽ (4 lần ở mức 2, 16 lần ở mức 4...).

Đây không phải MSAA của cửa sổ (raylib chỉ có đúng một mức 4x qua GLFW, không chọn được 2x/8x); cách này chạy trên mọi GPU giống nhau và cho đúng số mức đã đặt. Không đổi được lúc đang chạy: create() tạo cửa sổ và các render texture theo đúng giá trị này một lần, nên đổi mức cần khởi động lại game (đọc giá trị người chơi chọn từ file cài đặt của bạn, trước khi gọi create() ở lần chạy sau). Xem render_scale().

Không đổi tọa độ nào cả: screen_size(), chuột, camera vẫn tính như virtual_size (nếu có) hay kích thước cửa sổ (nếu không), không biết gì về render_scale. Pixel art dùng virtual_size với filter_nearest nên thường không cần; hợp game vẽ hình khối, sprite xoay hay chữ vector hơn.