mirror of
https://github.com/zoriya/Gamacon.git
synced 2026-06-02 03:35:43 +00:00
Making the clickable component works with left and right clicks
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -12,4 +12,10 @@ typedef enum gc_keybindings
|
||||
ESCAPE = sfKeyEscape
|
||||
} gc_keybindings;
|
||||
|
||||
typedef enum gc_mousekeys
|
||||
{
|
||||
GC_LEFT,
|
||||
GC_RIGHT
|
||||
};
|
||||
|
||||
#endif //_KEYBINDINGS_H_
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user