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
Tilemap

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.

Mô tả chi tiết

Lưới ô chia chunk, không giới hạn kích thước, và va chạm với lưới.

Thông tin về Enumeration Type

◆ 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.

Đặ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).

Enumerator
tile_solid 

Chặn mọi phía. Mặc định.

tile_none 

Không va chạm: chỉ để nhìn, dù nằm trong layer vật cản.

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.

tile_slope_r 

Dốc 45 độ, thấp bên trái, cao bên phải.

tile_slope_l 

Dốc 45 độ, cao bên trái, thấp bên phải.

tile_slope_r_low 

Dốc 22.5 độ cao bên phải, nửa dưới (0 đến nửa ô).

tile_slope_r_high 

Dốc 22.5 độ cao bên phải, nửa trên (nửa ô đến đầy ô).

tile_slope_l_low 

Dốc 22.5 độ cao bên trái, nửa dưới.

tile_slope_l_high 

Dốc 22.5 độ cao bên trái, nửa trên.

tile_shape_count 

Số loại hình. Không phải một hình thật.

Thông tin về hàm

◆ tile_id()

i32 njin::tile_id ( i32 value)
constexpr

Số thứ tự ô trong tileset, bỏ các bit lật.

Các tham số
valueGiá trị của ô, từ tilemap_get().
Giá trị trả về
Số thứ tự ô, hoặc -1 nếu ô trống.

◆ tile_is_slope()

bool njin::tile_is_slope ( tile_shape shape)
constexpr

Ô có phải dốc không.

Các tham số
shapeHình của ô.
Giá trị trả về
true với các tile_slope_*.

◆ tile_surface()

f32 njin::tile_surface ( tile_shape shape,
f32 u )
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 ô.

Các tham số
shapeHình của ô.
uVị trí ngang trong ô, 0 là mép trái, 1 là mép phải.
Giá trị trả về
0 (mặt ở đáy ô) đến 1 (mặt ở đỉnh ô). Ô không phải dốc trả về 1.

◆ tile_shape_from_name()

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ư _.

Các tham số
nameTên.
outNhận hình nếu tên hợp lệ.
Giá trị trả về
true nếu nhận ra tên.

◆ tilemap_set_shape()

void njin::tilemap_set_shape ( tilemap & map,
i32 id,
tile_shape shape )
inline

Đặt hình va chạm cho mọi ô có số thứ tự id trong tilemap.

Các tham số
mapTilemap.
idSố thứ tự ô trong tileset (không kèm bit lật).
shapeHình.

◆ tilemap_shape()

tile_shape njin::tilemap_shape ( const tilemap & map,
i32 value )
inline

Hình va chạm của một ô.

Các tham số
mapTilemap.
valueGiá trị ô từ tilemap_get(), có thể kèm bit lật.
Giá trị trả về
Hình của ô. Ô trống trả về tile_none. Ô lật ngang đổi dốc trái thành dốc phải và ngược lại.

◆ tilemap_animate()

void njin::tilemap_animate ( tilemap & map,
i32 id,
const std::vector< i32 > & frames,
f32 seconds )
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.

Các tham số
mapTilemap.
idSố thứ tự ô gốc, là ô đặt trong lưới.
framesSố thứ tự ô của từng frame.
secondsThời lượng mỗi frame, giây.

◆ tile_anim_frame()

i32 njin::tile_anim_frame ( const tile_anim & anim,
f32 time )
inline

Số thứ tự ô đang hiện của một animation tại thời điểm time.

Các tham số
animAnimation.
timeThời gian, giây.
Giá trị trả về
Số thứ tự ô, hoặc -1 nếu animation rỗng.

◆ floor_div()

i32 njin::floor_div ( i32 a,
i32 b )
constexpr

Chia làm tròn xuống, đúng cả với số âm: floor_div(-1, 32) == -1.

Các tham số
aSố bị chia.
bSố chia, dương.
Giá trị trả về
Thương làm tròn xuống.

◆ tile_chunk_key()

u64 njin::tile_chunk_key ( i32 cx,
i32 cy )
constexpr

Khóa của chunk tại tọa độ chunk (cx, cy).

Các tham số
cxTọa độ chunk theo cột.
cyTọa độ chunk theo hàng.
Giá trị trả về
Khóa dùng trong tilemap::chunks.

◆ tile_chunk_coord()

cell njin::tile_chunk_coord ( u64 key)
constexpr

Tọa độ chunk từ khóa.

Các tham số
keyKhóa từ tile_chunk_key().
Giá trị trả về
Tọa độ chunk.

◆ tilemap_get()

i32 njin::tilemap_get ( const tilemap & map,
i32 x,
i32 y )
inline

Ô tại cột x, hàng y.

Các tham số
mapTilemap.
xCột.
yHàng.
Giá trị trả về
Số thứ tự ô trong tileset, hoặc -1 nếu trống.

◆ tilemap_set()

void njin::tilemap_set ( tilemap & map,
i32 x,
i32 y,
i32 id )
inline

Đặt ô tại cột x, hàng y.

Chunk được tạo khi cần và bị xóa khi hết ô.

Các tham số
mapTilemap.
xCột.
yHàng.
idChỉ số ô trong tileset, -1 là ô trống.

◆ tilemap_clear()

void njin::tilemap_clear ( tilemap & map)
inline

Xóa mọi ô.

Các tham số
mapTilemap.

◆ tilemap_from_text()

std::vector< tile_marker > njin::tilemap_from_text ( tilemap & map,
std::string_view text,
std::initializer_list< tile_key > legend = {},
cell origin = {} )
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().

const auto markers = njin::tilemap_from_text(map, R"(
####################
#..P......E........#
#.....####.........#
####################
)", {{'#', 7}, {'P', 0, true}});
// '#' thành ô số 7. 'P' thành ô số 0 (nền dưới chân) và được báo lại; 'E' không có trong bảng nên
// chỉ được báo lại; '.' là ô trống. Rồi tạo người chơi và kẻ địch ở đúng ô của chúng.
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

Quy tắc:

  • dòng đầu là hàng 0, ký tự đầu là cột 0 (cộng thêm origin). Các dòng có thể dài ngắn khác nhau;
  • nếu chuỗi bắt đầu bằng xuống dòng thì xuống dòng đó bị bỏ, để viết R"( rồi xuống dòng mới đến hàng đầu. Dòng cuối kết thúc bằng xuống dòng không tạo thêm một hàng rỗng; dòng rỗng ở giữa vẫn tính là một hàng;
  • kết thúc dòng kiểu Windows (\r\n) được hiểu đúng;
  • ô trống ( , ., tab) và ký tự chỉ đánh dấu không đụng tới ô đang có, nên gọi nhiều lần để chồng các lớp được. Muốn xóa ô thì ghi rõ trong bảng: {'.', -1};
  • ký tự trong bảng gọi njin::tilemap_set() nên hình va chạm và animation của ô (njin::tilemap_set_shape, njin::tilemap_animate) áp dụng như khi đặt bằng tay.
    Các tham số
    mapTilemap cần đặt ô. Cần tileset và tile_size như mọi tilemap khác.
    textBản đồ chữ.
    legendBả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).
    Giá trị trả về
    Các ký tự đánh dấu, theo thứ tự đọc: từ trên xuống, trái sang phải.

◆ tilemap_from_rows()

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 = {} )
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.

const auto markers = njin::tilemap_from_rows(map, {"#####", "#.P.#", "#####"}, {{'#', 7}});
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
Các tham số
mapTilemap cần đặt ô.
rowsCác hàng, từ trên xuống.
legendBảng ký tự. Xem njin::tile_key.
originÔ của ký tự đầu tiên. Mặc định (0, 0).
Giá trị trả về
Các ký tự đánh dấu, theo thứ tự đọc.

◆ tilemap_cell_at()

cell njin::tilemap_cell_at ( const tilemap & map,
vec2 origin,
vec2 world_pos )
inline

Ô chứa một điểm trong thế giới.

Các tham số
mapTilemap.
originVị trí góc trên trái của ô (0, 0) trong thế giới.
world_posĐiểm trong thế giới.
Giá trị trả về
Ô chứa điểm đó.

◆ tilemap_cell_rect()

rect njin::tilemap_cell_rect ( const tilemap & map,
vec2 origin,
i32 x,
i32 y )
inline

Hình chữ nhật của một ô trong thế giới.

Các tham số
mapTilemap.
originVị trí góc trên trái của ô (0, 0) trong thế giới.
xCột.
yHàng.
Giá trị trả về
Hình chữ nhật của ô.

◆ tilemap_overlaps()

bool njin::tilemap_overlaps ( const tilemap & map,
vec2 origin,
rect box )
inline

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.

Các tham số
mapTilemap.
originVị trí góc trên trái của ô (0, 0) trong thế giới.
boxHình chữ nhật cần kiểm tra.
Giá trị trả về
true nếu box chồng lên ít nhất một ô không trống.

◆ tilemap_move()

move_result njin::tilemap_move ( const tilemap & map,
vec2 origin,
rect box,
vec2 delta )
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().

Các tham số
mapTilemap, mọi ô không trống đều là vật cản.
originVị trí góc trên trái của ô (0, 0) trong thế giới.
boxHình chữ nhật của vật cần di chuyển.
deltaĐộ dời mong muốn trong frame này.
Giá trị trả về
Vị trí mới và trục nào bị chặn.