ReC98/th01/main/player/anim.hpp

72 lines
2.3 KiB
C++
Raw Normal View History

static const int PLAYER_ANIM_IMAGES_PER_SLOT = 32;
struct player_anim_images_t {
dots8_t *img[PLAYER_ANIM_IMAGES_PER_SLOT];
dots8_t*& operator [](int image) {
return img[image];
}
const dots8_t* operator [](int image) const{
return img[image];
}
};
// Collection of up to [PLAYER_ANIM_IMAGES_PER_SLOT] player animation sprites
// from a .BOS file, with a consistent byte-aligned / 8w×h size. Used for
// sprites with a width ≠ [PTN_W] or a height ≠ [PTN_H].
class CPlayerAnim {
dots8_t *alpha[PLAYER_ANIM_IMAGES_PER_SLOT];
Planar<player_anim_images_t> planes;
vram_byte_amount_t vram_w;
pixel_t h;
int bos_image_count;
// Loads all images from the .BOS file with the given [fn] inside the
// currently active packfile. Always returns 0.
int load(const char fn[PF_FN_LEN]);
// Frees all [bos_image_count] loaded images.
void free(void);
/// Blitting
/// --------
// All of these clip the sprite at the top and bottom edges of VRAM. Like
// CBossEntity and CBossAnim, they also make an attempt at clipping on the
// left and right edges, but that only really works if [left] is a
// multiple of 16 and inside the [-RES_X, RES_X[ range, and is pretty much
// broken otherwise.
// Precisely restores pixels according to the alpha mask of [image] from
// VRAM page 1, starting at (⌊left/8⌋*8, top).
void unput_8(screen_x_t left, vram_y_t top, int image) const;
// Blits [image] to (⌊left/8⌋*8, top) on VRAM page 0.
void put_0_8(screen_x_t left, vram_y_t top, int image) const;
// Blits [put_image] to
// (⌊ put_left/8⌋*8, put_top)
// on VRAM page 0, after attempting to restore the pixels of [unput_image]
// starting at
// (⌊unput_left/8⌋*8, unput_top),
// that wouldn't be overlapped by the subsequent [put_image] blit, from
// VRAM page 1.
//
// Only unblits correctly if |⌊put_left/8⌋*8 - ⌊unput_left/8⌋*8| ≤ 1,
// though, and spends a lot of CPU time in optimizing the dot patterns for
// unblitting. Calling unput_8() and put_0_8() separately might therefore
// be just as fast.
void unput_and_put_overlapped_8(
screen_x_t put_left,
vram_y_t put_top,
screen_x_t unput_left,
vram_y_t unput_top,
int put_image,
int unput_image
) const;
/// --------
};
extern CPlayerAnim player_anim_forward;
extern CPlayerAnim player_anim_slide;