Entity no longer stores sprite_id, sprite_get_id_from_arch()
This commit is contained in:
parent
702a64d0e3
commit
cf888244fe
3 changed files with 37 additions and 11 deletions
1
entity.c
1
entity.c
|
@ -21,7 +21,6 @@ typedef struct Entity {
|
|||
bool renderable;
|
||||
Entity_Archetype arch;
|
||||
Vector2 pos;
|
||||
Sprite_ID sprite_id;
|
||||
bool is_animate;
|
||||
float32 health, damage;
|
||||
Vector2 hitbox[4];
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
#include "util.c"
|
||||
#include "sprite.c"
|
||||
#include "entity.c"
|
||||
#include "sprite.c"
|
||||
#include "gjk.c"
|
||||
|
||||
void player_setup(Entity* en) {
|
||||
en->arch = ARCH_player;
|
||||
en->sprite_id = SPRITE_player;
|
||||
en->renderable = true;
|
||||
en->is_animate = true;
|
||||
en->health = 100;
|
||||
|
@ -13,7 +12,6 @@ void player_setup(Entity* en) {
|
|||
|
||||
void spider_setup(Entity* en) {
|
||||
en->arch = ARCH_spider;
|
||||
en->sprite_id = SPRITE_spider;
|
||||
en->renderable = true;
|
||||
en->is_animate = true;
|
||||
en->health = 30;
|
||||
|
@ -30,7 +28,6 @@ void weapon_setup(Entity* en, Entity_Archetype weapon_type) {
|
|||
en->is_weapon = true;
|
||||
switch (weapon_type) {
|
||||
case ARCH_startersword: {
|
||||
en->sprite_id = SPRITE_startersword;
|
||||
en->weapon_class = WEAPON_melee;
|
||||
en->damage = 10;
|
||||
en->hitbox[0] = v2(0, 0);
|
||||
|
@ -41,7 +38,6 @@ void weapon_setup(Entity* en, Entity_Archetype weapon_type) {
|
|||
} break;
|
||||
|
||||
case ARCH_starterbow: {
|
||||
en->sprite_id = SPRITE_starterbow;
|
||||
en->weapon_class = WEAPON_ranged;
|
||||
en->damage = 5;
|
||||
en->weapon_speed = 3;
|
||||
|
@ -55,9 +51,9 @@ void weapon_setup(Entity* en, Entity_Archetype weapon_type) {
|
|||
|
||||
void arrow_setup(Entity* en, Vector2 start_pos, Vector2 fire_dir, float32 base_dmg) {
|
||||
en->arch = ARCH_arrow;
|
||||
en->sprite_id = SPRITE_arrow;
|
||||
en->renderable = true;
|
||||
en->is_projectile = true;
|
||||
en->is_animate = false; // idk why this was on in the first place?
|
||||
en->projectile_range = 200;
|
||||
en->projectile_fire_dir = fire_dir;
|
||||
en->projectile_start_pos = start_pos;
|
||||
|
@ -170,11 +166,22 @@ int entry(int argc, char **argv) {
|
|||
if (en->is_animate && en->health <= 0) {
|
||||
en->alive = false;
|
||||
}
|
||||
|
||||
// TODO Finish dis
|
||||
// if (en->is_item && is_key_just_pressed('C')) {
|
||||
// Vector2* player_hitbox = entity_resolve_hitbox(player);
|
||||
// Vector2* item_hitbox = entity_resolve_hitbox(en);
|
||||
|
||||
// if (gjk(player_hitbox, 4, item_hitbox, 4)) {
|
||||
// entity_destroy(en);
|
||||
// }
|
||||
// }
|
||||
|
||||
if (en->is_weapon) {
|
||||
en->weapon_cooldown_secs -= 1.0 * delta_time; // decreases by 1 every second
|
||||
if (is_key_just_pressed('Z') && en->weapon_cooldown_secs <= 0) {
|
||||
en->weapon_cooldown_secs = 1 / (en->weapon_speed);
|
||||
|
||||
switch (en->weapon_class) {
|
||||
case WEAPON_melee: {
|
||||
Vector2* hitbox = entity_resolve_hitbox(en);
|
||||
|
@ -199,6 +206,7 @@ int entry(int argc, char **argv) {
|
|||
}
|
||||
|
||||
if (en->is_projectile) {
|
||||
en->pos = v2_add(en->pos, v2_mulf(en->projectile_fire_dir, en->projectile_speed * 50.0 * delta_time));
|
||||
if (en->pos.x < en->projectile_start_pos.x + en->projectile_range &&
|
||||
en->pos.y < en->projectile_start_pos.y + en->projectile_range) {
|
||||
Vector2* hitbox = entity_resolve_hitbox(en);
|
||||
|
@ -211,18 +219,16 @@ int entry(int argc, char **argv) {
|
|||
}
|
||||
}
|
||||
|
||||
en->pos = v2_add(en->pos, v2_mulf(en->projectile_fire_dir, en->projectile_speed * 50.0 * delta_time));
|
||||
} else {
|
||||
entity_destroy(en);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// :rendering
|
||||
// TODO add a layer system, so that you place render instructions anywhere
|
||||
// :entity rendering
|
||||
for (Entity* en = 0; entity_increment(&en);) {
|
||||
if (en->alive && en->renderable) {
|
||||
Sprite* sprite = sprite_get(en->sprite_id);
|
||||
Sprite* sprite = sprite_get(sprite_get_id_from_arch(en->arch));
|
||||
Matrix4 xform = m4_scalar(1.0);
|
||||
|
||||
if (en->is_projectile) {
|
||||
|
@ -251,6 +257,13 @@ int entry(int argc, char **argv) {
|
|||
draw_image_xform(sprite->image, xform, sprite->size, COLOR_WHITE);
|
||||
}
|
||||
}
|
||||
|
||||
// :ui rendering
|
||||
{
|
||||
// TODO Set projection
|
||||
// TODO Weapon Slots
|
||||
// TODO Health Bar
|
||||
}
|
||||
|
||||
os_update();
|
||||
gfx_update();
|
||||
|
|
14
sprite.c
14
sprite.c
|
@ -4,6 +4,7 @@ typedef struct Sprite {
|
|||
} Sprite;
|
||||
|
||||
typedef enum Sprite_ID {
|
||||
SPRITE_nil,
|
||||
SPRITE_player,
|
||||
SPRITE_spider,
|
||||
SPRITE_mutant,
|
||||
|
@ -27,4 +28,17 @@ Sprite* sprite_get(Sprite_ID id) {
|
|||
return &sprites[id];
|
||||
}
|
||||
return &sprites[0];
|
||||
}
|
||||
|
||||
Sprite_ID sprite_get_id_from_arch(Entity_Archetype arch) {
|
||||
switch (arch) {
|
||||
case ARCH_player: return SPRITE_player; break;
|
||||
case ARCH_spider: return SPRITE_spider ; break;
|
||||
case ARCH_mutant: return SPRITE_mutant ; break;
|
||||
case ARCH_tree: return SPRITE_tree ; break;
|
||||
case ARCH_startersword: return SPRITE_startersword ; break;
|
||||
case ARCH_starterbow: return SPRITE_starterbow ; break;
|
||||
case ARCH_arrow: return SPRITE_arrow ; break;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
Reference in a new issue