Making the clickable component works with left and right clicks

This commit is contained in:
AnonymusRaccoon
2020-03-10 15:23:46 +01:00
parent 2521a73936
commit af57877b65
7 changed files with 31 additions and 18 deletions
+1 -1
View File
@@ -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
+4 -1
View File
@@ -7,9 +7,12 @@
#include <stdbool.h>
#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
+1
View File
@@ -11,6 +11,7 @@ typedef struct gc_entity gc_entity;
#include "component.h"
#include "vector2.h"
#include "scene.h"
#include <stdbool.h>
struct gc_entity
+6
View File
@@ -12,4 +12,10 @@ typedef enum gc_keybindings
ESCAPE = sfKeyEscape
} gc_keybindings;
typedef enum gc_mousekeys
{
GC_LEFT,
GC_RIGHT
};
#endif //_KEYBINDINGS_H_
+2 -2
View File
@@ -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);
+17 -14
View File
@@ -11,9 +11,19 @@
#include "components/transform_component.h"
#include "map_interactions.h"
#include <stddef.h>
#include <keybindings.h>
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);
}