diff options
-rw-r--r-- | bullet.c | 4 | ||||
-rw-r--r-- | world.c | 12 | ||||
-rw-r--r-- | world.h | 3 |
3 files changed, 18 insertions, 1 deletions
@@ -75,6 +75,10 @@ void bullet_system(World* world) { pos->x += bullet->vx; pos->y += bullet->vy; bullet->life--; + + if (bullet->life <= 0) { + destroy_entity(world, i); + } } } } @@ -7,11 +7,21 @@ void init_world(World* world) { Entity new_entity(World* world) { Entity e; - e = world->entity_count++; + e = + world->recycle_bin_count > 0 ? + world->recycle_bin[--world->recycle_bin_count] : + world->entity_count++; + world->bitmask[e] = 0; + return e; } +void destroy_entity(World* world, Entity e) { + world->recycle_bin[world->recycle_bin_count++] = e; + world->bitmask[e] = 0; +} + void add_components(World* world, Entity e, CType bits) { world->bitmask[e] |= bits; } @@ -11,8 +11,10 @@ typedef struct World World; struct World { int entity_count; + int recycle_bin_count; unsigned char bitmask[max_entities]; + Entity recycle_bin[max_entities]; CSprite sprites [max_entities]; CPosition positions [max_entities]; @@ -24,6 +26,7 @@ struct World { void init_world(World* world); Entity new_entity(World* world); +void destroy_entity(World* world, Entity e); void add_components(World* world, Entity e, CType bits); void remove_components(World* world, Entity e, CType bits); |