From c3adf398b1cc1d919d25157cdb6f2d76b2fbf428 Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Fri, 13 Apr 2018 03:00:54 +0200 Subject: [PATCH] character: support non-repeating animations (stopping at the last frame) --- src/character.c | 28 +++++++++++++++++++--------- src/character.h | 2 +- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/character.c b/src/character.c index 21e051a..4e049eb 100644 --- a/src/character.c +++ b/src/character.c @@ -182,7 +182,7 @@ SYMBOL_EXPORT void RegisterSpritesheet(struct Game* game, struct Character* char s->width = 0; s->height = 0; - s->repeats = strtolnull(al_get_config_value(config, "animation", "repeats"), 0); + s->repeats = strtolnull(al_get_config_value(config, "animation", "repeats"), -1); s->successor = NULL; const char* successor = al_get_config_value(config, "animation", "successor"); @@ -278,7 +278,7 @@ SYMBOL_EXPORT struct Character* CreateCharacter(struct Game* game, char* name) { character->flipX = false; character->flipY = false; character->shared = false; - character->repeats = 0; + character->repeats = -1; character->reversing = false; character->parent = NULL; character->hidden = false; @@ -369,12 +369,8 @@ SYMBOL_EXPORT void AnimateCharacter(struct Game* game, struct Character* charact } } - if (character->spritesheet->frameCount == 1) { - character->pos = 0; - } - if (reachedEnd) { - if (character->repeats) { + if (character->repeats > 0) { character->repeats--; if (character->callback) { character->callback(game, character, NULL, character->spritesheet->name, character->callbackData); @@ -386,16 +382,30 @@ SYMBOL_EXPORT void AnimateCharacter(struct Game* game, struct Character* charact if (character->callback) { character->callback(game, character, character->spritesheet->name, old, character->callbackData); } - } - if ((character->reversed) && (character->predecessor)) { + } else if ((character->reversed) && (character->predecessor)) { char* old = character->spritesheet->name; SelectSpritesheet(game, character, character->predecessor); if (character->callback) { character->callback(game, character, character->spritesheet->name, old, character->callbackData); } + } else { + if (character->repeats == 0) { + if (character->reversed) { + character->pos = 1; + } else { + character->pos = character->spritesheet->frameCount - 1; + } + if (character->callback) { + character->callback(game, character, NULL, character->spritesheet->name, character->callbackData); + } + } } } } + + if (character->spritesheet->frameCount == 1) { + character->pos = 0; + } } character->frame = &character->spritesheet->frames[character->pos]; diff --git a/src/character.h b/src/character.h index 6f19d2f..1bf53be 100644 --- a/src/character.h +++ b/src/character.h @@ -89,7 +89,7 @@ struct Character { int confineY; /*!< Height of the canvas being drawn to, for correct position calculation; when -1, uses parent's confines or viewport size */ bool flipX; /*!< Flips the character's sprite vertically. */ bool flipY; /*!< Flips the character's sprite horizontally. */ - int repeats; /*!< Number of repeats left before the spritesheet is changed to its successor. */ + int repeats; /*!< Number of repeats left before the spritesheet is changed to its successor or stopped. */ bool reversing; /*!< Whether the animation is currently played backwards. */ bool reversed; /*!< Whether the current animation has been requested as reversed. */ bool hidden;