Implement tag on entities

Internal Changelog:
- Use data store similar to component map
- Add init and free for entities tag
- Use enum instead of char for tag
- Switch to use clang for compilation
- Add -Wall for compilation
scene_man
En Yi 2022-11-26 23:27:45 +08:00
parent f90ef7eee4
commit 4a926f8c53
6 changed files with 33 additions and 14 deletions

View File

@ -1,5 +1,6 @@
set(PROJECT_NAME HATPC_remake)
set(CMAKE_C_COMPILER clang)
set(CMAKE_C_FLAGS "-Wall")
cmake_minimum_required(VERSION 3.22.1)
project(${PROJECT_NAME} C)
set(CMAKE_C_STANDARD 99)

View File

@ -7,6 +7,10 @@ void init_entity_manager(EntityManager_t *p_manager)
{
sc_map_init_64v(p_manager->component_map + i, MAX_COMP_POOL_SIZE, 0);
}
for (size_t i=0; i<N_TAGS; ++i)
{
sc_map_init_64v(p_manager->entities_map + i, MAX_COMP_POOL_SIZE, 0);
}
sc_queue_init(&p_manager->to_add);
sc_queue_init(&p_manager->to_remove);
}
@ -28,6 +32,7 @@ void update_entity_manager(EntityManager_t *p_manager)
{
free_component_to_mempool((ComponentEnum_t)comp_type_idx, comp_idx);
sc_map_del_64v(&p_manager->component_map[comp_type_idx], comp_idx);
sc_map_del_64v(&p_manager->entities_map[p_entity->m_tag], e_idx);
}
free_entity_to_mempool(e_idx);
sc_map_del_64v(&p_manager->entities, e_idx);
@ -35,8 +40,9 @@ void update_entity_manager(EntityManager_t *p_manager)
sc_queue_clear(&p_manager->to_remove);
sc_queue_foreach (&p_manager->to_add, e_idx)
{
Entity_t *ent = get_entity_wtih_id(e_idx);
sc_map_put_64v(&p_manager->entities, e_idx, (void *)ent);
Entity_t *p_entity = get_entity_wtih_id(e_idx);
sc_map_put_64v(&p_manager->entities, e_idx, (void *)p_entity);
sc_map_put_64v(&p_manager->entities_map[p_entity->m_tag], e_idx, (void *)p_entity);
}
sc_queue_clear(&p_manager->to_add);
@ -61,14 +67,19 @@ void free_entity_manager(EntityManager_t *p_manager)
{
sc_map_term_64v(p_manager->component_map + i);
}
for (size_t i=0; i<N_TAGS; ++i)
{
sc_map_term_64v(p_manager->entities_map + i);
}
sc_queue_term(&p_manager->to_add);
sc_queue_term(&p_manager->to_remove);
}
Entity_t *add_entity(EntityManager_t *p_manager, const char *tag)
Entity_t *add_entity(EntityManager_t *p_manager, EntityTag_t tag)
{
unsigned long e_idx = 0;
Entity_t * p_ent = new_entity_from_mempool(&e_idx);
p_ent->m_tag = tag;
if (p_ent)
{
sc_queue_add_last(&p_manager->to_add, e_idx);
@ -78,8 +89,6 @@ Entity_t *add_entity(EntityManager_t *p_manager, const char *tag)
void remove_entity(EntityManager_t *p_manager, unsigned long id)
{
unsigned long comp_type, comp_id;
Entity_t *p_entity = sc_map_get_64v(&p_manager->entities, id);
if(!sc_map_found(&p_manager->entities)) return;
// This only marks the entity for deletion

View File

@ -7,8 +7,9 @@
typedef struct EntityManager
{
// All fields are Read-Only
struct sc_map_64v entities;
struct sc_map_64v component_map[N_COMPONENTS];
struct sc_map_64v entities; // id : entity
struct sc_map_64v entities_map[N_TAGS]; // [{id: ent}]
struct sc_map_64v component_map[N_COMPONENTS]; // [{id: comp}, ...]
struct sc_queue_uint to_add;
struct sc_queue_uint to_remove;
}EntityManager_t;
@ -18,7 +19,7 @@ void update_entity_manager(EntityManager_t *p_manager);
void clear_entity_manager(EntityManager_t *p_manager);
void free_entity_manager(EntityManager_t *p_manager);
Entity_t *add_entity(EntityManager_t *p_manager, const char *tag);
Entity_t *add_entity(EntityManager_t *p_manager, EntityTag_t tag);
void remove_entity(EntityManager_t *p_manager, unsigned long id);
void *add_component(EntityManager_t *p_manager, Entity_t *entity, ComponentEnum_t comp_type);

View File

@ -2,11 +2,19 @@
#define __ENTITY_H
#include <stdbool.h>
#include "sc/map/sc_map.h"
#define MAX_TAG_LEN 32
#define N_TAGS 3
enum EntityTag
{
NO_ENT_TAG,
PLAYER_ENT_TAG,
ENEMY_ENT_TAG,
};
typedef enum EntityTag EntityTag_t;
typedef struct Entity
{
unsigned long m_id;
char m_tag[MAX_TAG_LEN];
EntityTag_t m_tag;
bool m_alive;
struct sc_map_64 components;
}Entity_t;

4
main.c
View File

@ -11,10 +11,10 @@ int main(void)
init_entity_manager(&manager);
puts("Creating two entities");
Entity_t *p_ent = add_entity(&manager, "player");
Entity_t *p_ent = add_entity(&manager, PLAYER_ENT_TAG);
CBBox_t * p_bbox = (CBBox_t *)add_component(&manager, p_ent, CBBOX_COMP_T);
p_bbox->x = 15;
p_ent = add_entity(&manager, "enemy");
p_ent = add_entity(&manager, ENEMY_ENT_TAG);
p_bbox = (CBBox_t *)add_component(&manager, p_ent, CBBOX_COMP_T);
p_bbox->x = 40;
update_entity_manager(&manager);

View File

@ -72,7 +72,7 @@ Entity_t* new_entity_from_mempool(unsigned long *p_e_idx)
Entity_t * ent = entity_mem_pool.entity_buffer + e_idx;
sc_map_clear_64(&ent->components);
ent->m_alive = true;
memset(ent->m_tag, 0, MAX_TAG_LEN);
ent->m_tag = NO_ENT_TAG;
return ent;
}