//--- // anim: Renderer's animations // // Animations in this engine are simply linked variants of sprites. Animated // images change over time, moving from frame to frame, and that's it. //--- #pragma once #include #include "fixed.h" #include typedef struct anim_frame { /* Sheet */ bopti_image_t const *sheet; /* Box for the frame within the sheet */ uint8_t x, y, w, h; /* Position of center for this frame */ int8_t cx, cy; /* Duration of the frame (ms) */ uint16_t duration; /* Next frame */ struct anim_frame *next; } anim_frame_t; typedef struct { /* Number of directions 1: Basic sprite 2: LEFT and RIGHT (enemies) 4: UP, RIGHT, DOWN and LEFT (player, some attacks) */ int directions; /* First frame for each direction */ anim_frame_t *start[]; } anim_t; typedef struct { /* Current frame */ anim_frame_t const *frame; /* Time elapsed */ uint16_t elapsed; } anim_state_t; /* Duration of an animation, in seconds; assumed unique for all directions */ fixed_t anim_duration(anim_t const *anim); /* Check if a frame is in an animation. */ bool anim_in(anim_frame_t const *frame, anim_t const *anim, int index); /* Render a frame at the center position (x,y). */ void anim_frame_render(int x, int y, anim_frame_t const *frame); /* Update an animation to next frame. */ void anim_state_update(anim_state_t *state, fixed_t dt); /* List of animations. */ /* Basic skills */ extern anim_t anims_skill_hit; extern anim_t anims_skill_projectile; extern anim_t anims_skill_teleport; extern anim_t anims_skill_shock; extern anim_t anims_skill_judgement; /* Directional skills */ extern anim_t anims_skill_swing; extern anim_t anims_skill_impale; extern anim_t anims_skill_bullet; /* Enemies */ extern anim_t anims_slime_Idle; extern anim_t anims_slime_Walking; extern anim_t anims_slime_Hit; extern anim_t anims_slime_Death; extern anim_t anims_bat_Idle; extern anim_t anims_bat_Hit; extern anim_t anims_bat_Death; extern anim_t anims_gunslinger_Idle; extern anim_t anims_gunslinger_Walking; extern anim_t anims_gunslinger_Reloading; extern anim_t anims_gunslinger_Fire; extern anim_t anims_gunslinger_Hit; extern anim_t anims_gunslinger_Death; extern anim_t anims_fire_slime_Idle; extern anim_t anims_fire_slime_Walking; extern anim_t anims_fire_slime_Hit; extern anim_t anims_fire_slime_Death; /* Player */ extern anim_t anims_player_Idle; extern anim_t anims_player_Walking; extern anim_t anims_player_Attack; extern anim_t anims_player_Hit;