Lưới ô chia chunk, không giới hạn kích thước, và va chạm với lưới. Tiếp...
Classes | |
| struct | njin::tile_chunk |
| Một khối 32 x 32 ô của tilemap. Tiếp... | |
| struct | njin::cell |
| Vị trí một ô trong lưới. Có thể âm. Tiếp... | |
| struct | njin::tile_anim |
| Animation của một loại ô: nước, đuốc, cỏ lay. Tiếp... | |
| struct | njin::tilemap |
| Lưới ô vuông không giới hạn kích thước, vẽ từ một tileset, chia thành chunk. Tiếp... | |
| struct | njin::move_result |
| Kết quả của tilemap_move(). Tiếp... | |
| struct | njin::tile_key |
| Một dòng trong bảng ký tự của bản đồ chữ: ký tự này đặt ô nào. Tiếp... | |
| struct | njin::tile_marker |
| Vị trí của một ký tự mà bản đồ chữ chỉ dùng để đánh dấu: người chơi, kẻ địch, đồng xu. Tiếp... | |
Enumerations | |
| enum | njin::tile_shape : u8 { njin::tile_solid = 0 , njin::tile_none , njin::tile_one_way , njin::tile_slope_r , njin::tile_slope_l , njin::tile_slope_r_low , njin::tile_slope_r_high , njin::tile_slope_l_low , njin::tile_slope_l_high , njin::tile_shape_count } |
| Hình va chạm của một loại ô, dùng bởi collision_move() và collision_raycast() với collider_tiles. Tiếp... | |
Các hàm | |
| constexpr i32 | njin::tile_id (i32 value) |
| Số thứ tự ô trong tileset, bỏ các bit lật. | |
| constexpr bool | njin::tile_is_slope (tile_shape shape) |
| Ô có phải dốc không. | |
| constexpr f32 | njin::tile_surface (tile_shape shape, f32 u) |
| Chiều cao mặt dốc tại một điểm trong ô, tính từ đáy ô theo tỉ lệ chiều cao ô. | |
| bool | njin::tile_shape_from_name (const char *name, tile_shape &out) |
| Đọc tên một hình ô, như trong thuộc tính của Tiled hay tên giá trị IntGrid của LDtk: solid, none (hoặc empty), one_way (hoặc oneway, platform), slope_r, slope_l, slope_r_low, slope_r_high, slope_l_low, slope_l_high. | |
| void | njin::tilemap_set_shape (tilemap &map, i32 id, tile_shape shape) |
| Đặt hình va chạm cho mọi ô có số thứ tự id trong tilemap. | |
| tile_shape | njin::tilemap_shape (const tilemap &map, i32 value) |
| Hình va chạm của một ô. | |
| void | njin::tilemap_animate (tilemap &map, i32 id, const std::vector< i32 > &frames, f32 seconds) |
| Cho mọi ô số id chạy animation qua các ô frames, mỗi frame seconds giây. | |
| i32 | njin::tile_anim_frame (const tile_anim &anim, f32 time) |
| Số thứ tự ô đang hiện của một animation tại thời điểm time. | |
| constexpr i32 | njin::floor_div (i32 a, i32 b) |
| Chia làm tròn xuống, đúng cả với số âm: floor_div(-1, 32) == -1. | |
| constexpr u64 | njin::tile_chunk_key (i32 cx, i32 cy) |
| Khóa của chunk tại tọa độ chunk (cx, cy). | |
| constexpr cell | njin::tile_chunk_coord (u64 key) |
| Tọa độ chunk từ khóa. | |
| i32 | njin::tilemap_get (const tilemap &map, i32 x, i32 y) |
| Ô tại cột x, hàng y. | |
| void | njin::tilemap_set (tilemap &map, i32 x, i32 y, i32 id) |
| Đặt ô tại cột x, hàng y. | |
| void | njin::tilemap_clear (tilemap &map) |
| Xóa mọi ô. | |
| std::vector< tile_marker > | njin::tilemap_from_text (tilemap &map, std::string_view text, std::initializer_list< tile_key > legend={}, cell origin={}) |
| Dựng bản đồ từ một chuỗi nhiều dòng, mỗi ký tự là một ô: cách viết bản đồ "kiểu truyền thống", không cần Tiled hay LDtk. | |
| std::vector< tile_marker > | njin::tilemap_from_rows (tilemap &map, std::initializer_list< std::string_view > rows, std::initializer_list< tile_key > legend={}, cell origin={}) |
| Như tilemap_from_text(), nhưng mỗi hàng là một chuỗi riêng. | |
| cell | njin::tilemap_cell_at (const tilemap &map, vec2 origin, vec2 world_pos) |
| Ô chứa một điểm trong thế giới. | |
| rect | njin::tilemap_cell_rect (const tilemap &map, vec2 origin, i32 x, i32 y) |
| Hình chữ nhật của một ô trong thế giới. | |
| bool | njin::tilemap_overlaps (const tilemap &map, vec2 origin, rect box) |
| Hình chữ nhật có chồng lên ô không trống nào không. | |
| move_result | njin::tilemap_move (const tilemap &map, vec2 origin, rect box, vec2 delta) |
| Di chuyển một hình chữ nhật trong tilemap, dừng lại khi đụng ô không trống. | |
Các biến | |
| constexpr i32 | njin::tile_chunk_size = 32 |
| Số ô mỗi cạnh của một chunk. Một chunk có 32 x 32 ô. | |
| constexpr i32 | njin::tile_flip_x = 1 << 29 |
| Bit đánh dấu ô bị lật ngang, cộng vào số thứ tự ô: id | tile_flip_x. | |
| constexpr i32 | njin::tile_flip_y = 1 << 30 |
| Bit đánh dấu ô bị lật dọc, cộng vào số thứ tự ô: id | tile_flip_y. | |
Lưới ô chia chunk, không giới hạn kích thước, và va chạm với lưới.
| enum njin::tile_shape : u8 |
Hình va chạm của một loại ô, dùng bởi collision_move() và collision_raycast() với collider_tiles.
Đặt bằng tilemap_set_shape(); ô chưa đặt là tile_solid.
Dốc là của game platformer: mặt dốc chỉ đỡ từ phía trên, và phía đáy của ô vẫn là vật cản. Tên _r là dốc cao bên phải (đi sang phải là lên dốc), _l là cao bên trái. Dốc 22.5 độ chiếm hai ô liền nhau: _low (nửa dưới) rồi _high (nửa trên).
Số thứ tự ô trong tileset, bỏ các bit lật.
| value | Giá trị của ô, từ tilemap_get(). |
|
constexpr |
Ô có phải dốc không.
| shape | Hình của ô. |
|
constexpr |
Chiều cao mặt dốc tại một điểm trong ô, tính từ đáy ô theo tỉ lệ chiều cao ô.
| shape | Hình của ô. |
| u | Vị trí ngang trong ô, 0 là mép trái, 1 là mép phải. |
| bool njin::tile_shape_from_name | ( | const char * | name, |
| tile_shape & | out ) |
Đọc tên một hình ô, như trong thuộc tính của Tiled hay tên giá trị IntGrid của LDtk: solid, none (hoặc empty), one_way (hoặc oneway, platform), slope_r, slope_l, slope_r_low, slope_r_high, slope_l_low, slope_l_high.
Không phân biệt hoa thường; - và dấu cách được coi như _.
| name | Tên. |
| out | Nhận hình nếu tên hợp lệ. |
|
inline |
Đặt hình va chạm cho mọi ô có số thứ tự id trong tilemap.
| map | Tilemap. |
| id | Số thứ tự ô trong tileset (không kèm bit lật). |
| shape | Hình. |
|
inline |
Hình va chạm của một ô.
| map | Tilemap. |
| value | Giá trị ô từ tilemap_get(), có thể kèm bit lật. |
|
inline |
Cho mọi ô số id chạy animation qua các ô frames, mỗi frame seconds giây.
Engine vẽ frame hiện tại mà không cần đổi ô trong lưới.
| map | Tilemap. |
| id | Số thứ tự ô gốc, là ô đặt trong lưới. |
| frames | Số thứ tự ô của từng frame. |
| seconds | Thời lượng mỗi frame, giây. |
Số thứ tự ô đang hiện của một animation tại thời điểm time.
| anim | Animation. |
| time | Thời gian, giây. |
Chia làm tròn xuống, đúng cả với số âm: floor_div(-1, 32) == -1.
| a | Số bị chia. |
| b | Số chia, dương. |
Khóa của chunk tại tọa độ chunk (cx, cy).
| cx | Tọa độ chunk theo cột. |
| cy | Tọa độ chunk theo hàng. |
Ô tại cột x, hàng y.
| map | Tilemap. |
| x | Cột. |
| y | Hàng. |
Đặt ô tại cột x, hàng y.
Chunk được tạo khi cần và bị xóa khi hết ô.
| map | Tilemap. |
| x | Cột. |
| y | Hàng. |
| id | Chỉ số ô trong tileset, -1 là ô trống. |
|
inline |
Xóa mọi ô.
| map | Tilemap. |
|
inline |
Dựng bản đồ từ một chuỗi nhiều dòng, mỗi ký tự là một ô: cách viết bản đồ "kiểu truyền thống", không cần Tiled hay LDtk.
Chuỗi có thể viết thẳng trong code hoặc đọc từ file bằng njin::file_read().
Quy tắc:
| map | Tilemap cần đặt ô. Cần tileset và tile_size như mọi tilemap khác. |
| text | Bản đồ chữ. |
| legend | Bảng ký tự. Để trống thì mọi ký tự (trừ , ., tab) chỉ được báo lại. |
| origin | Ô của ký tự đầu tiên. Mặc định (0, 0). |
|
inline |
Như tilemap_from_text(), nhưng mỗi hàng là một chuỗi riêng.
Gọn hơn cho bản đồ nhỏ viết ngay trong code, và không phải lo chuyện xuống dòng đầu chuỗi.
| map | Tilemap cần đặt ô. |
| rows | Các hàng, từ trên xuống. |
| legend | Bảng ký tự. Xem njin::tile_key. |
| origin | Ô của ký tự đầu tiên. Mặc định (0, 0). |
Ô chứa một điểm trong thế giới.
| map | Tilemap. |
| origin | Vị trí góc trên trái của ô (0, 0) trong thế giới. |
| world_pos | Điểm trong thế giới. |
Hình chữ nhật của một ô trong thế giới.
| map | Tilemap. |
| origin | Vị trí góc trên trái của ô (0, 0) trong thế giới. |
| x | Cột. |
| y | Hàng. |
Hình chữ nhật có chồng lên ô không trống nào không.
Chỉ chạm mép thì không tính.
| map | Tilemap. |
| origin | Vị trí góc trên trái của ô (0, 0) trong thế giới. |
| box | Hình chữ nhật cần kiểm tra. |
|
inline |
Di chuyển một hình chữ nhật trong tilemap, dừng lại khi đụng ô không trống.
Đi theo trục ngang trước rồi mới đến trục dọc, nên vật trượt dọc theo tường thay vì dính vào. Đây là cách làm quen thuộc cho game platformer: hit_y && delta.y > 0 nghĩa là đang đứng trên mặt đất.
Mỗi trục nên dời không quá một ô mỗi lần gọi, nếu không vật có thể xuyên qua tường mỏng.
Mọi ô không trống đều chặn, không xét tilemap::shapes. Muốn bục một chiều và dốc thì dùng collider collider_tiles với collision_move().
| map | Tilemap, mọi ô không trống đều là vật cản. |
| origin | Vị trí góc trên trái của ô (0, 0) trong thế giới. |
| box | Hình chữ nhật của vật cần di chuyển. |
| delta | Độ dời mong muốn trong frame này. |