diff options
author | UnavailableDev <ggwildplay@gmail.com> | 2023-03-24 20:20:44 +0100 |
---|---|---|
committer | UnavailableDev <ggwildplay@gmail.com> | 2023-03-24 20:20:44 +0100 |
commit | ba830f93a15299fd578b00969eff3c403456950c (patch) | |
tree | dced71397e2f51f82b9c2c6e9c677a135f048091 | |
parent | 810d05156a99dd0a1c6ae14d67685f63460ef621 (diff) |
added first pass on animation systems
-rw-r--r-- | src/engine/animator.c | 27 | ||||
-rw-r--r-- | src/engine/animator.h | 15 | ||||
-rw-r--r-- | src/engine/entity.c | 10 | ||||
-rw-r--r-- | src/engine/entity.h | 46 | ||||
-rw-r--r-- | src/engine/types.h | 42 | ||||
-rw-r--r-- | src/makefile | 1 |
6 files changed, 96 insertions, 45 deletions
diff --git a/src/engine/animator.c b/src/engine/animator.c new file mode 100644 index 0000000..887493c --- /dev/null +++ b/src/engine/animator.c @@ -0,0 +1,27 @@ +#include "engine/animator.h" +#include "engine/entity.h" +#include "engine/maths.h" + + +#define hh_white_palette 6 + +void hh_animate_hit(hh_s_rendering* in, bool hit) { + if (hit) { + in->fam.palette_index = hh_white_palette; + } else { + in->fam.palette_index = in->palette; + } +} + +void hh_animate(hh_s_rendering* in, hh_idx_t start, hh_idx_t end, uint8_t step) { + if (in->fam.palette_index >= start && in->fam.palette_index < end) { + in->fam.palette_index += step; + } else {// rollover + in->fam.palette_index = start; + } +} + +void hh_update_sprite(hh_entity* in) { + hh_animate_hit(&in->render, in->is_hit); + +} diff --git a/src/engine/animator.h b/src/engine/animator.h new file mode 100644 index 0000000..3b015a6 --- /dev/null +++ b/src/engine/animator.h @@ -0,0 +1,15 @@ +#pragma once +#include <stdint.h> + +#include "ppu/types.h" +#include "engine/types.h" +#include "engine/entity.h" + +/** @brief flashes sprite white, also needs to be called next frame */ +void hh_animate_hit(hh_s_rendering*, bool hit); +/** @brief updates current animation frame */ +void hh_animate(hh_s_rendering*, hh_idx_t start, hh_idx_t end, uint8_t step); + +/** @brief passively updates sprite*/ +void hh_update_sprite(hh_entity* in); + diff --git a/src/engine/entity.c b/src/engine/entity.c index 535759d..b374f8c 100644 --- a/src/engine/entity.c +++ b/src/engine/entity.c @@ -45,7 +45,7 @@ void hh_solve_collision(vec2 pos_environment, hh_entity* entity){ } hh_entity hh_background_collision (hh_entity temp_old_entity,hh_entity temp_new_entity){ - temp_old_entity.is_grounded = false; + temp_new_entity.is_grounded = false; // solves x collision if (temp_old_entity.vel.x <= 0) { @@ -74,11 +74,13 @@ hh_entity hh_background_collision (hh_entity temp_old_entity,hh_entity temp_new_ hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + 15, .y=temp_new_entity.pos.y + 15}))) { temp_new_entity.pos.y = temp_new_entity.pos.y & ~15, temp_new_entity.vel.y = 0; - temp_old_entity.is_grounded = true; + temp_new_entity.is_grounded = true; } } - temp_old_entity.pos = temp_new_entity.pos; - temp_old_entity.vel = temp_new_entity.vel; + temp_old_entity = temp_new_entity; + // temp_old_entity.is_grounded = temp_new_entity.is_grounded; + // temp_old_entity.pos = temp_new_entity.pos; + // temp_old_entity.vel = temp_new_entity.vel; return temp_old_entity; } diff --git a/src/engine/entity.h b/src/engine/entity.h index cad6ba4..43fd5dd 100644 --- a/src/engine/entity.h +++ b/src/engine/entity.h @@ -5,47 +5,11 @@ #include <stdio.h> #include "ppu/types.h" - #include "engine/maths.h" +#include "engine/types.h" +#include "engine/animator.h" -typedef uint8_t hh_idx_t; - -typedef enum { - fire, ice, poison -}hh_e_damage_t; - -typedef struct { - hh_s_ppu_loc_fam_entry fam; //screen - hh_idx_t frame0; - hh_idx_t palette; - -}hh_s_rendering; - -typedef struct { - int8_t hp; - int8_t dmg; - hh_e_damage_t dmg_type; - int8_t speed_x, speed_y; - -} hh_s_atributes; - - -typedef struct { - vec2 pos, vel, vec; - bool is_grounded; - bool is_hit; - uint8_t radius; - int8_t hp; - int8_t speed; - hh_s_rendering render; - //armor/block? -}hh_entity; - -typedef struct { - hh_entity p; - hh_s_atributes atr; -}hh_s_player; - +// TODO: make a sprite update function (and required data structs?) /// @brief detect for collision enity and eviroment /// @param pos1 position of environment tile to be checked @@ -63,7 +27,7 @@ void hh_solve_collision(vec2 pos_environment, hh_entity* entity); /// @param temp_old_entity old data of entity /// @param temp_new_entity new data of entity where it wants to go to /// @return updated new entity where it actually can go to -hh_entity hh_background_collision (hh_entity temp_old_entity, hh_entity temp_new_entity); +hh_entity hh_background_collision(hh_entity temp_old_entity, hh_entity temp_new_entity); /// @brief solve collision of player with enemy /// @param temp_player data of player @@ -77,6 +41,6 @@ hh_entity hh_enemy_collision(hh_entity temp_player, hh_entity temp_enemy); /// @param radius_1 radius of first object (entity) /// @param radius_2 radius of second object (entity) /// @return true if objects collids -bool hh_distance_circles (vec2 object_1, vec2 object_2, int radius_1, int radius_2); +bool hh_distance_circles(vec2 object_1, vec2 object_2, int radius_1, int radius_2); diff --git a/src/engine/types.h b/src/engine/types.h new file mode 100644 index 0000000..241d706 --- /dev/null +++ b/src/engine/types.h @@ -0,0 +1,42 @@ +#pragma once + +#include "engine/maths.h" + +typedef uint8_t hh_idx_t; + +typedef enum { + fire, ice, poison +}hh_e_damage_t; + + +typedef struct { + int8_t hp; + int8_t dmg; + hh_e_damage_t dmg_type; + int8_t speed_x, speed_y; + +} hh_s_atributes; + + +typedef struct { + hh_s_ppu_loc_fam_entry fam; //screen + hh_idx_t frame0; + hh_idx_t palette; + +}hh_s_rendering; + +typedef struct { + vec2 pos, vel, size; + bool is_grounded; + bool is_hit; + uint8_t radius; + int8_t hp; + int8_t speed; + hh_s_rendering render; + +}hh_entity; + +typedef struct { + hh_entity p; + hh_s_atributes atr; +}hh_s_player; diff --git a/src/makefile b/src/makefile index cd248e2..aac3856 100644 --- a/src/makefile +++ b/src/makefile @@ -40,6 +40,7 @@ LOCAL_SRCS += main.c \ engine/entity.c \ engine/bullet.c \ engine/title_screen.c \ + engine/animator.c \ GameLoop/shop.c \ GameLoop/startingScreen.c |