From 009e0b95049265b67e76aea868625c3e4f2b0f25 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 24 Jan 2022 21:33:32 -0600 Subject: [PATCH] movable player --- .vscode/tasks.json | 20 ++++++++ src/build.onyx | 5 +- src/entity/manager.onyx | 68 ++++++++++++++++++++++++++ src/entity/player.onyx | 31 ++++++++++++ src/gfx/{imgui.onyx => immediate.onyx} | 0 src/main.onyx | 14 ++++++ src/utils/input.onyx | 4 ++ 7 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 .vscode/tasks.json create mode 100644 src/entity/manager.onyx create mode 100644 src/entity/player.onyx rename src/gfx/{imgui.onyx => immediate.onyx} (100%) diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..2242be8 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,20 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Run game", + "type": "shell", + "options": { + "cwd": "${workspaceFolder}/run_tree" + }, + "problemMatcher": "$onyx", + "command": "onyx run -V -I ../src build", + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} \ No newline at end of file diff --git a/src/build.onyx b/src/build.onyx index 8c9a8d2..e5765df 100644 --- a/src/build.onyx +++ b/src/build.onyx @@ -7,8 +7,11 @@ #load "main" +#load "entity/manager" +#load "entity/player" + #load "gfx/font" -#load "gfx/imgui" +#load "gfx/immediate" #load "gfx/mesh" #load "gfx/shader" #load "gfx/texture" diff --git a/src/entity/manager.onyx b/src/entity/manager.onyx new file mode 100644 index 0000000..454dc55 --- /dev/null +++ b/src/entity/manager.onyx @@ -0,0 +1,68 @@ + +use package core +use package glfw3 + +Entity_Vtable :: struct { + draw : (entity: ^Entity) -> void; + update : (entity: ^Entity, dt: f32) -> void; +} + +Entity :: struct { + use vtable: ^Entity_Vtable; + id: u32; +} + +Entity_Manager :: struct { + // The allocator for these entity pointers is assumed to be the + // context allocator. + entities: [..] ^Entity; + + next_entity_id: u32; + + update :: entity_manager_update; + register :: entity_manager_register; + draw :: entity_manager_draw; +} + +entity_manager_make :: () -> Entity_Manager { + em: Entity_Manager; + + array.init(^em.entities, 4); + + // Entity ID 0 is reserved as a "empty / null" entity + em.next_entity_id = 1; + + return em; +} + +entity_manager_register :: (use this: ^Entity_Manager, entity: ^Entity) -> u32 { + id := next_entity_id; + next_entity_id += 1; + + entity.id = id; + entities << entity; + return id; +} + +entity_manager_update :: (use this: ^Entity_Manager, dt: f32) { + for entities { + if it.vtable == null do continue; + + if it.update != null_proc { + it->update(dt); + } + } +} + +entity_manager_draw :: (use this: ^Entity_Manager) { + // Entities should be sorted by z-order. + for entities { + if it.vtable == null do continue; + + if it.draw != null_proc { + it->draw(); + } + } +} + + diff --git a/src/entity/player.onyx b/src/entity/player.onyx new file mode 100644 index 0000000..bb77b0c --- /dev/null +++ b/src/entity/player.onyx @@ -0,0 +1,31 @@ + +use package core +use package glfw3 + +Player :: struct { + use entity: Entity; + + pos: Vector2; +} + +player_make :: () -> ^Player { + player := new(Player); + player.vtable = ^player_vtable; + + player.pos = .{0,0}; + return player; +} + +player_update :: (use this: ^Player, dt: f32) { + if is_key_down(GLFW_KEY_W) do pos.y -= 100 * dt; + if is_key_down(GLFW_KEY_S) do pos.y += 100 * dt; + if is_key_down(GLFW_KEY_A) do pos.x -= 100 * dt; + if is_key_down(GLFW_KEY_D) do pos.x += 100 * dt; +} + +player_draw :: (use this: ^Player) { + immediate_set_color(.{0.4,0.4,1}); + immediate_rectangle(pos.x, pos.y, 50, 50); +} + +#local player_vtable := Entity_Vtable.{ update=player_update, draw=player_draw }; diff --git a/src/gfx/imgui.onyx b/src/gfx/immediate.onyx similarity index 100% rename from src/gfx/imgui.onyx rename to src/gfx/immediate.onyx diff --git a/src/main.onyx b/src/main.onyx index 7bfe010..00c2b6f 100644 --- a/src/main.onyx +++ b/src/main.onyx @@ -14,6 +14,8 @@ window_height: u32 player_texture: Texture; main_font: Font; +entity_manager: Entity_Manager; + init :: () { create_window(); glInit(glfwGetLoadProcAddress()); @@ -35,11 +37,17 @@ init :: () { player_texture = texture_make(#cstr "./assets/images/player.png"); main_font = font_make(.{"./assets/fonts/calibri.ttf", 32}); + + entity_manager = entity_manager_make(); + player := player_make(); + entity_manager->register(player); } update :: (dt: f32) { input_update(); defer input_post_update(); + + entity_manager->update(dt); } draw :: () { @@ -56,6 +64,12 @@ draw :: () { immediate_image(^player_texture, ~~(100 + 64 * i), 50, 64, 64); } + entity_manager->draw(); + + mx, my := mouse_get_position(); + immediate_set_color(.{1,1,1}); + immediate_rectangle(~~mx, ~~my, 10, 10); + immediate_flush(); font_set_color(.{1,0,0}); diff --git a/src/utils/input.onyx b/src/utils/input.onyx index a05c3f5..02a7dc6 100644 --- a/src/utils/input.onyx +++ b/src/utils/input.onyx @@ -62,3 +62,7 @@ is_button_just_up :: (button) => !buttons_this_frame[button] && buttons_last_f mouse_get_delta :: () -> (f64, f64) { return mouse_x - last_mouse_x, mouse_y - last_mouse_y; } + +mouse_get_position :: () -> (f64, f64) { + return mouse_x, mouse_y; +} \ No newline at end of file -- 2.25.1