diff --git a/include/components/clickable_component.h b/include/components/clickable_component.h index 6467122..344f282 100644 --- a/include/components/clickable_component.h +++ b/include/components/clickable_component.h @@ -11,7 +11,7 @@ #include "engine.h" #include "component.h" -void clickable_onclick(gc_engine *engine); +void clickable_onclick(gc_engine *engine, va_list list); void clickable_manager_init(gc_engine *engine); struct clickable_component diff --git a/include/engine.h b/include/engine.h index c08c969..2622038 100644 --- a/include/engine.h +++ b/include/engine.h @@ -7,9 +7,12 @@ #include #include "vector2.h" +#include "entity.h" +#include "keybindings.h" typedef struct gc_engine gc_engine; -typedef bool (*callback_t)(gc_engine *engine, int entity_id, gc_vector2 pos); +typedef bool (*callback_t)(gc_engine *engine, gc_entity *entity, \ +gc_vector2 pos, enum gc_mousekeys key); #ifndef ENGINE #define ENGINE diff --git a/include/entity.h b/include/entity.h index 4e7ece3..beb8af2 100644 --- a/include/entity.h +++ b/include/entity.h @@ -11,6 +11,7 @@ typedef struct gc_entity gc_entity; #include "component.h" #include "vector2.h" +#include "scene.h" #include struct gc_entity diff --git a/include/keybindings.h b/include/keybindings.h index 2374f93..91ba434 100644 --- a/include/keybindings.h +++ b/include/keybindings.h @@ -12,4 +12,10 @@ typedef enum gc_keybindings ESCAPE = sfKeyEscape } gc_keybindings; +typedef enum gc_mousekeys +{ + GC_LEFT, + GC_RIGHT +}; + #endif //_KEYBINDINGS_H_ diff --git a/include/components/tile_collision_manager.h b/include/tile_collision_manager.h similarity index 100% rename from include/components/tile_collision_manager.h rename to include/tile_collision_manager.h diff --git a/src/sfml_renderer/sfml_events.c b/src/sfml_renderer/sfml_events.c index 45fd33e..1549e73 100644 --- a/src/sfml_renderer/sfml_events.c +++ b/src/sfml_renderer/sfml_events.c @@ -26,9 +26,9 @@ void sfml_handle_events(gc_engine *engine) break; case sfEvtMouseButtonReleased: if (event.mouseButton.button == sfMouseLeft) - engine->trigger_event(engine, "mouse_left_click"); + engine->trigger_event(engine, "mouse_click", GC_LEFT); if (event.mouseButton.button == sfMouseRight) - engine->trigger_event(engine, "mouse_right_click"); + engine->trigger_event(engine, "mouse_click", GC_RIGHT); break; case sfEvtKeyReleased: engine->trigger_event(engine, "key_pressed", event.key.code); diff --git a/src/systems/clickable_manager.c b/src/systems/clickable_manager.c index 557a626..c497442 100644 --- a/src/systems/clickable_manager.c +++ b/src/systems/clickable_manager.c @@ -11,9 +11,19 @@ #include "components/transform_component.h" #include "map_interactions.h" #include +#include -void clickable_onclick(gc_engine *engine) +static inline bool collide(struct transform_component *tra, gc_vector2 position) { + return (tra->position.x - tra->size.x / 2) <= position.x + && (tra->position.y + tra->size.y / 2) >= position.y + && (tra->position.x + tra->size.x / 2) >= position.x + && (tra->position.y - tra->size.y / 2) <= position.y; +} + +void clickable_onclick(gc_engine *engine, va_list list) +{ + enum gc_mousekeys key = va_arg(list, enum gc_mousekeys); gc_scene *scene = engine->scene; gc_vector2 position = engine->get_cursor_pos(engine); gc_list *entities = NULL; @@ -29,22 +39,15 @@ void clickable_onclick(gc_engine *engine) entities = entities->next; for (gc_list *ent = entities; ent; ent = ent->prev) { tra = GETCMP(((gc_entity *)ent->data), transform_component); - if ((tra->position.x - tra->size.x / 2) <= position.x - && (tra->position.y + tra->size.y / 2) >= position.y - && (tra->position.x + tra->size.x / 2) >= position.x - && (tra->position.y - tra->size.y / 2) <= position.y) { - cl = GETCMP(((gc_entity *)ent->data), clickable_component); - if (!cl->onclick) - continue; - if (cl->onclick(engine, ((gc_entity *)ent->data)->id, position)) - return; - } + if (!collide(tra, position)) + continue; + cl = GETCMP(((gc_entity *)ent->data), clickable_component); + if (cl->onclick && cl->onclick(engine, ent->data, position, key)) + return; } } void clickable_manager_init(struct gc_engine *engine) { - engine->add_event_listener(engine, "mouse_left_click", &clickable_onclick); - engine->add_event_listener(engine, "mouse_right_click", &map_manage_right_click); - engine->add_event_listener(engine, "mouse_left_click", &map_manage_left_click); + engine->add_event_listener(engine, "mouse_click", &clickable_onclick); } \ No newline at end of file