5#include <initializer_list>
7#include <unordered_map>
39 tile_chunk() {
tiles.fill(-1); }
80 u = u < 0.0f ? 0.0f : (u > 1.0f ? 1.0f : u);
137 std::unordered_map<u64, tile_chunk>
chunks;
143 std::unordered_map<i32, tile_anim>
anims;
189 if (
id < 0 || frames.empty() || seconds <= 0.0f)
191 tile_anim anim{frames, std::vector<f32>(frames.size(), seconds), seconds * (
f32)frames.size()};
192 map.
anims[id] = std::move(anim);
202 f32 t = std::fmod(time, anim.
total);
211 return anim.
frames.back();
226 return a >= 0 ? a / b : -((-a + b - 1) / b);
241 return {(
i32)(
u32)(key >> 32), (
i32)(
u32)(key & 0xffffffffu)};
253 if (it == map.
chunks.end())
271 auto it = map.
chunks.find(key);
272 if (it == map.
chunks.end()) {
282 chunk.
filled += (
id >= 0 ? 1 : 0) - (slot >= 0 ? 1 : 0);
315inline void tilemap_apply_row(
tilemap &map, std::string_view row,
i32 y, std::initializer_list<tile_key> legend,
316 cell origin, std::vector<tile_marker> &markers) {
317 for (
usize i = 0; i <
row.size(); i++) {
318 const char c =
row[i];
319 const cell at{origin.
x + (
i32)i, origin.
y + y};
326 if (key !=
nullptr) {
329 markers.push_back({c, at});
330 }
else if (c !=
' ' && c !=
'.' && c !=
'\t') {
331 markers.push_back({c, at});
364 std::initializer_list<tile_key> legend = {}, cell origin = {}) {
365 std::vector<tile_marker> markers;
367 if (text.starts_with(
"\r\n"))
369 else if (text.starts_with(
'\n'))
372 while (pos < text.size()) {
373 usize end = text.find(
'\n', pos);
374 if (end == std::string_view::npos)
376 std::string_view
row = text.substr(pos, end - pos);
377 if (!
row.empty() &&
row.back() ==
'\r')
378 row.remove_suffix(1);
379 tilemap_apply_row(map,
row, y, legend, origin, markers);
397 std::initializer_list<tile_key> legend = {}, cell origin = {}) {
398 std::vector<tile_marker> markers;
400 for (
const std::string_view
row : rows)
401 tilemap_apply_row(map,
row, y++, legend, origin, markers);
411 const vec2 local = world_pos - origin;
441 for (
i32 y = a.
y; y <= b.
y; y++) {
442 for (
i32 x = a.
x; x <= b.
x; x++) {
470 const auto resolve = [&](
rect &r,
f32 step,
bool horizontal) {
474 for (
i32 y = a.
y; y <= b.
y; y++) {
475 for (
i32 x = a.
x; x <= b.
x; x++) {
496 resolve(r,
delta.x,
true);
501 resolve(r,
delta.y,
false);
i32 tilemap_get(const tilemap &map, i32 x, i32 y)
Ô tại cột x, hàng y.
Definition _tilemap.h:249
i32 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.
Definition _tilemap.h:199
void 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.
Definition _tilemap.h:188
constexpr i32 tile_flip_y
Bit đánh dấu ô bị lật dọc, cộng vào số thứ tự ô: id | tile_flip_y.
Definition _tilemap.h:20
move_result 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.
Definition _tilemap.h:464
tile_shape
Hình va chạm của một loại ô, dùng bởi collision_move() và collision_raycast() với collider_tiles.
Definition _tilemap.h:55
void tilemap_clear(tilemap &map)
Xóa mọi ô.
Definition _tilemap.h:291
std::vector< tile_marker > 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",...
Definition _tilemap.h:361
constexpr i32 tile_flip_x
Bit đánh dấu ô bị lật ngang, cộng vào số thứ tự ô: id | tile_flip_x.
Definition _tilemap.h:18
bool 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,...
std::vector< tile_marker > 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.
Definition _tilemap.h:394
void tilemap_set(tilemap &map, i32 x, i32 y, i32 id)
Đặt ô tại cột x, hàng y.
Definition _tilemap.h:265
tile_shape tilemap_shape(const tilemap &map, i32 value)
Hình va chạm của một ô.
Definition _tilemap.h:163
bool 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.
Definition _tilemap.h:432
void 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.
Definition _tilemap.h:150
cell tilemap_cell_at(const tilemap &map, vec2 origin, vec2 world_pos)
Ô chứa một điểm trong thế giới.
Definition _tilemap.h:408
constexpr i32 floor_div(i32 a, i32 b)
Chia làm tròn xuống, đúng cả với số âm: floor_div(-1, 32) == -1.
Definition _tilemap.h:225
constexpr bool tile_is_slope(tile_shape shape)
Ô có phải dốc không.
Definition _tilemap.h:71
constexpr f32 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 ô.
Definition _tilemap.h:79
rect 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.
Definition _tilemap.h:420
constexpr i32 tile_chunk_size
Số ô mỗi cạnh của một chunk. Một chunk có 32 x 32 ô.
Definition _tilemap.h:15
constexpr i32 tile_id(i32 value)
Số thứ tự ô trong tileset, bỏ các bit lật.
Definition _tilemap.h:25
constexpr u64 tile_chunk_key(i32 cx, i32 cy)
Khóa của chunk tại tọa độ chunk (cx, cy).
Definition _tilemap.h:233
constexpr cell tile_chunk_coord(u64 key)
Tọa độ chunk từ khóa.
Definition _tilemap.h:240
@ tile_slope_l_low
Dốc 22.5 độ cao bên trái, nửa dưới.
Definition _tilemap.h:63
@ tile_slope_l_high
Dốc 22.5 độ cao bên trái, nửa trên.
Definition _tilemap.h:64
@ tile_slope_l
Dốc 45 độ, cao bên trái, thấp bên phải.
Definition _tilemap.h:60
@ tile_solid
Chặn mọi phía. Mặc định.
Definition _tilemap.h:56
@ tile_none
Không va chạm: chỉ để nhìn, dù nằm trong layer vật cản.
Definition _tilemap.h:57
@ tile_slope_r
Dốc 45 độ, thấp bên trái, cao bên phải.
Definition _tilemap.h:59
@ tile_shape_count
Số loại hình. Không phải một hình thật.
Definition _tilemap.h:65
@ tile_one_way
Bục một chiều: chỉ đỡ từ trên xuống, nhảy xuyên từ dưới lên được.
Definition _tilemap.h:58
@ tile_slope_r_low
Dốc 22.5 độ cao bên phải, nửa dưới (0 đến nửa ô).
Definition _tilemap.h:61
@ tile_slope_r_high
Dốc 22.5 độ cao bên phải, nửa trên (nửa ô đến đầy ô).
Definition _tilemap.h:62
f32 delta(const context &ctx)
Thời gian của frame trước, tính bằng giây, đã nhân với tốc độ thời gian.
std::uint8_t u8
Số nguyên không dấu 8 bit.
Definition _types.h:20
std::int32_t i32
Số nguyên có dấu 32 bit.
Definition _types.h:14
std::size_t usize
Số nguyên không dấu cỡ con trỏ, dùng cho kích thước và chỉ số.
Definition _types.h:34
std::uint64_t u64
Số nguyên không dấu 64 bit.
Definition _types.h:23
float f32
Số thực 32 bit.
Definition _types.h:28
std::uint32_t u32
Số nguyên không dấu 32 bit.
Definition _types.h:22
@ row
Xếp hàng ngang cho các widget tiếp theo.
Definition njin_ui_layout.h:27
Vị trí một ô trong lưới. Có thể âm.
Definition _tilemap.h:43
i32 x
Cột.
Definition _tilemap.h:44
i32 y
Hàng.
Definition _tilemap.h:45
Kết quả của tilemap_move().
Definition _tilemap.h:215
bool hit_y
Bị chặn theo trục dọc.
Definition _tilemap.h:218
bool hit_x
Bị chặn theo trục ngang.
Definition _tilemap.h:217
vec2 pos
Vị trí góc trên trái mới của vật.
Definition _tilemap.h:216
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
vec2 size
Chiều rộng (x) và chiều cao (y).
Definition _math.h:15
Màu gồm đỏ, xanh lá, xanh dương và alpha.
Definition _types.h:64
Định danh của một texture, tạo bởi texture_load().
Definition _types.h:146
Animation của một loại ô: nước, đuốc, cỏ lay.
Definition _tilemap.h:104
std::vector< i32 > frames
Số thứ tự ô của từng frame trong tileset.
Definition _tilemap.h:105
std::vector< f32 > durations
Thời lượng từng frame, giây.
Definition _tilemap.h:106
f32 total
Tổng thời lượng, tính sẵn.
Definition _tilemap.h:107
Một khối 32 x 32 ô của tilemap.
Definition _tilemap.h:33
u32 version
Tăng mỗi lần chunk đổi, để engine biết cần vẽ lại.
Definition _tilemap.h:37
i32 filled
Số ô không trống. Chunk về 0 thì bị xóa.
Definition _tilemap.h:36
std::array< i32,(usize) tile_chunk_size *tile_chunk_size > tiles
Các ô theo hàng, -1 là ô trống.
Definition _tilemap.h:35
Một dòng trong bảng ký tự của bản đồ chữ: ký tự này đặt ô nào.
Definition _tilemap.h:301
char symbol
Ký tự trong bản đồ chữ.
Definition _tilemap.h:302
i32 tile
Số thứ tự ô đặt cho ký tự này. -1 là xóa ô (ô trống).
Definition _tilemap.h:303
bool marker
true: ngoài việc đặt ô, còn báo vị trí ký tự này về cho game.
Definition _tilemap.h:304
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.
Definition _tilemap.h:309
cell at
Ô của nó, kể cả origin đã cộng vào.
Definition _tilemap.h:311
char symbol
Ký tự đã gặp.
Definition _tilemap.h:310
Lưới ô vuông không giới hạn kích thước, vẽ từ một tileset, chia thành chunk.
Definition _tilemap.h:128
texture_handle tileset
Ảnh tileset.
Definition _tilemap.h:129
std::unordered_map< i32, tile_anim > anims
Animation theo số thứ tự ô gốc. Đặt bằng tilemap_animate().
Definition _tilemap.h:143
std::unordered_map< u64, tile_chunk > chunks
Các chunk có ô, theo khóa từ tile_chunk_key().
Definition _tilemap.h:137
std::vector< u8 > shapes
Hình va chạm theo số thứ tự ô: shapes[id].
Definition _tilemap.h:141
rgba tint
Màu nhân vào mọi ô.
Definition _tilemap.h:134
f32 spacing
Khoảng giữa hai ô liền nhau trong ảnh tileset, pixel.
Definition _tilemap.h:132
vec2 tile_size
Kích thước một ô, tính bằng pixel.
Definition _tilemap.h:130
f32 margin
Khoảng từ mép ảnh tileset đến ô đầu tiên, pixel.
Definition _tilemap.h:131
u32 revision
Tăng mỗi lần có ô đổi.
Definition _tilemap.h:138
i32 layer
Lớp vẽ, cùng thang với sprite::layer.
Definition _tilemap.h:133
bool visible
Ẩn khi vẽ.
Definition _tilemap.h:135
Vector 2 chiều. Dùng cho vị trí, kích thước, độ dời.
Definition _types.h:39
f32 y
Thành phần dọc (trong không gian màn hình, y tăng khi đi xuống).
Definition _types.h:41
f32 x
Thành phần ngang.
Definition _types.h:40