aboutsummaryrefslogtreecommitdiff
path: root/src/engine
diff options
context:
space:
mode:
authorUnavailableDev <ggwildplay@gmail.com>2023-03-24 20:20:44 +0100
committerUnavailableDev <ggwildplay@gmail.com>2023-03-24 20:20:44 +0100
commitba830f93a15299fd578b00969eff3c403456950c (patch)
treedced71397e2f51f82b9c2c6e9c677a135f048091 /src/engine
parent810d05156a99dd0a1c6ae14d67685f63460ef621 (diff)
added first pass on animation systems
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/animator.c27
-rw-r--r--src/engine/animator.h15
-rw-r--r--src/engine/entity.c10
-rw-r--r--src/engine/entity.h46
-rw-r--r--src/engine/types.h42
5 files changed, 95 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;