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
UI

Panel, nút, công tắc, thanh trượt, lựa chọn, popup, toast; chuột, bàn phím, tay cầm; tùy biến ảnh và shader. Tiếp...

Classes

struct  njin::ui_skin
 Cách vẽ một mặt của widget: màu phẳng, ảnh (có thể 9-slice), hoặc cả hai. Tiếp...
struct  njin::ui_look
 Diện mạo của một loại widget ở từng trạng thái. Tiếp...
struct  njin::ui_style
 Toàn bộ giao diện của UI: phông chữ, kích thước, diện mạo từng loại widget, âm thanh. Tiếp...
struct  njin::ui_panel_desc
 Vị trí và kích thước của một panel, dùng với ui_begin(). Tiếp...
struct  njin::ui_circle_desc
 Mô tả một thanh tiến độ hình tròn, dùng với ui_progress_circle(). Tiếp...
struct  njin::ui_toast_desc
 Cách hiện một toast. Tiếp...
struct  njin::ui_popup_desc
 Mô tả một popup, dùng với ui_popup() và ui_popup_begin(). Tiếp...
struct  njin::ui_widget_data
 Dữ liệu cấu hình và trạng thái của một widget. Tiếp...
struct  njin::ui_panel_data
 Dữ liệu của một panel chứa danh sách widget. Tiếp...
struct  njin::ui_popup_data
 Dữ liệu của một popup thông báo hoặc xác nhận. Tiếp...
struct  njin::ui_layout
 Toàn bộ bố cục UI nạp từ file JSON hoặc xuất từ editor. Tiếp...
struct  njin::ui_layout_event
 Sự kiện UI phát ra khi người dùng tương tác với widget. Tiếp...

Typedefs

using njin::ui_event_callback = std::function<void(const ui_layout_event &)>
 Kiểu hàm callback khi có sự kiện UI.

Enumerations

enum  njin::ui_toast_kind { njin::ui_toast_info , njin::ui_toast_success , njin::ui_toast_warning , njin::ui_toast_error }
 Loại toast: quyết định màu vạch bên trái (xem ui_style::toast_accent). Tiếp...
enum class  njin::ui_widget_kind {
  ui_widget_kind::label , ui_widget_kind::space , ui_widget_kind::button , ui_widget_kind::toggle ,
  ui_widget_kind::slider , ui_widget_kind::choice , ui_widget_kind::progress , ui_widget_kind::image ,
  ui_widget_kind::row , ui_widget_kind::keybind , ui_widget_kind::circle
}
 Loại widget trong layout UI khai báo. Tiếp...

Các hàm

ui_style njin::ui_default_style ()
 Giao diện mặc định: panel tối trong suốt, nút bo góc, màu nhấn xanh.
void njin::ui_style_set (context &ctx, const ui_style &style)
 Đặt style cho mọi widget vẽ sau đó.
ui_style njin::ui_style_get (const context &ctx)
 Style hiện tại.
void njin::ui_begin (context &ctx, const ui_panel_desc &desc={})
 Bắt đầu một panel.
void njin::ui_end (context &ctx)
 Kết thúc panel và vẽ nó.
void njin::ui_row (context &ctx, i32 columns)
 Xếp columns widget tiếp theo thành một hàng ngang, chia đều bề rộng.
void njin::ui_label (context &ctx, const char *text)
 Một dòng chữ.
void njin::ui_space (context &ctx, f32 height)
 Khoảng trống.
bool njin::ui_button (context &ctx, const char *label, bool enabled=true)
 Một nút bấm.
bool njin::ui_toggle (context &ctx, const char *label, bool &value)
 Một công tắc bật/tắt.
bool njin::ui_slider (context &ctx, const char *label, f32 &value, f32 min, f32 max, f32 step=0.0f, bool percent=false)
 Một thanh trượt.
bool njin::ui_choice (context &ctx, const char *label, i32 &index, std::initializer_list< const char * > options)
 Chọn một trong nhiều lựa chọn bằng trái/phải hoặc bấm: độ khó, độ phân giải, ngôn ngữ.
bool njin::ui_choice (context &ctx, const char *label, i32 &index, std::span< const std::string > options)
 Chọn một trong nhiều lựa chọn (danh sách động).
void njin::ui_progress (context &ctx, f32 value, const char *text=nullptr)
 Một thanh tiến độ, không bấm được: máu, thời gian nạp.
void njin::ui_progress_circle (context &ctx, const ui_circle_desc &desc)
 Một thanh tiến độ hình tròn, không bấm được: hồi chiêu, nạp đạn, máu dạng vòng.
void njin::ui_image (context &ctx, texture_handle texture, vec2 size, rect source={})
 Một ảnh, căn giữa trong panel.
bool njin::ui_keybind (context &ctx, const char *label, action_handle action, bool pad=false)
 Một dòng đổi phím cho màn hình cài đặt: bên trái là tên, bên phải là phím đang gắn vào action.
bool njin::ui_keybind_listening (const context &ctx)
 Có dòng ui_keybind() nào đang chờ phím không.
bool njin::ui_back (context &ctx)
 true ở frame người chơi bấm quay lại (Esc, Backspace, nút B) trong lúc có panel đang hiện.
void njin::ui_focus (context &ctx, const char *label)
 Chọn sẵn widget có nhãn label (trong panel đang mở), thường gọi khi vừa mở menu để nút mặc định được chọn cho tay cầm.
bool njin::ui_active (const context &ctx)
 Có panel nào nhận phím được vẽ ở frame trước không (panel HUD với navigable = false không tính).
rect njin::ui_last_rect (const context &ctx)
 Khung của widget vừa đặt trong panel đang mở (ui_label(), ui_button(), ui_space()...), pixel màn hình.
bool njin::ui_mouse_over (const context &ctx)
 Chuột có đang nằm trên một panel không (các panel của frame trước).
void njin::ui_toast (context &ctx, const char *text, const ui_toast_desc &desc={})
 Hiện một thông báo nhỏ ở góc màn hình, tự biến mất: "Đã lưu game", "Nhặt được 5 vàng".
void njin::ui_toast_clear (context &ctx)
 Xóa mọi toast đang hiện, ví dụ khi đổi scene.
i32 njin::ui_popup (context &ctx, const ui_popup_desc &desc, bool &open)
 Một popup xác nhận: nền tối, tiêu đề, nội dung và vài nút.
void njin::ui_popup_begin (context &ctx, const ui_popup_desc &desc)
 Bắt đầu một popup có nội dung tùy ý: làm tối nền, mở panel modal.
void njin::ui_popup_end (context &ctx)
 Kết thúc popup bắt đầu bằng ui_popup_begin().
ui_style njin::ui_pixel_style ()
 Style pixel-art tiêu chuẩn của njin (góc vuông phẳng, kích thước nhỏ gọn 16px).
bool njin::ui_layout_load (context &ctx, const char *path, ui_layout &out)
 Nạp bố cục UI từ file JSON.
bool njin::ui_layout_parse (const json_value &json, ui_layout &out)
 Phân tích dữ liệu JSON thành ui_layout.
json_value njin::ui_layout_to_json (const ui_layout &layout)
 Chuyển đổi ui_layout thành json_value để lưu file.
bool njin::ui_layout_save (const char *path, const ui_layout &layout, bool pretty=true)
 Ghi bố cục UI ra file JSON.
bool njin::ui_draw_panel (context &ctx, ui_layout &layout, const char *panel_id, const ui_event_callback &on_event=nullptr)
 Vẽ một panel cụ thể trong layout.
void njin::ui_draw_layout (context &ctx, ui_layout &layout, const ui_event_callback &on_event=nullptr)
 Vẽ tất cả các panel có cờ visible == true và các popup đang open.
bool njin::ui_layout_is_clicked (const ui_layout &layout, const char *widget_id)
 Kiểm tra nút có vừa được bấm trong lần vẽ gần nhất hay không.
bool njin::ui_layout_get_bool (const ui_layout &layout, const char *widget_id, bool fallback=false)
 Đọc giá trị bool của toggle.
void njin::ui_layout_set_bool (ui_layout &layout, const char *widget_id, bool value)
 Gán giá trị bool cho toggle.
f32 njin::ui_layout_get_float (const ui_layout &layout, const char *widget_id, f32 fallback=0.0f)
 Đọc giá trị float của slider hoặc progress.
void njin::ui_layout_set_float (ui_layout &layout, const char *widget_id, f32 value)
 Gán giá trị float cho slider hoặc progress.
i32 njin::ui_layout_get_int (const ui_layout &layout, const char *widget_id, i32 fallback=0)
 Đọc index của choice.
void njin::ui_layout_set_int (ui_layout &layout, const char *widget_id, i32 value)
 Gán index cho choice.
const char * njin::ui_layout_get_text (const ui_layout &layout, const char *widget_id, const char *fallback="")
 Đọc nhãn/văn bản của widget.
void njin::ui_layout_set_text (ui_layout &layout, const char *widget_id, const char *text)
 Gán nhãn/văn bản cho widget.
std::string njin::ui_layout_generate_cpp (const ui_layout &layout, const char *func_name="draw_ui")
 Sinh mã nguồn C++ gọi njin::ui_* từ ui_layout hoặc ui_panel_data.
std::string njin::ui_panel_generate_cpp (const ui_panel_data &panel, const char *func_name="draw_panel")
 Sinh mã nguồn C++ cho một panel.

Mô tả chi tiết

Panel, nút, công tắc, thanh trượt, lựa chọn, popup, toast; chuột, bàn phím, tay cầm; tùy biến ảnh và shader.

Thông tin về Enumeration Type

◆ ui_toast_kind

Loại toast: quyết định màu vạch bên trái (xem ui_style::toast_accent).

Enumerator
ui_toast_info 

Thông tin trung tính.

ui_toast_success 

Việc vừa làm thành công.

ui_toast_warning 

Cảnh báo.

ui_toast_error 

Lỗi.

◆ ui_widget_kind

enum class njin::ui_widget_kind
strong

Loại widget trong layout UI khai báo.

Enumerator
label 

Dòng chữ.

space 

Khoảng trống dọc.

button 

Nút bấm.

toggle 

Công tắc bật/tắt.

slider 

Thanh trượt giá trị.

choice 

Danh sách lựa chọn.

progress 

Thanh tiến độ.

image 

Ảnh tĩnh.

row 

Xếp hàng ngang cho các widget tiếp theo.

keybind 

Dòng gán phím điều khiển.

circle 

Thanh tiến độ hình tròn.

Thông tin về hàm

◆ ui_default_style()

ui_style njin::ui_default_style ( )

Giao diện mặc định: panel tối trong suốt, nút bo góc, màu nhấn xanh.

Giá trị trả về
Style mặc định.

◆ ui_style_set()

void njin::ui_style_set ( context & ctx,
const ui_style & style )

Đặt style cho mọi widget vẽ sau đó.

Đổi giữa chừng được (ví dụ một panel cảnh báo màu đỏ).

Các tham số
ctxContext của engine.
styleStyle mới.

◆ ui_style_get()

ui_style njin::ui_style_get ( const context & ctx)

Style hiện tại.

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

◆ ui_begin()

void njin::ui_begin ( context & ctx,
const ui_panel_desc & desc = {} )

Bắt đầu một panel.

Các widget gọi sau đó xếp từ trên xuống bên trong nó, cho đến ui_end(). Chiều cao tự tính theo nội dung. Panel cao hơn màn hình thì tự thu nhỏ (cả chữ, tối đa còn một nửa) cho vừa, thay vì tràn ra trên và dưới.

Gọi trong phase_post_render (không gian màn hình). Chỉ panel nào được gọi trong frame mới hiện; muốn ẩn menu thì đừng gọi nó.

void menu(njin::context &ctx) {
njin::ui_begin(ctx, {.id = "main", .title = "Tên game"});
if (njin::ui_button(ctx, "Chơi"))
njin::scene_fade(ctx, g.play);
if (njin::ui_button(ctx, "Cài đặt"))
g.settings_open = true;
if (njin::ui_button(ctx, "Thoát"))
njin::quit(ctx);
}
void scene_fade(context &ctx, scene_handle scene, const scene_transition &transition={})
Chuyển sang scene khác với hiệu ứng mờ dần (fade).
void ui_begin(context &ctx, const ui_panel_desc &desc={})
Bắt đầu một panel.
void ui_end(context &ctx)
Kết thúc panel và vẽ nó.
bool ui_button(context &ctx, const char *label, bool enabled=true)
Một nút bấm.
void quit(context &ctx)
Yêu cầu thoát game.
Các tham số
ctxContext của engine.
descVị trí và kích thước.

◆ ui_end()

void njin::ui_end ( context & ctx)

Kết thúc panel và vẽ nó.

Các tham số
ctxContext của engine.

◆ ui_row()

void njin::ui_row ( context & ctx,
i32 columns )

Xếp columns widget tiếp theo thành một hàng ngang, chia đều bề rộng.

Mũi tên trái/phải di chuyển giữa chúng.

Các tham số
ctxContext của engine.
columnsSố widget trong hàng.

◆ ui_label()

void njin::ui_label ( context & ctx,
const char * text )

Một dòng chữ.

Trong một hàng (ui_row()) nó cao bằng một widget và chữ nằm giữa theo chiều dọc, thẳng hàng với nút bên cạnh.

Các tham số
ctxContext của engine.
textChữ (UTF-8).

◆ ui_space()

void njin::ui_space ( context & ctx,
f32 height )

Khoảng trống.

Các tham số
ctxContext của engine.
heightChiều cao, pixel (trước scale).

◆ ui_button()

bool njin::ui_button ( context & ctx,
const char * label,
bool enabled = true )

Một nút bấm.

Nhãn phải khác nhau trong cùng panel; hai nút cùng chữ thì thêm hậu tố ẩn sau ##: "Xóa##slot1", "Xóa##slot2" (phần sau ## không được vẽ).

Các tham số
ctxContext của engine.
labelNhãn (UTF-8).
enabledfalse thì nút xám và không bấm được.
Giá trị trả về
true ở frame nút được bấm (chuột, Enter, Space, nút A).

◆ ui_toggle()

bool njin::ui_toggle ( context & ctx,
const char * label,
bool & value )

Một công tắc bật/tắt.

Bấm để đổi.

Các tham số
ctxContext của engine.
labelNhãn.
valueGiá trị, được sửa khi bấm.
Giá trị trả về
true ở frame giá trị đổi.

◆ ui_slider()

bool njin::ui_slider ( context & ctx,
const char * label,
f32 & value,
f32 min,
f32 max,
f32 step = 0.0f,
bool percent = false )

Một thanh trượt.

Kéo bằng chuột, hoặc trái/phải khi đang được chọn.

Các tham số
ctxContext của engine.
labelNhãn.
valueGiá trị, được sửa khi kéo.
minGiá trị nhỏ nhất.
maxGiá trị lớn nhất.
stepBước khi dùng phím hay tay cầm, và làm tròn khi kéo. 0 là 1/20 khoảng.
percentHiện giá trị dạng phần trăm của khoảng thay vì con số.
Giá trị trả về
true ở frame giá trị đổi.

◆ ui_choice() [1/2]

bool njin::ui_choice ( context & ctx,
const char * label,
i32 & index,
std::initializer_list< const char * > options )

Chọn một trong nhiều lựa chọn bằng trái/phải hoặc bấm: độ khó, độ phân giải, ngôn ngữ.

Các tham số
ctxContext của engine.
labelNhãn.
indexLựa chọn hiện tại, được sửa khi đổi. Vòng lại ở hai đầu.
optionsCác lựa chọn.
Giá trị trả về
true ở frame lựa chọn đổi.

◆ ui_choice() [2/2]

bool njin::ui_choice ( context & ctx,
const char * label,
i32 & index,
std::span< const std::string > options )

Chọn một trong nhiều lựa chọn (danh sách động).

Các tham số
ctxContext của engine.
labelNhãn.
indexLựa chọn hiện tại.
optionsMảng các lựa chọn dạng chuỗi.
Giá trị trả về
true ở frame lựa chọn đổi.

◆ ui_progress()

void njin::ui_progress ( context & ctx,
f32 value,
const char * text = nullptr )

Một thanh tiến độ, không bấm được: máu, thời gian nạp.

Các tham số
ctxContext của engine.
valueTiến độ 0..1.
textChữ vẽ giữa thanh. Có thể null.

◆ ui_progress_circle()

void njin::ui_progress_circle ( context & ctx,
const ui_circle_desc & desc )

Một thanh tiến độ hình tròn, không bấm được: hồi chiêu, nạp đạn, máu dạng vòng.

Chiếm một dòng cao bằng đường kính, căn giữa trong panel (hoặc trong cột của ui_row()).

njin::ui_progress_circle(ctx, {.value = cooldown, .diameter = 64, .thickness = 8,
.round_caps = true, .fill = {0.9f, 0.3f, 0.2f, 1.0f}});
void ui_progress_circle(context &ctx, const ui_circle_desc &desc)
Một thanh tiến độ hình tròn, không bấm được: hồi chiêu, nạp đạn, máu dạng vòng.
Các tham số
ctxContext của engine.
descGiá trị và kiểu dáng.

◆ ui_image()

void njin::ui_image ( context & ctx,
texture_handle texture,
vec2 size,
rect source = {} )

Một ảnh, căn giữa trong panel.

Các tham số
ctxContext của engine.
textureẢnh.
sizeKích thước vẽ, pixel (trước scale).
sourceVùng trong ảnh. Kích thước 0 là cả ảnh.

◆ ui_keybind()

bool njin::ui_keybind ( context & ctx,
const char * label,
action_handle action,
bool pad = false )

Một dòng đổi phím cho màn hình cài đặt: bên trái là tên, bên phải là phím đang gắn vào action.

Bấm vào thì dòng chờ phím mới ("..."); phím (hoặc nút chuột) bấm tiếp theo được gắn thay phím cũ bằng action_rebind(). Esc hủy. Trong lúc chờ, UI không điều hướng.

njin::ui_keybind(ctx, "Nhảy", g.jump); // bàn phím
njin::ui_keybind(ctx, "Nhảy##pad", g.jump, true); // tay cầm
bool ui_keybind(context &ctx, const char *label, action_handle action, bool pad=false)
Một dòng đổi phím cho màn hình cài đặt: bên trái là tên, bên phải là phím đang gắn vào action.

Lưu phím mới bằng settings_save() (hoặc input_bindings_save()).

Các tham số
ctxContext của engine.
labelNhãn.
actionAction cần đổi phím.
padtrue để đổi nút tay cầm thay vì phím.
Giá trị trả về
true ở frame phím vừa được đổi.

◆ ui_keybind_listening()

bool njin::ui_keybind_listening ( const context & ctx)

Có dòng ui_keybind() nào đang chờ phím không.

Trong lúc đó đừng coi Esc là "đóng menu".

Các tham số
ctxContext của engine.
Giá trị trả về
true nếu đang chờ.

◆ ui_back()

bool njin::ui_back ( context & ctx)

true ở frame người chơi bấm quay lại (Esc, Backspace, nút B) trong lúc có panel đang hiện.

Dùng để đóng menu con hay quay về màn trước.

Các tham số
ctxContext của engine.
Giá trị trả về
true nếu vừa bấm quay lại.

◆ ui_focus()

void njin::ui_focus ( context & ctx,
const char * label )

Chọn sẵn widget có nhãn label (trong panel đang mở), thường gọi khi vừa mở menu để nút mặc định được chọn cho tay cầm.

Các tham số
ctxContext của engine.
labelNhãn đầy đủ, kể cả phần ##.

◆ ui_active()

bool njin::ui_active ( const context & ctx)

Có panel nào nhận phím được vẽ ở frame trước không (panel HUD với navigable = false không tính).

Trong lúc đó UI nhận các phím điều hướng (mũi tên, Enter, Space, Esc) và game không thấy chúng, nên nhân vật không chạy khi người chơi đang chọn menu.

Các tham số
ctxContext của engine.
Giá trị trả về
true nếu UI đang hiện.

◆ ui_last_rect()

rect njin::ui_last_rect ( const context & ctx)

Khung của widget vừa đặt trong panel đang mở (ui_label(), ui_button(), ui_space()...), pixel màn hình.

Dùng để vẽ thêm lên một widget: hình trong nút, bản đồ nhỏ trong một khoảng ui_space(). Panel chỉ được vẽ ở ui_end(), nên phần vẽ thêm phải đặt sau ui_end(), không thì nền panel đè lên.

njin::ui_begin(ctx, {.id = "shop"});
const bool buy = njin::ui_button(ctx, "##sword");
const njin::rect icon = njin::ui_last_rect(ctx);
njin::texture_draw(ctx, g.sword, icon.pos);
void texture_draw(const context &ctx, texture_handle handle, vec2 pos, rgba tint)
Vẽ texture với góc trên trái tại pos.
rect ui_last_rect(const context &ctx)
Khung của widget vừa đặt trong panel đang mở (ui_label(), ui_button(), ui_space()....
Hình chữ nhật thẳng trục: pos là góc trên trái, size là rộng và cao.
Definition _math.h:13
vec2 pos
Góc trên trái.
Definition _math.h:14
Các tham số
ctxContext của engine.
Giá trị trả về
Khung của widget đặt gần nhất.

◆ ui_mouse_over()

bool njin::ui_mouse_over ( const context & ctx)

Chuột có đang nằm trên một panel không (các panel của frame trước).

Ở đó UI đã nuốt nút chuột trái; hàm này để game bỏ qua cả nút phải, bánh xe hay con trỏ riêng của nó, ví dụ không ra lệnh cho quân khi bấm chuột phải lên HUD.

Các tham số
ctxContext của engine.
Giá trị trả về
true nếu chuột đang trên một panel.

◆ ui_toast()

void njin::ui_toast ( context & ctx,
const char * text,
const ui_toast_desc & desc = {} )

Hiện một thông báo nhỏ ở góc màn hình, tự biến mất: "Đã lưu game", "Nhặt được 5 vàng".

Gọi từ bất cứ đâu, bất cứ phase nào, không cần ui_begin. Engine tự xếp hàng, trượt vào, mờ dần và vẽ đè lên mọi thứ trừ hiệu ứng chuyển scene. Chữ dài tự xuống dòng.

Toast chỉ để đọc, không nuốt phím hay chuột của game, khác với panel của UI. Thời gian tính theo giờ thật: vẫn chạy khi game đang pause hay hitstop. Diện mạo lấy từ ui_style::toast, nên có thể dùng ảnh, 9-slice và shader như mọi widget khác.

njin::ui_toast(ctx, "Đã lưu game", {.kind = njin::ui_toast_success});
void ui_toast(context &ctx, const char *text, const ui_toast_desc &desc={})
Hiện một thông báo nhỏ ở góc màn hình, tự biến mất: "Đã lưu game", "Nhặt được5 vàng".
@ ui_toast_success
Việc vừa làm thành công.
Definition njin_ui.h:317
Các tham số
ctxContext của engine.
textNội dung (UTF-8).
descLoại và thời gian hiện.

◆ ui_toast_clear()

void njin::ui_toast_clear ( context & ctx)

Xóa mọi toast đang hiện, ví dụ khi đổi scene.

Các tham số
ctxContext của engine.

◆ ui_popup()

i32 njin::ui_popup ( context & ctx,
const ui_popup_desc & desc,
bool & open )

Một popup xác nhận: nền tối, tiêu đề, nội dung và vài nút.

Gọi mỗi frame trong phase_post_render khi popup đang mở; open do game giữ. Popup tự đóng (đặt open = false) khi bấm một nút hay quay lại.

if (want_quit) {
const njin::i32 pick = njin::ui_popup(ctx, {.id = "quit", .title = "Thoát game?",
.message = "Tiến trình chưa lưu sẽ mất.", .buttons = {"Ở lại", "Thoát"},
.cancel_button = 0}, want_quit);
if (pick == 1) njin::quit(ctx);
}
std::int32_t i32
Số nguyên có dấu 32 bit.
Definition _types.h:14
i32 ui_popup(context &ctx, const ui_popup_desc &desc, bool &open)
Một popup xác nhận: nền tối, tiêu đề, nội dung và vài nút.

Popup là modal: các panel khác vẫn được vẽ nhưng không nhận chuột, phím hay tay cầm cho đến khi popup đóng, và njin::ui_back() chỉ báo cho popup. Khi mở, nút default_button được chọn sẵn; khi đóng, lựa chọn trở lại chỗ cũ. Frame popup vừa mở bỏ qua nút quay lại, để cùng cú nhấn Esc vừa mở nó không đóng nó ngay.

Các tham số
ctxContext của engine.
descMô tả popup.
openPopup đang mở. Được đặt false khi đóng.
Giá trị trả về
Số thứ tự nút vừa được bấm ở frame này (theo desc.buttons, desc.cancel_button nếu bấm quay lại), hoặc -1 nếu chưa có gì.

◆ ui_popup_begin()

void njin::ui_popup_begin ( context & ctx,
const ui_popup_desc & desc )

Bắt đầu một popup có nội dung tùy ý: làm tối nền, mở panel modal.

Gọi các widget bình thường (ui_button, ui_slider...), rồi ui_popup_end(). Đóng popup bằng cách không gọi nữa; dùng njin::ui_back() để bắt phím quay lại.

Chỉ dùng id, title và width của desc.

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

◆ ui_popup_end()

void njin::ui_popup_end ( context & ctx)

Kết thúc popup bắt đầu bằng ui_popup_begin().

Các tham số
ctxContext của engine.

◆ ui_pixel_style()

ui_style njin::ui_pixel_style ( )

Style pixel-art tiêu chuẩn của njin (góc vuông phẳng, kích thước nhỏ gọn 16px).

Giá trị trả về
Style pixel.

◆ ui_layout_load()

bool njin::ui_layout_load ( context & ctx,
const char * path,
ui_layout & out )

Nạp bố cục UI từ file JSON.

Các tham số
ctxContext của engine.
pathĐường dẫn file JSON.
outNhận layout đọc được.
Giá trị trả về
true nếu nạp thành công.

◆ ui_layout_parse()

bool njin::ui_layout_parse ( const json_value & json,
ui_layout & out )

Phân tích dữ liệu JSON thành ui_layout.

Các tham số
jsonĐối tượng json_value gốc.
outNhận layout đọc được.
Giá trị trả về
true nếu hợp lệ.

◆ ui_layout_to_json()

json_value njin::ui_layout_to_json ( const ui_layout & layout)

Chuyển đổi ui_layout thành json_value để lưu file.

Các tham số
layoutBố cục UI.
Giá trị trả về
Đối tượng JSON.

◆ ui_layout_save()

bool njin::ui_layout_save ( const char * path,
const ui_layout & layout,
bool pretty = true )

Ghi bố cục UI ra file JSON.

Các tham số
pathĐường dẫn lưu file.
layoutBố cục UI.
prettyXuống dòng và thụt lề cho dễ đọc.
Giá trị trả về
true nếu lưu thành công.

◆ ui_draw_panel()

bool njin::ui_draw_panel ( context & ctx,
ui_layout & layout,
const char * panel_id,
const ui_event_callback & on_event = nullptr )

Vẽ một panel cụ thể trong layout.

Gọi trong phase_post_render. Nếu layout.custom_style bật thì gọi ui_style_set() với style của layout và không trả lại style cũ.

Các tham số
ctxContext engine.
layoutLayout chứa panel.
panel_idID của panel cần vẽ.
on_eventCallback tùy chọn khi có tương tác widget.
Giá trị trả về
true nếu có bất kỳ tương tác nào xảy ra ở frame này.

◆ ui_draw_layout()

void njin::ui_draw_layout ( context & ctx,
ui_layout & layout,
const ui_event_callback & on_event = nullptr )

Vẽ tất cả các panel có cờ visible == true và các popup đang open.

Gọi trong phase_post_render. Có cùng lưu ý về style với ui_draw_panel().

Các tham số
ctxContext engine.
layoutLayout cần vẽ.
on_eventCallback tùy chọn khi có tương tác widget.

◆ ui_layout_is_clicked()

bool njin::ui_layout_is_clicked ( const ui_layout & layout,
const char * widget_id )

Kiểm tra nút có vừa được bấm trong lần vẽ gần nhất hay không.

Các tham số
layoutLayout chứa widget.
widget_idID của nút.
Giá trị trả về
true nếu nút được bấm trong lần vẽ gần nhất; false nếu không hoặc không có widget.

◆ ui_layout_get_bool()

bool njin::ui_layout_get_bool ( const ui_layout & layout,
const char * widget_id,
bool fallback = false )

Đọc giá trị bool của toggle.

Các tham số
layoutLayout chứa widget.
widget_idID của toggle.
fallbackGiá trị trả về khi không có widget.
Giá trị trả về
Giá trị hiện tại của toggle, hoặc fallback.

◆ ui_layout_set_bool()

void njin::ui_layout_set_bool ( ui_layout & layout,
const char * widget_id,
bool value )

Gán giá trị bool cho toggle.

Không làm gì nếu không có widget.

Các tham số
layoutLayout chứa widget.
widget_idID của toggle.
valueGiá trị mới.

◆ ui_layout_get_float()

f32 njin::ui_layout_get_float ( const ui_layout & layout,
const char * widget_id,
f32 fallback = 0.0f )

Đọc giá trị float của slider hoặc progress.

Các tham số
layoutLayout chứa widget.
widget_idID của slider hoặc progress.
fallbackGiá trị trả về khi không có widget.
Giá trị trả về
Giá trị hiện tại, hoặc fallback.

◆ ui_layout_set_float()

void njin::ui_layout_set_float ( ui_layout & layout,
const char * widget_id,
f32 value )

Gán giá trị float cho slider hoặc progress.

Không làm gì nếu không có widget.

Các tham số
layoutLayout chứa widget.
widget_idID của slider hoặc progress.
valueGiá trị mới.

◆ ui_layout_get_int()

i32 njin::ui_layout_get_int ( const ui_layout & layout,
const char * widget_id,
i32 fallback = 0 )

Đọc index của choice.

Các tham số
layoutLayout chứa widget.
widget_idID của choice.
fallbackGiá trị trả về khi không có widget.
Giá trị trả về
Index đang chọn, hoặc fallback.

◆ ui_layout_set_int()

void njin::ui_layout_set_int ( ui_layout & layout,
const char * widget_id,
i32 value )

Gán index cho choice.

Không làm gì nếu không có widget.

Các tham số
layoutLayout chứa widget.
widget_idID của choice.
valueIndex mới.

◆ ui_layout_get_text()

const char * njin::ui_layout_get_text ( const ui_layout & layout,
const char * widget_id,
const char * fallback = "" )

Đọc nhãn/văn bản của widget.

Các tham số
layoutLayout chứa widget.
widget_idID của widget.
fallbackChuỗi trả về khi không có widget.
Giá trị trả về
Nhãn của widget, hoặc fallback. Con trỏ hết hạn khi nhãn bị đổi.

◆ ui_layout_set_text()

void njin::ui_layout_set_text ( ui_layout & layout,
const char * widget_id,
const char * text )

Gán nhãn/văn bản cho widget.

Không làm gì nếu không có widget.

Các tham số
layoutLayout chứa widget.
widget_idID của widget.
textNhãn mới.

◆ ui_layout_generate_cpp()

std::string njin::ui_layout_generate_cpp ( const ui_layout & layout,
const char * func_name = "draw_ui" )

Sinh mã nguồn C++ gọi njin::ui_* từ ui_layout hoặc ui_panel_data.

Các tham số
layoutLayout cần sinh code.
func_nameTên hàm C++ sẽ được tạo ra.
Giá trị trả về
Chuỗi mã nguồn C++.

◆ ui_panel_generate_cpp()

std::string njin::ui_panel_generate_cpp ( const ui_panel_data & panel,
const char * func_name = "draw_panel" )

Sinh mã nguồn C++ cho một panel.

Các tham số
panelPanel cần sinh code.
func_nameTên hàm C++ sẽ được tạo ra.
Giá trị trả về
Chuỗi mã nguồn C++.