diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8ad3578..89c3e71 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -324,7 +324,7 @@ add_executable(my_rpg
src/npc/mage.c
src/combat/boss.c
src/components/combat_holder.c
- src/systems/combat_utility.c)
+ src/systems/combat_utility.c src/systems/particule_methods.c)
add_compile_options(-W -Wall -Wextra -Wshadow)
diff --git a/Makefile b/Makefile
index c0ffd14..459fc3d 100644
--- a/Makefile
+++ b/Makefile
@@ -50,7 +50,8 @@ SRC = src/main.c \
src/combat/boss.c \
src/components/particule_component.c \
src/systems/particule_system.c \
- src/systems/combat_utility.c
+ src/systems/combat_utility.c \
+ src/systems/particule_methods.c
OBJ = $(SRC:%.c=%.o)
diff --git a/assets/sprites/items/firecamp.png b/assets/sprites/items/firecamp.png
new file mode 100644
index 0000000..6839a30
Binary files /dev/null and b/assets/sprites/items/firecamp.png differ
diff --git a/assets/sprites/items/smoke_particule.png b/assets/sprites/items/smoke_particule.png
new file mode 100644
index 0000000..799da2a
Binary files /dev/null and b/assets/sprites/items/smoke_particule.png differ
diff --git a/include/systems/particule_system.h b/include/systems/particule_system.h
index 6271898..8480ba3 100644
--- a/include/systems/particule_system.h
+++ b/include/systems/particule_system.h
@@ -15,6 +15,9 @@ void particule_update_entity(gc_engine *engine, void *system, \
gc_entity *entity, float dt);
void create_particule(struct particule *particule, int lifetime, \
void *texture, gc_vector2 pos);
+void create_particule(struct particule *particule, int lifetime, \
+void *texture, gc_vector2 pos);
+void particule_draw(gc_engine *engine, gc_entity *entity, float dt);
extern const struct gc_system particule_system;
diff --git a/prefabs/game.gcprefab b/prefabs/game.gcprefab
index 6595355..bd78363 100644
--- a/prefabs/game.gcprefab
+++ b/prefabs/game.gcprefab
@@ -122,6 +122,8 @@
+
+
@@ -229,6 +231,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/prefabs/player.gcprefab b/prefabs/player.gcprefab
index 4b39c27..f0f7e3d 100644
--- a/prefabs/player.gcprefab
+++ b/prefabs/player.gcprefab
@@ -39,6 +39,6 @@
-
+
diff --git a/src/systems/particule_methods.c b/src/systems/particule_methods.c
new file mode 100644
index 0000000..d6e4ad5
--- /dev/null
+++ b/src/systems/particule_methods.c
@@ -0,0 +1,46 @@
+/*
+** EPITECH PROJECT, 2019
+** MUL_my_runner_2019
+** File description:
+** particule_system
+*/
+
+#include "engine.h"
+#include "sprite.h"
+#include "sfml_renderer.h"
+#include "components/particule_component.h"
+#include
+
+void create_particule(struct particule *particule, int lifetime, \
+void *texture, gc_vector2 pos)
+{
+ if (!particule || !particule->sprite)
+ return;
+ pos.x += (rand() % 2) ? rand() % 20 : (rand() % 20) * -1;
+ pos.y += (rand() % 2) ? rand() % 20 : (rand() % 20) * -1;
+ particule->lifetime = lifetime;
+ particule->sprite->texture = texture;
+ particule->sprite->pos = (gc_vector2){pos.x, pos.y};
+ particule->sprite->rect = (gc_int_rect){16, 16,0,0};
+ particule->sprite->scale = (gc_vector2){0.1, 0.1};
+}
+
+void particule_draw(gc_engine *engine, gc_entity *entity, float dt)
+{
+ struct particule_component *pm = GETCMP(entity, particule_component);
+ struct transform_component *tc = GETCMP(entity, transform_component);
+ gc_vector2 player_pos;
+
+ if (!pm || !entity || !tc)
+ return;
+ player_pos = tc->position;
+ for (int i = 0; i < pm->nb_max_particules; i++) {
+ if (!pm->particules[i].sprite || !pm->particules[i].sprite->texture)
+ continue;
+ if (!pm->particules[i].lifetime)
+ continue;
+ tc->position = pm->particules[i].sprite->pos;
+ sfmlrenderer_draw_texture(engine, entity, pm->particules[i].sprite, dt);
+ }
+ tc->position = player_pos;
+}
\ No newline at end of file
diff --git a/src/systems/particule_system.c b/src/systems/particule_system.c
index ba02342..a4e0e40 100644
--- a/src/systems/particule_system.c
+++ b/src/systems/particule_system.c
@@ -7,67 +7,80 @@
#include "engine.h"
#include "sprite.h"
-#include "systems/sfml_renderer_system.h"
#include "sfml_renderer.h"
+#include "components/controllable_component.h"
#include "components/particule_component.h"
#include "components/map_linker.h"
+#include "systems/particule_system.h"
#include "system.h"
+#include
-void create_particule(struct particule *particule, int lifetime, \
-void *texture, gc_vector2 pos)
+void update_entity_type_one(gc_engine *engine, gc_entity *entity, \
+struct particule_component *cmp, float dtime)
{
- if (!particule || !particule->sprite)
+ struct map_linker *ml = GETCMP(entity, map_linker);
+ struct transform_component *tc = GETCMP(entity, transform_component);
+ struct controllable_component *cc = GETCMP(entity, controllable_component);
+
+ if (!ml || !tc || !cmp || !cc)
return;
- particule->lifetime = lifetime;
- particule->sprite->texture = texture;
- particule->sprite->pos = pos;
- particule->sprite->rect = (gc_int_rect){16, 16,0,0};
- particule->sprite->scale = (gc_vector2){0.2, 0.2};
+ for (int i = 0; i < cmp->nb_max_particules; i++) {
+ cmp->particules[i].lifetime -= (cmp->particules[i].lifetime) ? 1 : 0;
+ if (!cmp->particules[i].lifetime && \
+(cc->movement_x || cc->movement_y) && \
+(!i || cmp->particules[i - 1].lifetime == cmp->lifetime - 20)) {
+ create_particule(&cmp->particules[i], cmp->lifetime, \
+cmp->texture, tc->position);
+ }
+ }
+ particule_draw(engine, entity, dtime);
}
-void particule_draw(gc_engine *engine, gc_entity *entity, float dt)
+void update_entity_type_two(gc_engine *engine, gc_entity *entity, \
+struct particule_component *cmp, float dtime)
{
- struct particule_component *pm = GETCMP(entity, particule_component);
+ struct map_linker *ml = GETCMP(entity, map_linker);
struct transform_component *tc = GETCMP(entity, transform_component);
- gc_vector2 player_pos;
+ gc_vector2 sprite_pos;
- if (!pm || !entity || !tc)
+ if (!ml || !tc || !cmp || !cmp->particules || !cmp->particules[0].sprite)
return;
- player_pos = tc->position;
- for (int i = 0; i < pm->nb_max_particules; i++) {
- if (!pm->particules[i].sprite || !pm->particules[i].sprite->texture)
- continue;
- tc->position = pm->particules[i].sprite->pos;
- sfmlrenderer_draw_texture(engine, entity, pm->particules[i].sprite, dt);
+ sprite_pos = (gc_vector2){tc->position.x, tc->position.y + 50};
+ for (int i = 0; i < cmp->nb_max_particules; i++) {
+ cmp->particules[i].lifetime -= (cmp->particules[i].lifetime) ? 1 : 0;
+ cmp->particules[i].sprite->pos.y += 1;
+ if (!cmp->particules[i].lifetime && \
+(!i || cmp->particules[i - 1].lifetime == cmp->lifetime - 20)) {
+ create_particule(&cmp->particules[i], cmp->lifetime, \
+cmp->texture, sprite_pos);
+ }
}
- tc->position = player_pos;
+ particule_draw(engine, entity, dtime);
}
static void update_entity(gc_engine *engine, va_list args)
{
gc_entity *entity = va_arg(args, gc_entity *);
float dtime = va_arg(args, double);
- struct map_linker *ml = GETCMP(entity, map_linker);
struct particule_component *cmp = GETCMP(entity, particule_component);
- struct transform_component *tc = GETCMP(entity, transform_component);
- if (!ml || !tc || !cmp)
+ if (!cmp)
return;
- //ml->tile->texture
- for (int i = 0; i < cmp->nb_max_particules; i++) {
- cmp->particules[i].lifetime -= (cmp->particules[i].lifetime) ? 1 : 0;
- if (!cmp->particules[i].lifetime) {
- create_particule(&cmp->particules[i], cmp->lifetime, cmp->texture, tc->position);
- }
+ switch (cmp->type) {
+ case 1:
+ return (update_entity_type_one(engine, entity, cmp, dtime));
+ case 2:
+ return (update_entity_type_two(engine, entity, cmp, dtime));
+ default:
+ break;
}
- particule_draw(engine, entity, dtime);
}
void ctr(void *system, va_list args)
{
gc_engine *engine = va_arg(args, gc_engine *);
- engine->add_event_listener(engine, "linked_entity_draw",&update_entity);
+ engine->add_event_listener(engine, "linked_entity_draw", &update_entity);
}
const struct gc_system particule_system = {