njin_ui_editor là công cụ dựng giao diện theo kiểu Godot: kéo node vào cây, kéo để sắp xếp, xem ngay kết quả. Nó lưu một file .ui.json; game nạp file đó bằng njin::ui_layout_load() rồi vẽ bằng njin::ui_draw_layout(), không phải gõ từng dòng njin::ui_button().
Editor chỉ cần cho những menu có nhiều widget hoặc hay đổi. Một menu ba nút vẫn viết thẳng bằng UI: menu, nút, thanh trượt nhanh hơn.
Editor không có trong bản game: nó là công cụ của người làm game, như njin_inspector.
Các cửa sổ ghép (dock) được: kéo tab để đổi chỗ, tách hoặc xếp chồng. Cửa sổ > Bố cục mặc định đặt lại về dạng ban đầu. Bố cục được nhớ trong njin_ui_editor.ini.
| Cửa sổ | Làm gì |
|---|---|
| Scene | Cây Layout > Panel > Widget và các Popup |
| Nodes | Danh sách loại node để kéo ra |
| Viewport | Xem layout như trong game; chọn, kéo, thả |
| Inspector | Thuộc tính của node đang chọn |
| Theme | Style riêng của layout |
| C++, JSON, Output | Code mẫu, nội dung file, sự kiện khi chạy thử |
Mỗi dòng là một node. Kéo một dòng thả lên dòng khác: thả vào nửa trên thì chèn trước, nửa dưới thì chèn sau, thả vào panel thì thành widget cuối của panel đó. Widget có thể chuyển sang panel khác. Chuột phải để thêm node con, đổi loại widget, nhân đôi, đổi thứ tự, xóa. Ô tick bên phải là visible của panel hoặc open của popup. Widget sau một Row được thụt vào: đó là các cột của hàng.
Panel, Popup, Row, Space và các điều khiển (Label, Button, Toggle, Slider, Choice, Progress, Circle, Image, Keybind). Kéo vào Viewport hoặc Scene để tạo, hoặc bấm đúp để thêm vào node đang chọn.
Ảnh trong Viewport không phải hình vẽ giả: editor chạy đúng code của njin::ui_begin(), njin::ui_button()... và vẽ bằng raylib vào một texture, nên phông, màu, bo góc và kích thước khớp với game.
| Thao tác | Kết quả |
|---|---|
| Bấm | Chọn panel hoặc widget |
| Kéo panel | Đổi offset. Hít lưới; giữ Alt để tạm tắt |
| Kéo mép trái hoặc phải của panel | Đổi width |
| Kéo một widget | Đổi thứ tự, hoặc sang panel khác. Vạch xanh là chỗ sẽ thả |
| Thả node từ Nodes vào panel | Chèn widget tại vạch xanh |
| Thả node từ Nodes ra chỗ trống | Tạo panel mới ở đó |
| Chuột phải | Menu thêm node, nhân đôi, xóa |
| Chuột giữa hoặc chuột phải kéo | Di chuyển khung nhìn |
| Cuộn | Phóng to, thu nhỏ |
| Mũi tên (panel đang chọn) | Dịch 1 px, giữ Shift thì 10 px |
Điểm xanh lá là anchor trên màn hình, điểm xanh lam là pivot của panel.
Inspector có bảng 3x3 chọn nhanh cặp anchor và pivot (như preset neo của Godot), rồi offset chỉnh thêm. Muốn neo và tâm khác nhau thì mở mục "Neo & tâm riêng".
Theme quyết định style của file:
F5 chạy một bản sao của layout: bấm nút, kéo slider, đổi công tắc trong Viewport; mũi tên, Enter và Space cũng dùng được khi Viewport đang được chọn. Mỗi sự kiện hiện ở Output, đúng như game sẽ nhận. Dừng lại thì layout trở về như trước lúc chạy thử.
| Phím | Việc |
|---|---|
| Ctrl+N, Ctrl+O, Ctrl+S, Ctrl+Shift+S | Mới, mở, lưu, lưu thành |
| Ctrl+Z, Ctrl+Y | Hoàn tác, làm lại. Một lần kéo hoặc sửa chữ là một bước |
| F5 | Chạy thử, dừng |
| Del, Ctrl+D | Xóa, nhân đôi node (khi Scene hoặc Viewport đang được chọn) |
| Ctrl+A, Ctrl+Up, Ctrl+Down | Thêm node con, đổi thứ tự (trong Scene) |
| F | Vừa khung (trong Viewport) |
njin::ui_layout_load() nạp file vào một njin::ui_layout. njin::ui_draw_layout() gọi trong phase_post_render vẽ mọi panel có visible và mọi popup có open; njin::ui_draw_panel() vẽ một panel theo id. Callback nhận njin::ui_layout_event: button_clicked khi bấm nút, value_changed khi đổi toggle, slider hoặc choice, popup_dismissed khi đóng popup.
Không cần callback thì đọc trạng thái bất kỳ lúc nào theo id của widget: njin::ui_layout_is_clicked(), njin::ui_layout_get_bool(), njin::ui_layout_get_float(), njin::ui_layout_get_int(), njin::ui_layout_get_text() và các hàm set tương ứng. Mở hoặc ẩn menu bằng cách đặt visible của panel (njin::ui_layout::find_panel()) hoặc open của popup (njin::ui_layout::find_popup()).
Editor còn sinh code C++ gọi trực tiếp njin::ui_begin(), njin::ui_button()... (tab C++), dùng được khi không muốn giữ file JSON. Cùng chức năng có sẵn trong game qua njin::ui_layout_generate_cpp() và njin::ui_panel_generate_cpp().
Loại widget: label, space, button, toggle, slider, choice, progress, circle, image, row, keybind. Trường không có trong file lấy giá trị mặc định. Thêm khối "style" khi bật custom_style.
design_resolution chỉ là khung mà editor dùng để xem: game vẽ theo cỡ màn hình thật, và anchor với offset quyết định vị trí panel trên đó.