#include <njin.h>
namespace {
using namespace njin;
void startup(context &ctx) {
entt::registry ® =
world(ctx);
for (
i32 y = 0; y < 12; y++)
for (
i32 x = 0; x < 20; x++)
tilemap_set(map, x, y, (x == 0 || y == 0 || x == 19 || y == 11) ? 7 : 0);
for (
i32 x = 6; x < 10; x++)
const entt::entity level = reg.create();
reg.emplace<
tilemap>(level, std::move(map));
const entt::entity player = reg.create();
reg.emplace<
collider>(player,
collider{.size = {10.0f, 8.0f}, .offset = {0.0f, -4.0f}});
const rect bounds{{0.0f, 0.0f}, {320.0f, 192.0f}};
}
void draw_player(context &ctx) {
});
}
void setup(context &ctx) {
}
}
int main() {
context *ctx =
create({.title =
"Đi bộ", .width = 960, .height = 540, .target_fps = 60});
}
entt::entity camera_spawn(context &ctx, f32 zoom=1.0f, vec2 pos={})
Tạo một entity camera đang dùng (transform, njin::camera_2d, njin::camera_on) nhìn vào pos,...
@ collider_tiles
Mọi ô không trống của njin::tilemap trên cùng entity là vật cản.
Definition njin_collision.h:29
void run(context &ctx)
Chạy vòng lặp chính cho đến khi cửa sổ đóng.
context * create(const config &cfg)
Mở cửa sổ và trả về context của engine.
void destroy(context *ctx)
Giải phóng mọi tài nguyên của engine và đóng cửa sổ.
void draw_rect(const context &ctx, rect r, rgba color)
Vẽ hình chữ nhật đặc.
const char * tr(const context &ctx, const char *key)
Chuỗi đã dịch của key trong ngôn ngữ đang dùng.
constexpr rect rect_from_center(vec2 center, vec2 size)
Tạo hình chữ nhật từ tâm và kích thước.
Definition _math.h:228
void ecs_register(context &ctx, sys_phase phase, sys_fnc fnc, const char *name=nullptr)
Thêm một system vào lịch chạy của một phase.
void mod_register(context &ctx, const mod_desc &desc)
Chạy setup của module và đưa các system của nó vào lịch chạy.
entt::registry & world(context &ctx)
Trả về registry của EnTT chứa mọi entity và component của game.
@ phase_startup
Một lần, trước frame đầu tiên.
Definition _mod.h:32
@ phase_render
Mỗi frame, vẽ trong không gian thế giới.
Definition _mod.h:38
void texture_set_filter(context &ctx, texture_handle handle, texture_filter filter)
Đổi cách lấy mẫu của texture.
texture_handle texture_load(context &ctx, const char *path)
Nạp một texture từ file ảnh.
@ filter_nearest
Giữ nguyên từng pixel, sắc cạnh. Dùng cho pixel art.
Definition njin_draw.h:198
void tilemap_set(tilemap &map, i32 x, i32 y, i32 id)
Đặt ô tại cột x, hàng y.
Definition _tilemap.h:265
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
@ tile_none
Không va chạm: chỉ để nhìn, dù nằm trong layer vật cản.
Definition _tilemap.h:57
std::int32_t i32
Số nguyên có dấu 32 bit.
Definition _types.h:14
constexpr rgba yellow
Vàng.
Definition _math.h:239
Định danh của một action nhập liệu, tạo bởi action_register().
Definition _types.h:85
Định danh của một axis nhập liệu, tạo bởi axis_register().
Definition _types.h:93
Cho camera bám theo một entity: mượt, có vùng chết, nhìn trước theo hướng chạy, và không bao giờ lộ r...
Definition njin_camera.h:31
Hình va chạm của một entity.
Definition njin_collision.h:46
vec2 offset
Độ lệch của tâm so với transform.pos.
Definition njin_collision.h:50
vec2 size
Kích thước hình hộp.
Definition njin_collision.h:48
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
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
Nhân vật top-down: đi 8 hướng (hoặc mọi hướng với cần analog), trượt dọc tường, lướt.
Definition njin_body.h:97
Bấm mũi tên hoặc WASD để đi, Space để lướt. Nhân vật trượt dọc tường đá thay vì dính vào, và camera không bao giờ lộ ra ngoài bản đồ.
const njin::axis_handle move_x = njin::axis_define(ctx, "move_x", {{njin::key_left, njin::key_right}, {njin::key_a, njin::key_d}});
const njin::axis_handle move_y = njin::axis_define(ctx, "move_y", {{njin::key_up, njin::key_down}, {njin::key_w, njin::key_s}});
const njin::action_handle dash = njin::action_define(ctx, "dash", {njin::key_space, njin::pad_face_down});
Cùng một bản đồ phục vụ cả hai việc (vẽ và va chạm) nên không cần một layer riêng cho tường. Đọc thêm ở Tilemap.