RogueLife/src/anim.h

100 lines
2.5 KiB
C

//---
// 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 <stdint.h>
#include "fixed.h"
#include <gint/display.h>
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;