Nhiễu, luật làm bản đồ tự nhiên, sinh màn top-down và platformer, Wave Function Collapse. Tiếp...
Classes | |
| struct | njin::tile_grid |
| Một lưới ô hình chữ nhật, kích thước cố định, để sinh và sửa bản đồ trước khi đưa vào njin::tilemap. Tiếp... | |
| struct | njin::noise_desc |
| Tham số của một nguồn nhiễu. Tiếp... | |
| struct | njin::autotile_rule |
| Một luật bo góc: những ô nào là cùng một địa hình và vẽ bằng bộ ô nào. Tiếp... | |
| struct | njin::biome |
| Một vùng đất của bản đồ top-down: ô nào đặt ở chỗ có độ cao và độ ẩm nào. Tiếp... | |
| struct | njin::topdown_gen_desc |
| Tham số sinh bản đồ top-down. Tiếp... | |
| struct | njin::topdown_gen_result |
| Kết quả của generate_topdown(). Tiếp... | |
| struct | njin::platformer_gen_desc |
| Tham số sinh màn platformer, nhìn ngang, đi từ trái sang phải. Tiếp... | |
| struct | njin::platformer_gen_result |
| Kết quả của generate_platformer(). Tiếp... | |
| struct | njin::wfc_rules |
| Luật của Wave Function Collapse: có những ô nào, mỗi ô hay gặp đến đâu, và ô nào được đứng cạnh ô nào theo từng hướng. Tiếp... | |
| struct | njin::wfc_desc |
| Tham số của wfc_generate(). Tiếp... | |
Các hàm | |
| tile_grid | njin::tile_grid_make (i32 width, i32 height, i32 fill=-1) |
| Tạo một lưới width x height, mọi ô là fill. | |
| tile_grid | njin::tile_grid_from_text (std::string_view text, std::initializer_list< tile_key > legend) |
| Dựng lưới từ bản đồ chữ, cùng quy tắc với tilemap_from_text(): mỗi ký tự một ô, legend cho biết ký tự nào là ô nào. | |
| void | njin::tilemap_from_grid (tilemap &map, const tile_grid &grid, cell origin={}) |
| Đặt lưới vào tilemap, góc trên trái ở ô origin. | |
| i32 | njin::grid_count (const tile_grid &grid, i32 tile) |
| Số ô có giá trị tile. | |
| f32 | njin::noise_2d (const noise_desc &desc, f32 x, f32 y) |
| Giá trị nhiễu tại một điểm, từ 0 đến 1. | |
| f32 | njin::noise_1d (const noise_desc &desc, f32 x) |
| Nhiễu một chiều, từ 0 đến 1: đường mặt đất của platformer, độ cao theo cột. | |
| void | njin::grid_majority (tile_grid &grid, i32 iterations=1, i32 threshold=5) |
| Làm mượt: mỗi ô thành loại ô xuất hiện nhiều nhất trong ô 3 x 3 quanh nó, nếu loại đó có ít nhất threshold ô. | |
| void | njin::grid_smooth (tile_grid &grid, i32 solid, i32 open, i32 iterations=3, i32 threshold=5) |
| Làm mượt hai loại ô kiểu hang động (automat tế bào): một ô thành solid nếu ít nhất threshold trong 8 ô quanh nó là đặc, còn không thì thành open. | |
| i32 | njin::grid_remove_small (tile_grid &grid, i32 tile, i32 min_size, i32 replace) |
| Xoá các vùng nhỏ của một loại ô: mỗi vùng liền nhau (theo 4 hướng) của tile có ít hơn min_size ô thì thành replace. | |
| i32 | njin::grid_merge_small (tile_grid &grid, i32 min_size) |
| Như grid_remove_small() cho mọi loại ô: vùng nhỏ hơn min_size hoà vào loại ô bao quanh nó nhiều nhất. | |
| i32 | njin::grid_keep_largest (tile_grid &grid, std::initializer_list< i32 > walkable, i32 replace) |
| Giữ mọi chỗ đi được liền một khối: trong các ô thuộc walkable, chỉ vùng liền nhau (4 hướng) lớn nhất được giữ, các vùng khác thành replace. | |
| i32 | njin::grid_border (tile_grid &grid, i32 tile, i32 touching, i32 replace, u8 sides=side_all, i32 distance=1) |
| Viền: ô tile nằm cách touching không quá distance ô (theo các phía trong sides) thì thành replace. | |
| i32 | njin::grid_scatter (tile_grid &grid, i32 on, i32 place, f32 chance, u32 seed, i32 min_distance=0) |
| Rải ngẫu nhiên: mỗi ô on có xác suất chance thành place, và hai ô được rải cách nhau ít nhất min_distance ô (0 là không giới hạn). | |
| i32 | njin::grid_scatter (tile_grid &grid, i32 place, f32 chance, u32 seed, const std::function< bool(const tile_grid &, i32, i32)> &where, i32 min_distance=0) |
| Như bản trên, nhưng chỗ nào được rải do hàm where quyết định: bụi cây chỉ ở ô trống ngay trên mặt đất, đuốc chỉ trên tường... | |
| i32 | njin::autotile_count (autotile_layout layout) |
| Số ô của một bộ. | |
| i32 | njin::autotile_index (u8 mask, autotile_layout layout=autotile_blob) |
| Số thứ tự ô (trong bộ, từ 0) ứng với một mặt nạ. | |
| i32 | njin::grid_autotile (tile_grid &grid, const std::vector< autotile_rule > &rules) |
| Thay mọi ô thuộc rules[i].tiles bằng ô của bộ tương ứng, chọn theo các ô kề: chỗ nào địa hình hở ra thì ô có mép, hai mép gặp nhau thì có góc tròn (lồi), chỗ địa hình lõm vào thì có góc lõm. | |
| topdown_gen_result | njin::generate_topdown (const topdown_gen_desc &desc) |
| Sinh bản đồ top-down từ nhiễu. | |
| platformer_gen_result | njin::generate_platformer (const platformer_gen_desc &desc) |
| Sinh màn platformer từ nhiễu. | |
| i32 | njin::wfc_add_tile (wfc_rules &rules, i32 tile, f32 weight=1.0f) |
| Thêm một ô vào luật (hoặc đổi độ hay gặp nếu đã có). | |
| void | njin::wfc_allow (wfc_rules &rules, i32 a, wfc_dir dir, i32 b) |
| Cho phép b đứng ở hướng dir của a, và (đối xứng) a đứng ở hướng ngược lại của b. | |
| wfc_rules | njin::wfc_learn (const tile_grid &sample, bool periodic=false) |
| Học luật từ một mẫu: mọi cặp ô cạnh nhau trong mẫu thành luật kề, số lần xuất hiện thành độ hay gặp. | |
| bool | njin::wfc_generate (const wfc_rules &rules, const wfc_desc &desc, tile_grid &out) |
| Sinh một lưới thoả mọi luật kề, bằng Wave Function Collapse (mô hình ô, không quay lui: gặp mâu thuẫn thì làm lại từ đầu với dãy ngẫu nhiên khác, tối đa attempts lần). | |
Nhiễu, luật làm bản đồ tự nhiên, sinh màn top-down và platformer, Wave Function Collapse.
| enum njin::noise_type |
| enum njin::noise_fractal |
Cách chồng nhiều lớp nhiễu (octave) lên nhau.
| enum njin::grid_side : u8 |
Bộ ô dùng để nối một loại địa hình với chính nó.
| enum njin::autotile_neighbor : u8 |
Các ô kề, cộng lại thành mặt nạ (mask) của một ô.
Ô chéo chỉ tính khi cả hai ô kề thẳng cạnh nó cũng cùng loại, nên chỉ còn 47 kiểu mặt nạ (chứ không phải 256).
Tạo một lưới width x height, mọi ô là fill.
| width | Số cột. |
| height | Số hàng. |
| fill | Giá trị ban đầu, mặc định -1 (trống). |
| tile_grid njin::tile_grid_from_text | ( | std::string_view | text, |
| std::initializer_list< tile_key > | legend ) |
Dựng lưới từ bản đồ chữ, cùng quy tắc với tilemap_from_text(): mỗi ký tự một ô, legend cho biết ký tự nào là ô nào.
Ký tự không có trong legend thành -1. Lưới rộng bằng dòng dài nhất. Dùng để viết mẫu cho wfc_learn(), hoặc để chỉnh tay một lưới rồi cho luật chạy tiếp.
| text | Bản đồ chữ. |
| legend | Bảng ký tự. |
Đặt lưới vào tilemap, góc trên trái ở ô origin.
Ô -1 của lưới không xóa ô đang có (như bản đồ chữ), nên chồng được nhiều lưới; muốn sinh lại từ đầu thì gọi tilemap_clear() trước.
| map | Tilemap. |
| grid | Lưới. |
| origin | Ô của góc trên trái. |
Số ô có giá trị tile.
| grid | Lưới. |
| tile | Số thứ tự ô (có thể là -1). |
| f32 njin::noise_2d | ( | const noise_desc & | desc, |
| f32 | x, | ||
| f32 | y ) |
Giá trị nhiễu tại một điểm, từ 0 đến 1.
| desc | Tham số. |
| x | Toạ độ, thường là cột của ô. |
| y | Toạ độ, thường là hàng. |
| f32 njin::noise_1d | ( | const noise_desc & | desc, |
| f32 | x ) |
Nhiễu một chiều, từ 0 đến 1: đường mặt đất của platformer, độ cao theo cột.
| desc | Tham số. |
| x | Toạ độ. |
Làm mượt: mỗi ô thành loại ô xuất hiện nhiều nhất trong ô 3 x 3 quanh nó, nếu loại đó có ít nhất threshold ô.
Xoá các chấm lẻ và răng cưa mà nhiễu để lại, với mọi loại ô cùng lúc.
| grid | Lưới. |
| iterations | Số lần làm. |
| threshold | Trong 9 ô, cần bao nhiêu (5 là đa số). |
| void njin::grid_smooth | ( | tile_grid & | grid, |
| i32 | solid, | ||
| i32 | open, | ||
| i32 | iterations = 3, | ||
| i32 | threshold = 5 ) |
Làm mượt hai loại ô kiểu hang động (automat tế bào): một ô thành solid nếu ít nhất threshold trong 8 ô quanh nó là đặc, còn không thì thành open.
Ô đặc là mọi ô khác open, kể cả ngoài lưới, nên hang không thủng ra mép. Chỉ đổi những ô đang là solid hoặc open.
| grid | Lưới. |
| solid | Ô đặc (vách). |
| open | Ô trống (lòng hang, thường -1). |
| iterations | Số lần làm, 2 đến 5 là thường. |
| threshold | 5 là luật hang cổ điển. |
Xoá các vùng nhỏ của một loại ô: mỗi vùng liền nhau (theo 4 hướng) của tile có ít hơn min_size ô thì thành replace.
Bỏ ao tí xíu, đảo một ô, mảng đá lạc.
| grid | Lưới. |
| tile | Loại ô. |
| min_size | Kích thước tối thiểu. |
| replace | Ô thay vào. |
Như grid_remove_small() cho mọi loại ô: vùng nhỏ hơn min_size hoà vào loại ô bao quanh nó nhiều nhất.
| grid | Lưới. |
| min_size | Kích thước tối thiểu. |
| i32 njin::grid_keep_largest | ( | tile_grid & | grid, |
| std::initializer_list< i32 > | walkable, | ||
| i32 | replace ) |
Giữ mọi chỗ đi được liền một khối: trong các ô thuộc walkable, chỉ vùng liền nhau (4 hướng) lớn nhất được giữ, các vùng khác thành replace.
Dùng cho top-down để không có góc nào bị cô lập.
| grid | Lưới. |
| walkable | Các loại ô đi được. |
| replace | Ô thay cho vùng bị bỏ. |
| i32 njin::grid_border | ( | tile_grid & | grid, |
| i32 | tile, | ||
| i32 | touching, | ||
| i32 | replace, | ||
| u8 | sides = side_all, | ||
| i32 | distance = 1 ) |
Viền: ô tile nằm cách touching không quá distance ô (theo các phía trong sides) thì thành replace.
Bãi cát giữa nước và cỏ, cỏ trên mặt đất (chỉ phía trên chạm ô trống), rìa đá.
| grid | Lưới. |
| tile | Ô bị đổi. |
| touching | Ô gây ra viền. |
| replace | Ô viền. |
| sides | Các phía được xét. |
| distance | Độ dày viền, tính bằng ô. |
| i32 njin::grid_scatter | ( | tile_grid & | grid, |
| i32 | on, | ||
| i32 | place, | ||
| f32 | chance, | ||
| u32 | seed, | ||
| i32 | min_distance = 0 ) |
Rải ngẫu nhiên: mỗi ô on có xác suất chance thành place, và hai ô được rải cách nhau ít nhất min_distance ô (0 là không giới hạn).
Hoa trên cỏ, đá trên đất, cây trong rừng.
| grid | Lưới. |
| on | Ô được rải lên. |
| place | Ô rải. |
| chance | Xác suất, 0 đến 1. |
| seed | Hạt giống. |
| min_distance | Khoảng cách tối thiểu (Chebyshev). |
| i32 njin::grid_scatter | ( | tile_grid & | grid, |
| i32 | place, | ||
| f32 | chance, | ||
| u32 | seed, | ||
| const std::function< bool(const tile_grid &, i32, i32)> & | where, | ||
| i32 | min_distance = 0 ) |
Như bản trên, nhưng chỗ nào được rải do hàm where quyết định: bụi cây chỉ ở ô trống ngay trên mặt đất, đuốc chỉ trên tường...
| grid | Lưới. |
| place | Ô rải. |
| chance | Xác suất. |
| seed | Hạt giống. |
| where | Ô (x, y) có được rải không. |
| min_distance | Khoảng cách tối thiểu. |
| i32 njin::autotile_count | ( | autotile_layout | layout | ) |
Số ô của một bộ.
| layout | Kiểu bộ. |
| i32 njin::autotile_index | ( | u8 | mask, |
| autotile_layout | layout = autotile_blob ) |
Số thứ tự ô (trong bộ, từ 0) ứng với một mặt nạ.
Với autotile_edges: up + 2 * right + 4 * down + 8 * left, mỗi số là 1 nếu ô kề đó cùng loại (bỏ qua ô chéo); ô tách rời hoàn toàn là 0, ô ở giữa vùng là 15. Với autotile_blob: thứ hạng của mặt nạ (đã bỏ ô chéo thừa) trong 47 mặt nạ hợp lệ xếp tăng dần; ô tách rời là 0, ô ở giữa vùng là 46. Vẽ bộ ô theo đúng thứ tự này (trang Sinh bản đồ có bảng).
| mask | Các bit neighbor_* của ô kề cùng loại. |
| layout | Kiểu bộ. |
| i32 njin::grid_autotile | ( | tile_grid & | grid, |
| const std::vector< autotile_rule > & | rules ) |
Thay mọi ô thuộc rules[i].tiles bằng ô của bộ tương ứng, chọn theo các ô kề: chỗ nào địa hình hở ra thì ô có mép, hai mép gặp nhau thì có góc tròn (lồi), chỗ địa hình lõm vào thì có góc lõm.
Mọi luật đọc từ cùng một bản chụp lưới trước khi đổi, nên thứ tự các luật không ảnh hưởng và số thứ tự ô mới không bị nhầm với ô cũ. Một ô khớp nhiều luật thì luật đầu thắng.
Gọi sau cùng, sau mọi luật khác (grid_border(), grid_scatter()...): vì ô đã đổi thành ô của bộ.
| grid | Lưới. |
| rules | Các luật. |
| topdown_gen_result njin::generate_topdown | ( | const topdown_gen_desc & | desc | ) |
Sinh bản đồ top-down từ nhiễu.
| desc | Tham số. |
| platformer_gen_result njin::generate_platformer | ( | const platformer_gen_desc & | desc | ) |
Sinh màn platformer từ nhiễu.
| desc | Tham số. |
Thêm một ô vào luật (hoặc đổi độ hay gặp nếu đã có).
| rules | Luật. |
| tile | Ô. |
| weight | Độ hay gặp. |
Cho phép b đứng ở hướng dir của a, và (đối xứng) a đứng ở hướng ngược lại của b.
Ô chưa có được thêm vào với độ hay gặp 1.
| rules | Luật. |
| a | Ô thứ nhất. |
| dir | Hướng từ a sang b. |
| b | Ô thứ hai. |
Học luật từ một mẫu: mọi cặp ô cạnh nhau trong mẫu thành luật kề, số lần xuất hiện thành độ hay gặp.
Viết mẫu bằng tile_grid_from_text(). Mẫu nhỏ và đa dạng cho kết quả tốt; mẫu thiếu cặp nào thì cặp đó không bao giờ xuất hiện.
| sample | Mẫu. |
| periodic | true: coi mẫu lặp lại, mép phải nối mép trái, mép dưới nối mép trên. |
Sinh một lưới thoả mọi luật kề, bằng Wave Function Collapse (mô hình ô, không quay lui: gặp mâu thuẫn thì làm lại từ đầu với dãy ngẫu nhiên khác, tối đa attempts lần).
| rules | Luật. |
| desc | Tham số. |
| out | Nhận lưới nếu thành công; không đổi nếu thất bại. |