From 8c2d878eadae22f83cfddc13f2fc5a4a08df7996 Mon Sep 17 00:00:00 2001 From: Abdulmujeeb Raji Date: Wed, 28 Aug 2024 15:54:40 +0100 Subject: [PATCH] Entity stuff --- assets/mutant.png | Bin 0 -> 172 bytes assets/player.png | Bin 0 -> 127 bytes assets/spider.png | Bin 0 -> 163 bytes assets/tree.png | Bin 0 -> 431 bytes build.c | 4 +- entry_helpless.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 assets/mutant.png create mode 100644 assets/player.png create mode 100644 assets/spider.png create mode 100644 assets/tree.png create mode 100644 entry_helpless.c diff --git a/assets/mutant.png b/assets/mutant.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf0f507a36bd80e98507b677e36805243ca37ac GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^96&6_!3HG%UcQ?Eq!^2X+?^QKos)S9_9BQ!3HF6HKu+5QjEnx?oJHr&dIz4ax6Vv9780g zCZ{wsUEcoxPy0sS&`1eM2?>cA5+4}$OsZg1-c@_z+ob&G4jw{mFaEWB)GQF#wxC&( am*L=ZvAL#C6vTjrFnGH9xvXFVdQ&MBb@0IqsIEdT%j literal 0 HcmV?d00001 diff --git a/assets/tree.png b/assets/tree.png new file mode 100644 index 0000000000000000000000000000000000000000..5b4eb756fe1bf01a633516551f9d3c9052dd9148 GIT binary patch literal 431 zcmV;g0Z{&lP)Px$X-PyuRA_tp}~a zEI)$P%)ZX@AfCPj1ac_k{qyzD|9v^#T85XOsIQlVh^>iF#@zL5AawbHHi!p;R%aGT9+lneoE6L4Ux!J*sMtr zUC?@r4Zl1=kzNDTm(g3Ao@o%5)6J<#WF;~pjR%pD5-X8WsGBvzMQBJkeqj`=b!4QB zu0%#l0D#jV0VtR?fRc9&EojAKWL_o!z|YHXwZvVdM5ab0^hMzC?9Z0W%Y=EEqWwfW z|NeNpCqz$8DM;{>^4oo#uX!R|CYO+WOd=^#E93J_LL}l-DwUD|fMdyxTXpU;d_f~j zgkvHc6XBQ$$3!?L!Z8t!iEz}2h_`bk`_-K7qMAh1h=`)AIon9fBRX=nB6-r=qEjg( Z_Yd7XhZz_k3= 0 && id < SPRITE_MAX) { + return &sprites[id]; + } + return &sprites[0]; +} + +typedef enum Entity_Archetype { + ARCH_nil = 0, + ARCH_player = 1, + ARCH_spider = 2, + ARCH_mutant = 3, + ARCH_tree = 4, +} Entity_Archetype; + +typedef struct Entity { + bool alive; + Entity_Archetype arch; + Vector2 pos; + Sprite_ID sprite_id; + bool renderable; +} Entity; + +#define MAX_ENTITIES 1024 +typedef struct World { + Entity entities[MAX_ENTITIES]; +} World; +World* world = 0; + +Entity* entity_create() { + Entity* entity_found = 0; + for (int i = 0; i < MAX_ENTITIES; i++) { + Entity* existing_entity = &world->entities[i]; + if (!existing_entity->alive) { + entity_found = existing_entity; + break; + } + } + assert(entity_found, "Entity Overflow!"); + entity_found->alive = true; + return entity_found; +} + +void entity_destroy(Entity* entity) { + memset(entity, 0, sizeof(Entity)); +} + +void player_setup(Entity* en) { + en->arch = ARCH_player; + en->sprite_id = SPRITE_player; +} + +void spider_setup(Entity* en) { + en->arch = ARCH_spider; + en->sprite_id = SPRITE_spider; + en->pos = v2(get_random_float32_in_range(-200, 200), get_random_float32_in_range(-200, 200)); +} + +int entry(int argc, char **argv) { + + // This is how we (optionally) configure the window. + // You can set this at any point in the runtime and it will + // be applied in os_update(). + // If you don't care, you can ignore all of this as it all + // has reasonable default values. + window.title = STR("Helpless"); + window.scaled_width = 1280; // We need to set the scaled size if we want to handle system scaling (DPI) + window.scaled_height = 720; + window.clear_color = hex_to_rgba(0x222034ff); + window.allow_resize = false; + window.fullscreen = true; + + world = alloc(get_heap_allocator(), sizeof(World)); + + Gfx_Image *player_image = load_image_from_disk(STR("assets/player.png"), get_heap_allocator()); + assert(player_image, "Player image not found D:"); + sprites[SPRITE_player].image = player_image; + sprites[SPRITE_player].size = v2((float32)player_image->width, (float32)player_image->height); + + Gfx_Image *spider_image = load_image_from_disk(STR("assets/spider.png"), get_heap_allocator()); + assert(spider_image, "Spider image not found D:"); + sprites[SPRITE_spider].image = spider_image; + sprites[SPRITE_spider].size = v2((float32)spider_image->width, (float32)spider_image->height); + + Entity* player = entity_create(); + player_setup(player); + + for (int i = 0; i < 10; i++) { + Entity* spider = entity_create(); + spider_setup(spider); + } + + float64 last_time = os_get_elapsed_seconds(); + while (!window.should_close) { + float64 now_time = os_get_elapsed_seconds(); + float64 delta_time = now_time - last_time; + last_time = now_time; + + draw_frame.projection = m4_make_orthographic_projection(window.width * -0.5, window.width * 0.5, window.height * -0.5, window.height * 0.5, -1, 10); + + float64 zoom = 5.3; + draw_frame.camera_xform = m4_make_scale(v3(1.0/zoom, 1.0/zoom, 1.0)); + + if (is_key_just_pressed('F')) { + window.fullscreen = !window.fullscreen; + } + + if (is_key_just_pressed(KEY_ESCAPE)) { + window.should_close = true; + } + + Vector2 move_axis = v2(0.0, 0.0); + if (is_key_down('W')) { + move_axis.y += 1.0; + } + if (is_key_down('A')) { + move_axis.x -= 1.0; + } + if (is_key_down('S')) { + move_axis.y -= 1.0; + } + if (is_key_down('D')) { + move_axis.x += 1.0; + } + move_axis = v2_normalize(move_axis); + + player->pos = v2_add(player->pos, v2_mulf(move_axis, 30 * delta_time)); + + for (int i = 0; i < MAX_ENTITIES; i++) { + Entity* en = &world->entities[i]; + if (en->alive && en->renderable) { + switch (en->arch) { + default: { + Sprite* sprite = sprite_get(en->sprite_id); + + Matrix4 xform = m4_scalar(1.0); + xform = m4_translate(xform, v3(en->pos.x, en->pos.y, 0)); + xform = m4_translate(xform, v3(sprite->size.x * -0.5, 0, 0)); + draw_image_xform(sprite->image, xform, sprite->size, COLOR_WHITE); + } + } + } + } + + os_update(); + gfx_update(); + + reset_temporary_storage(); + } + + return 0; +} \ No newline at end of file