From 752181c1f7ef7c97207aec30f2c89267199a9b29 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Wed, 26 Jan 2022 14:24:31 -0600 Subject: [PATCH] syncing changes --- src/entity/manager.onyx | 31 ++++++++++++++++++----- src/entity/player.onyx | 55 ++++++++++++++++++++++++++++++++++++----- src/main.onyx | 2 ++ src/utils/vecmath.onyx | 13 ++++++++++ 4 files changed, 89 insertions(+), 12 deletions(-) diff --git a/src/entity/manager.onyx b/src/entity/manager.onyx index ab3ab42..46c293a 100644 --- a/src/entity/manager.onyx +++ b/src/entity/manager.onyx @@ -3,8 +3,9 @@ use package core use package glfw3 Entity_Handles :: struct { - update : (entity: ^Entity, dt: f32) -> void = null_proc; - draw : (entity: ^Entity) -> void = null_proc; + update : (entity: ^Entity, dt: f32) -> void = null_proc; + draw : (entity: ^Entity) -> void = null_proc; + get_rect : (entity: ^Entity) -> Rect = null_proc; } Entity :: struct { @@ -27,10 +28,11 @@ Entity_Manager :: struct { next_entity_id: u32; - register :: entity_manager_register; - add :: entity_manager_add; - update :: entity_manager_update; - draw :: entity_manager_draw; + register :: entity_manager_register; + add :: entity_manager_add; + update :: entity_manager_update; + draw :: entity_manager_draw; + query_entities :: entity_manager_query_entities; } entity_manager_make :: () -> Entity_Manager { @@ -66,6 +68,7 @@ entity_manager_update :: (use this: ^Entity_Manager, dt: f32) { for entities { vtable := ^entity_types[it.type]; if vtable == null do continue; + if vtable.update == null_proc do continue; vtable.update(it, dt); } @@ -76,9 +79,25 @@ entity_manager_draw :: (use this: ^Entity_Manager) { for entities { vtable := ^entity_types[it.type]; if vtable == null do continue; + if vtable.draw == null_proc do continue; vtable.draw(it); } } +entity_manager_query_entities :: (use this: ^Entity_Manager, area: Rect, type: type_expr = void) -> [] ^Entity { + ents: [..] ^Entity; + for entities { + if type != void && it.type != type do continue; + + vtable := ^entity_types[it.type]; + if vtable == null do continue; + if vtable.get_rect == null_proc do continue; + + if Rect.intersects(vtable.get_rect(it), area) { + ents << it; + } + } + return ents; +} \ No newline at end of file diff --git a/src/entity/player.onyx b/src/entity/player.onyx index bd1b9b6..fed7e8e 100644 --- a/src/entity/player.onyx +++ b/src/entity/player.onyx @@ -3,7 +3,7 @@ use package core use package glfw3 Player :: struct { - handles :: Entity_Handles.{ update, draw } + handles :: Entity_Handles.{ update, draw, get_rect } use entity: Entity; @@ -13,11 +13,32 @@ Player :: struct { return player; } + get_rect :: (use this: ^Player) => Rect.{ pos.x, pos.y, 64, 64 }; + update :: (use this: ^Player, dt: f32) { - if is_key_down(GLFW_KEY_W) do pos.y -= 200 * dt; - if is_key_down(GLFW_KEY_S) do pos.y += 200 * dt; - if is_key_down(GLFW_KEY_A) do pos.x -= 200 * dt; - if is_key_down(GLFW_KEY_D) do pos.x += 200 * dt; + delta: Vector2; + if is_key_down(GLFW_KEY_W) do delta.y -= 200 * dt; + if is_key_down(GLFW_KEY_S) do delta.y += 200 * dt; + if is_key_down(GLFW_KEY_A) do delta.x -= 200 * dt; + if is_key_down(GLFW_KEY_D) do delta.x += 200 * dt; + + walls := entity_manager->query_entities(.{pos.x - 100, pos.y - 100, 200, 200}, Wall); + defer memory.free_slice(^walls); + + try_move(this, .{delta.x, 0}, walls); + try_move(this, .{0, delta.y}, walls); + } + + try_move :: (use this: ^Player, delta: Vector2, obsticles: [] ^Entity) { + pos += delta; + ent_rect := get_rect(this); + + for obsticles { + if Rect.intersects(ent_rect, Wall.get_rect(~~ it)) { + pos -= delta; + break; + } + } } draw :: (use this: ^Player) { @@ -26,5 +47,27 @@ Player :: struct { } } - player_texture: Texture; + + + +Wall :: struct { + handles :: Entity_Handles.{ get_rect = get_rect, draw = draw } + + use entity: Entity; + size: Vector2; + + make :: (pos, size: Vector2) -> ^Wall { + wall := new(Wall); + wall.pos = pos; + wall.size = size; + return wall; + } + + get_rect :: (use this: ^Wall) => Rect.{ pos.x, pos.y, size.x, size.y }; + + draw :: (use this: ^Wall) { + immediate_set_color(.{1,1,1}); + immediate_rectangle(pos.x, pos.y, size.x, size.y); + } +} \ No newline at end of file diff --git a/src/main.onyx b/src/main.onyx index bc23eb8..d450ae7 100644 --- a/src/main.onyx +++ b/src/main.onyx @@ -40,6 +40,8 @@ init :: () { entity_manager = entity_manager_make(); player := Player.make(); entity_manager->add(player); + + entity_manager->add(Wall.make(.{100, 100}, .{200, 100})); } update :: (dt: f32) { diff --git a/src/utils/vecmath.onyx b/src/utils/vecmath.onyx index eb6f639..10217ba 100644 --- a/src/utils/vecmath.onyx +++ b/src/utils/vecmath.onyx @@ -69,3 +69,16 @@ Vector3 :: struct [conv.Custom_Format.{format_vector3}] { conv.format(output, "({}, {}, {})", v.x, v.y, v.z); } } + + + +Rect :: struct { + x, y, w, h: f32; + + intersects :: (r1, r2: Rect) -> bool { + return r1.x <= r2.x + r2.w + && r1.x + r1.w >= r2.x + && r1.y <= r2.y + r2.h + && r1.y + r1.h >= r2.y; + } +} \ No newline at end of file -- 2.25.1