mirror of
https://github.com/zoriya/Gamacon.git
synced 2026-05-28 17:33:08 +00:00
Cleaning up
This commit is contained in:
@@ -68,6 +68,7 @@ SRC = src/engine/engine.c \
|
||||
src/ui/tooltip.c \
|
||||
src/isometry/isometry.c \
|
||||
src/isometry/map_utils.c \
|
||||
src/isometry/tile_collisions.c \
|
||||
src/components/vertex_component.c \
|
||||
src/isometry/vertex_data_loader.c
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ struct renderer
|
||||
enum gc_texturetype type;
|
||||
void *data;
|
||||
bool is_visible;
|
||||
void (*destroy)(struct renderer *);
|
||||
};
|
||||
|
||||
void sprite_ctr(struct renderer *cmp, va_list args);
|
||||
|
||||
@@ -13,9 +13,6 @@
|
||||
#define ANGLE_Y 35
|
||||
#define ADD_VALUE 10
|
||||
|
||||
void move_verticies(gc_engine *engine, struct tile *ret, char mode, bool r);
|
||||
int get_index_nearest_vertex(struct tile *sel, gc_vector2 pos);
|
||||
struct tile *get_tile_from_pos(struct vertex_component *map, gc_vector2 pos);
|
||||
bool map_manage_click(gc_engine *engine, int id, gc_vector2 pos);
|
||||
gc_vector2 gc_vector2_from_coords(float x, float y, float z);
|
||||
bool is_pos_in_tile(gc_vector2 pos, struct tile *tile);
|
||||
@@ -51,3 +51,5 @@ gc_vector2 sfml_engine_get_cursor_pos(gc_engine *engine);
|
||||
void entities_update_to_cam(gc_scene *scene, \
|
||||
struct sfml_renderer_system *renderer);
|
||||
void entities_update_to_cam_size(gc_scene *scene, gc_vector2 size);
|
||||
|
||||
typedef void (*drawer)(gc_engine *, gc_entity *, void *, float);
|
||||
@@ -19,6 +19,7 @@ static void ctr(void *component, va_list args)
|
||||
struct renderer *cmp = (struct renderer *)component;
|
||||
gc_texturetype type = va_arg(args, gc_texturetype);
|
||||
|
||||
cmp->destroy = NULL;
|
||||
cmp->data = NULL;
|
||||
cmp->type = type;
|
||||
cmp->is_visible = true;
|
||||
@@ -48,6 +49,7 @@ static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n)
|
||||
struct renderer *cmp = (struct renderer *)component;
|
||||
gc_texturetype type = renderer_get_type(n);
|
||||
|
||||
cmp->destroy = NULL;
|
||||
cmp->type = type;
|
||||
cmp->is_visible = true;
|
||||
if (type == GC_TEXTUREREND)
|
||||
@@ -65,24 +67,8 @@ static void dtr(void *component)
|
||||
{
|
||||
struct renderer *cmp = (struct renderer *)component;
|
||||
|
||||
switch (cmp->type) {
|
||||
case GC_ANIMREND:
|
||||
for (int i = 0; i < ((gc_animholder *)cmp->data)->animcount; i++) {
|
||||
if (my_strcmp(((gc_animholder *)cmp->data)->anims[i].name, "none"))
|
||||
free(((gc_animholder *)cmp->data)->anims[i].name);
|
||||
}
|
||||
free(((gc_animholder *)cmp->data)->sprite);
|
||||
free(((gc_animholder *)cmp->data)->anims);
|
||||
free(cmp->data);
|
||||
break;
|
||||
case GC_TXTREND:
|
||||
free(((gc_text *)cmp->data)->text);
|
||||
free(cmp->data);
|
||||
break;
|
||||
case GC_TEXTUREREND:
|
||||
free(cmp->data);
|
||||
break;
|
||||
}
|
||||
if (cmp->destroy)
|
||||
cmp->destroy(cmp);
|
||||
}
|
||||
|
||||
static char *serialize(void *component)
|
||||
|
||||
@@ -12,20 +12,15 @@
|
||||
#include "my.h"
|
||||
#include <malloc.h>
|
||||
|
||||
void rend_set_anim(struct renderer *rend, const char *name)
|
||||
void destroy_anim_renderer(struct renderer *cmp)
|
||||
{
|
||||
gc_animholder *holder = (gc_animholder *)rend->data;
|
||||
|
||||
if (holder->current && !my_strcmp(holder->current->name, name))
|
||||
return;
|
||||
for (int i = 0; i < holder->animcount; i++) {
|
||||
if (!my_strcmp(holder->anims[i].name, name)) {
|
||||
holder->current = &holder->anims[i];
|
||||
holder->sprite->rect = holder->anims[i].rect;
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < ((gc_animholder *)cmp->data)->animcount; i++) {
|
||||
if (my_strcmp(((gc_animholder *)cmp->data)->anims[i].name, "none"))
|
||||
free(((gc_animholder *)cmp->data)->anims[i].name);
|
||||
}
|
||||
my_printf("Gamacon: unknown animation %s.\n", name);
|
||||
free(((gc_animholder *)cmp->data)->sprite);
|
||||
free(((gc_animholder *)cmp->data)->anims);
|
||||
free(cmp->data);
|
||||
}
|
||||
|
||||
void anim_ctr(struct renderer *cmp, va_list args)
|
||||
@@ -36,6 +31,7 @@ void anim_ctr(struct renderer *cmp, va_list args)
|
||||
if (!sprite)
|
||||
return;
|
||||
cmp->data = sprite;
|
||||
cmp->destroy = &destroy_anim_renderer;
|
||||
sprite->texture = va_arg(args, sfTexture *);
|
||||
sprite->rect = va_arg(args, gc_int_rect);
|
||||
if (sprite->texture && sprite->rect.height < 0) {
|
||||
@@ -57,13 +53,13 @@ void animation_fdctr(gc_anim *anim, gc_sprite *sprite, node *n)
|
||||
anim->rect.width = sprite->rect.width;
|
||||
anim->rect.top = sprite->rect.top;
|
||||
anim->rect.left = sprite->rect.left;
|
||||
if ((tmp = xml_getfloatprop(rect, "height")) != 0)
|
||||
if ((tmp = xml_getintprop(rect, "height")) != 0)
|
||||
anim->rect.height = tmp;
|
||||
if ((tmp = xml_getfloatprop(rect, "width")) != 0)
|
||||
if ((tmp = xml_getintprop(rect, "width")) != 0)
|
||||
anim->rect.width = tmp;
|
||||
if ((tmp = xml_getfloatprop(rect, "top")) != 0)
|
||||
if ((tmp = xml_getintprop(rect, "top")) != 0)
|
||||
anim->rect.top = tmp;
|
||||
if ((tmp = xml_getfloatprop(rect, "left")) != 0)
|
||||
if ((tmp = xml_getintprop(rect, "left")) != 0)
|
||||
anim->rect.left = tmp;
|
||||
}
|
||||
|
||||
@@ -81,8 +77,7 @@ void anim_fdctr(gc_scene *scene, struct renderer *cmp, node *n)
|
||||
int animcount = xml_getchildcount_filtered(n, "animation") + 1;
|
||||
int i = 1;
|
||||
|
||||
hold->anims = malloc(sizeof(gc_anim) * animcount);
|
||||
if (!hold || !hold->anims)
|
||||
if (!hold || !(hold->anims = malloc(sizeof(gc_anim) * animcount)))
|
||||
return;
|
||||
sprite_fdctr(scene, cmp, n);
|
||||
hold->sprite = (gc_sprite *)cmp->data;
|
||||
@@ -90,6 +85,7 @@ void anim_fdctr(gc_scene *scene, struct renderer *cmp, node *n)
|
||||
hold->animcount = animcount;
|
||||
hold->timesince_up = 0;
|
||||
cmp->data = hold;
|
||||
cmp->destroy = &destroy_anim_renderer;
|
||||
animation_setnone(&hold->anims[0], hold->sprite);
|
||||
for (n = n->child; n; n = n->next) {
|
||||
if (my_strcmp(n->name, "animation"))
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
** EPITECH PROJECT, 2020
|
||||
** my_rpg
|
||||
** File description:
|
||||
** anim_utils.c
|
||||
*/
|
||||
|
||||
#include "sprite.h"
|
||||
#include "my.h"
|
||||
#include "renderer.h"
|
||||
|
||||
void rend_set_anim(struct renderer *rend, const char *name)
|
||||
{
|
||||
gc_animholder *holder = (gc_animholder *)rend->data;
|
||||
|
||||
if (holder->current && !my_strcmp(holder->current->name, name))
|
||||
return;
|
||||
for (int i = 0; i < holder->animcount; i++) {
|
||||
if (!my_strcmp(holder->anims[i].name, name)) {
|
||||
holder->current = &holder->anims[i];
|
||||
holder->sprite->rect = holder->anims[i].rect;
|
||||
return;
|
||||
}
|
||||
}
|
||||
my_printf("Gamacon: unknown animation %s.\n", name);
|
||||
}
|
||||
@@ -22,6 +22,7 @@ void sprite_ctr(struct renderer *cmp, va_list args)
|
||||
if (!sprite)
|
||||
return;
|
||||
cmp->data = sprite;
|
||||
cmp->destroy = (void (*)(struct renderer *))&free;
|
||||
sprite->texture = va_arg(args, sfTexture *);
|
||||
sprite->rect = va_arg(args, gc_int_rect);
|
||||
if (sprite->texture && sprite->rect.height <= 0) {
|
||||
@@ -38,18 +39,19 @@ void sprite_fdctr(gc_scene *scene, struct renderer *cmp, node *n)
|
||||
sfVector2u size;
|
||||
gc_sprite *sprite = malloc(sizeof(gc_sprite));
|
||||
|
||||
cmp->data = sprite;
|
||||
if (!cmp->data)
|
||||
if (!sprite)
|
||||
return;
|
||||
cmp->data = sprite;
|
||||
cmp->destroy = (void (*)(struct renderer *))&free;
|
||||
sprite->texture = get_texture(scene, xml_gettempprop(n, "src"));
|
||||
sprite->rect.height = xml_getfloatprop(rect, "height");
|
||||
sprite->rect.width = xml_getfloatprop(rect, "width");
|
||||
sprite->rect.top = xml_getfloatprop(rect, "top");
|
||||
sprite->rect.left = xml_getfloatprop(rect, "left");
|
||||
sprite->rect.height = xml_getintprop(rect, "height");
|
||||
sprite->rect.width = xml_getintprop(rect, "width");
|
||||
sprite->rect.top = xml_getintprop(rect, "top");
|
||||
sprite->rect.left = xml_getintprop(rect, "left");
|
||||
if (sprite->texture && sprite->rect.height <= 0) {
|
||||
size = sfTexture_getSize(sprite->texture);
|
||||
sprite->rect.height = (float)size.y;
|
||||
sprite->rect.width = (float)size.x;
|
||||
sprite->rect.height = (int)size.y;
|
||||
sprite->rect.width = (int)size.x;
|
||||
}
|
||||
sprite->scale = (gc_vector2){1, 1};
|
||||
}
|
||||
|
||||
@@ -14,6 +14,12 @@
|
||||
#include <malloc.h>
|
||||
#include <SFML/Graphics.h>
|
||||
|
||||
void destroy_text_renderer(struct renderer *cmp)
|
||||
{
|
||||
free(((gc_text *)cmp->data)->text);
|
||||
free(cmp->data);
|
||||
}
|
||||
|
||||
int color_from_text(char *txt)
|
||||
{
|
||||
if (txt == NULL)
|
||||
@@ -32,6 +38,7 @@ void text_ctr(struct renderer *cmp, va_list args)
|
||||
if (!gctext)
|
||||
return;
|
||||
cmp->data = gctext;
|
||||
cmp->destroy = &destroy_text_renderer;
|
||||
gctext->text = va_arg(args, char *);
|
||||
gctext->font = va_arg(args, sfFont *);
|
||||
gctext->size = va_arg(args, int);
|
||||
@@ -52,6 +59,7 @@ void text_fdctr(gc_scene *scene, struct renderer *cmp, node *n)
|
||||
gctext->text = xml_getproperty(n, "text");
|
||||
if (!gctext->text)
|
||||
return;
|
||||
cmp->destroy = &destroy_text_renderer;
|
||||
gctext->font = scene->get_data(scene, "font", xml_getproperty(n, "src"));
|
||||
gctext->size = 30;
|
||||
gctext->color = *(int *)&sfWhite;
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
** EPITECH PROJECT, 2020
|
||||
** Gamacon
|
||||
** File description:
|
||||
** tile collision_managment
|
||||
*/
|
||||
|
||||
#include "tile_collision_manager.h"
|
||||
#include "map_utils.h"
|
||||
#include <math.h>
|
||||
|
||||
#define INF 10000
|
||||
|
||||
bool is_on_segment(gc_vector2 p, gc_vector2 q, gc_vector2 r)
|
||||
{
|
||||
if (q.x <= fmaxf(p.x, r.x) && q.x >= fminf(p.x, r.x) && \
|
||||
q.y <= fmaxf(p.y, r.y) && q.y >= fminf(p.y, r.y))
|
||||
return (true);
|
||||
return (false);
|
||||
}
|
||||
|
||||
int orientation(gc_vector2 p, gc_vector2 q, gc_vector2 r)
|
||||
{
|
||||
int tmp = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
|
||||
|
||||
if (tmp == 0)
|
||||
return (0);
|
||||
return ((tmp > 0) ? 1 : 2);
|
||||
}
|
||||
|
||||
bool gc_vector2_do_intersect(gc_vector2 p1, gc_vector2 q1, \
|
||||
gc_vector2 p2, gc_vector2 q2)
|
||||
{
|
||||
int o1 = orientation(p1, q1, p2);
|
||||
int o2 = orientation(p1, q1, q2);
|
||||
int o3 = orientation(p2, q2, p1);
|
||||
int o4 = orientation(p2, q2, q1);
|
||||
|
||||
if (o1 != o2 && o3 != o4)
|
||||
return (true);
|
||||
if (o1 == 0 && is_on_segment(p1, p2, q1))
|
||||
return (true);
|
||||
if (o2 == 0 && is_on_segment(p1, q2, q1))
|
||||
return (true);
|
||||
if (o3 == 0 && is_on_segment(p2, p1, q2))
|
||||
return (true);
|
||||
if (o4 == 0 && is_on_segment(p2, q1, q2))
|
||||
return (true);
|
||||
return (false);
|
||||
}
|
||||
|
||||
bool is_point_in_polygon(gc_vector2 *polygon, int n, gc_vector2 p)
|
||||
{
|
||||
gc_vector2 segment = {-INF, p.y};
|
||||
int count = 0;
|
||||
int next = 0;
|
||||
int i = 0;
|
||||
|
||||
if (n < 3)
|
||||
return (false);
|
||||
do {
|
||||
next = (i + 1) % n;
|
||||
if (gc_vector2_do_intersect(polygon[i], polygon[next], p, segment)) {
|
||||
if (orientation(polygon[i], p, polygon[next]) == 0)
|
||||
return (is_on_segment(polygon[i], p, polygon[next]));
|
||||
count++;
|
||||
}
|
||||
i = next;
|
||||
} while (i != 0);
|
||||
return (count & 1);
|
||||
}
|
||||
|
||||
bool is_pos_in_tile(gc_vector2 pos, struct tile *tile)
|
||||
{
|
||||
struct vertex **c = tile->corners;
|
||||
gc_vector2 corners[4];
|
||||
|
||||
pos.y *= -1;
|
||||
for (int i = 0; i < 4; i++)
|
||||
corners[i] = gc_vector2_from_coords(c[i]->x, c[i]->y, c[i]->z);
|
||||
return (is_point_in_polygon(corners, 4, pos));
|
||||
}
|
||||
@@ -11,29 +11,38 @@
|
||||
#include "sfml_renderer.h"
|
||||
#include "systems/sfml_renderer_system.h"
|
||||
|
||||
void sfml_handle_events(gc_engine *engine)
|
||||
void sfml_handle_event(gc_engine *eng, sfEvent e)
|
||||
{
|
||||
struct sfml_renderer_system *rend = GETSYS(engine, sfml_renderer_system);
|
||||
sfEvent event;
|
||||
|
||||
while (sfRenderWindow_pollEvent(rend->window, &event))
|
||||
switch (event.type) {
|
||||
case sfEvtClosed:
|
||||
sfRenderWindow_close(rend->window);
|
||||
break;
|
||||
switch (e.type) {
|
||||
case sfEvtResized:
|
||||
engine->on_resize(engine, (gc_vector2){event.size.width, \
|
||||
event.size.height});
|
||||
eng->on_resize(eng, (gc_vector2){e.size.width, e.size.height});
|
||||
break;
|
||||
case sfEvtMouseButtonReleased:
|
||||
if (event.mouseButton.button == sfMouseLeft)
|
||||
engine->trigger_event(engine, "mouse_click", GC_LEFT);
|
||||
if (event.mouseButton.button == sfMouseRight)
|
||||
engine->trigger_event(engine, "mouse_click", GC_RIGHT);
|
||||
if (e.mouseButton.button == sfMouseLeft)
|
||||
eng->trigger_event(eng, "mouse_click", GC_LEFT);
|
||||
if (e.mouseButton.button == sfMouseRight)
|
||||
eng->trigger_event(eng, "mouse_click", GC_RIGHT);
|
||||
break;
|
||||
case sfEvtKeyReleased:
|
||||
engine->trigger_event(engine, "key_pressed", event.key.code);
|
||||
eng->trigger_event(eng, "key_pressed", e.key.code);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sfml_handle_events(gc_engine *eng)
|
||||
{
|
||||
struct sfml_renderer_system *rend = GETSYS(eng, sfml_renderer_system);
|
||||
sfEvent e;
|
||||
|
||||
while (sfRenderWindow_pollEvent(rend->window, &e)) {
|
||||
if (e.type == sfEvtClosed) {
|
||||
sfRenderWindow_close(rend->window);
|
||||
continue;
|
||||
}
|
||||
sfml_handle_event(eng, e);
|
||||
}
|
||||
}
|
||||
|
||||
gc_vector2 sfml_engine_get_cursor_pos(gc_engine *engine)
|
||||
|
||||
@@ -27,11 +27,11 @@ gc_vector2 sfml_get_text_size(sf_renderer *this, gc_text *text)
|
||||
return (gc_vector2) {bounds.width * 1.3, bounds.height * 2.5};
|
||||
}
|
||||
|
||||
static void (* const drawers[])(gc_engine *, gc_entity *, void *, float) = {
|
||||
&sfmlrenderer_draw_texture,
|
||||
&sfmlrenderer_draw_anim,
|
||||
&sfmlrenderer_draw_txt,
|
||||
&sfmlrenderer_draw_tilemap,
|
||||
static drawer drawers[] = {
|
||||
(drawer)&sfmlrenderer_draw_texture,
|
||||
(drawer)&sfmlrenderer_draw_anim,
|
||||
(drawer)&sfmlrenderer_draw_txt,
|
||||
(drawer)&sfmlrenderer_draw_tilemap,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user