njin hỗ trợ bàn phím, chuột, tay cầm và nhập văn bản. Có ba cách dùng, từ trực tiếp đến linh hoạt:
| Cách | Khi nào dùng |
|---|---|
| Hỏi thẳng thiết bị (key_*, mouse_*, pad_*) | Việc nhanh, cố định |
| Action: một tên logic, đúng hoặc sai | "Nhảy", "bắn": nút bấm |
| Axis: một tên logic, giá trị -1 đến 1 | "Đi ngang", "đi dọc": chuyển động |
Action và axis cho phép đổi phím sau này mà không sửa logic.
Trạng thái mọi thiết bị được đọc một lần đầu mỗi frame và giữ nguyên trong suốt frame đó, nên mọi system trong một frame thấy cùng một kết quả. Mọi nút (phím, chuột, tay cầm) dùng chung một quy tắc, ba hàm cho ba câu hỏi:
| Hàm | Đúng khi |
|---|---|
| *_pressed | Nút vừa được nhấn ở frame này (chỉ một frame) |
| *_held | Nút đã được giữ từ frame trước và vẫn đang giữ |
| *_released | Nút vừa được thả ở frame này (chỉ một frame) |
Ví dụ một lần nhấn giữ 3 frame rồi thả:
| Frame | Người dùng | pressed | held | released |
|---|---|---|---|---|
| 1 | chưa ấn | – | – | – |
| 2 | nhấn xuống | ✔ | – | – |
| 3 | vẫn giữ | – | ✔ | – |
| 4 | vẫn giữ | – | ✔ | – |
| 5 | thả ra | – | – | ✔ |
njin::key_pressed(), njin::key_held(), njin::key_released() nhận một njin::key_code: chữ cái, số, F1 đến F12, mũi tên, phím điều hướng, ký hiệu, phím điều khiển (Shift, Ctrl, Alt, Windows) và bàn phím số.
| Hàm | Trả về |
|---|---|
| njin::mouse_pos() | Vị trí con trỏ, pixel màn hình |
| njin::mouse_delta() | Độ dời so với frame trước |
| njin::mouse_wheel() | Số nấc cuộn, dương là cuộn ra xa người dùng. Đa số frame là 0 |
| njin::mouse_pressed() / njin::mouse_held() / njin::mouse_released() | Nút chuột (njin::mouse_button), cùng quy tắc như phím |
Tay cầm được đánh số từ 0 đến njin::gamepad_max - 1. Tay cầm chưa cắm không gây lỗi: mọi hàm đọc như không nhấn và trả về 0.
| Hàm | Việc làm |
|---|---|
| njin::pad_available() | Tay cầm có đang cắm không |
| njin::pad_pressed() / njin::pad_held() / njin::pad_released() | Nút tay cầm (njin::gamepad_button) |
| njin::pad_axis() | Trục analog (njin::gamepad_axis), từ -1 đến 1 |
| njin::pad_set_deadzone() | Vùng chết của cần, mặc định 0.15 |
Gõ chữ và bấm phím tắt là hai câu hỏi khác nhau. njin::key_pressed() cho biết phím nào được nhấn; njin::text_count() và njin::text_char() cho biết ký tự nào được gõ, đã qua bố cục bàn phím và phím chết. Ô nhập văn bản cần loại thứ hai:
Mã trả về là Unicode. Mỗi frame nhận tối đa 32 ký tự.
njin::key_consume(), njin::mouse_consume() và njin::mouse_wheel_consume() xóa trạng thái của một nút trong phần còn lại của frame. System chạy sau đó không thấy nút đó nữa. Dùng khi một menu cần nuốt cú nhấp trước khi thế giới bên dưới xử lý cùng cú nhấp đó (xem ví dụ trên).
Hiệu lực không kéo dài quá frame gọi nó, vì trạng thái được đọc lại ở frame sau. Consume cũng không làm sai lịch sử của nút: một phím đang giữ bị consume thì ở frame sau vẫn là "đang giữ", không bị tính là vừa nhấn lại. Muốn system menu chạy trước, đặt nó ở phase sớm hơn (phase_pre_update) hoặc dùng thứ tự after/before: xem Module, system và phase.
Action là một tên logic (ví dụ "fire") gắn với một hoặc nhiều nguồn: phím, nút chuột, nút tay cầm. Nguồn nào thỏa cũng làm action thỏa. Game hỏi về action thay vì phím, nên đổi phím sau này không phải sửa logic.
| Hàm | Việc làm |
|---|---|
| njin::action_define() | Tạo action và gắn mọi nguồn trong một dòng: action_define(ctx, "jump", {key_space, key_w, pad_face_down}). Cách nên dùng |
| njin::action_register() | Tạo action trống. Nếu tên đã có thì trả về action cũ |
| njin::action_find() | Tìm action theo tên |
| njin::action_bind_key() | Gắn thêm một phím |
| njin::action_bind_mouse() | Gắn thêm một nút chuột |
| njin::action_bind_pad() | Gắn thêm một nút tay cầm (bất kỳ tay cầm nào đang cắm) |
| njin::action_clear_binds() | Xóa mọi nguồn đã gắn. Dùng được ở mọi lúc |
| njin::action_pressed() / njin::action_held() / njin::action_released() | Cùng quy tắc như phím |
Đổi phím trong lúc chạy là gọi njin::action_clear_binds() rồi bind lại.
Axis đọc giá trị từ -1 đến 1. Nó tách khỏi action vì hai thứ trả lời hai câu hỏi khác nhau: action là đúng hoặc sai, axis là mức độ.
| Hàm | Việc làm |
|---|---|
| njin::axis_define() | Tạo axis và gắn mọi cặp phím, trục tay cầm trong một dòng: axis_define(ctx, "move", {{key_left, key_right}, {key_a, key_d}}, {pad_axis_left_x}). Cách nên dùng |
| njin::axis_register() / njin::axis_find() | Tạo axis trống, và tìm axis theo tên |
| njin::axis_bind_keys() | Gắn một cặp phím: chỉ phím âm thì -1, chỉ phím dương thì 1, cả hai hoặc không phím nào thì 0 |
| njin::axis_bind_pad() | Gắn một trục tay cầm |
| njin::axis_clear_binds() | Xóa mọi nguồn đã gắn |
| njin::axis_value() | Giá trị hiện tại |
Nguồn lệch xa vị trí nghỉ nhất thì thắng: cần đẩy nửa chừng không bị cặp phím đang đứng yên làm phẳng, và cặp phím đang giữ không bị cần không ai chạm chặn lại.
Không có axis dạng vector 2 chiều. Đọc hai axis rồi ghép lại: chỉ bạn biết có cần chuẩn hóa vector đó hay không (đi chéo có nhanh hơn không).
Di chuyển bằng phím hoặc cần trái, bắn bằng phím cách, chuột trái hoặc nút A:
Xem thêm ví dụ action đơn giản hơn:
Mọi mã nằm trong njin::key_code, njin::mouse_button, njin::gamepad_button và njin::gamepad_axis.