Mercurial > molko
diff librpg/rpg/tileset.c @ 218:71f989ae8de9
rpg: add support for animated tiles
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 18 Nov 2020 13:46:29 +0100 |
parents | 64f24b482722 |
children |
line wrap: on
line diff
--- a/librpg/rpg/tileset.c Wed Nov 18 10:13:29 2020 +0100 +++ b/librpg/rpg/tileset.c Wed Nov 18 13:46:29 2020 +0100 @@ -17,11 +17,37 @@ */ #include <assert.h> +#include <stdlib.h> +#include <core/animation.h> #include <core/sprite.h> #include "tileset.h" +static inline int +anim_cmp(const void *d1, const void *d2) +{ + const struct tileset_animation *mtd1 = d1; + const struct tileset_animation *mtd2 = d2; + + if (mtd1->id < mtd2->id) + return -1; + if (mtd1->id > mtd2->id) + return 1; + + return 0; +} + +static inline const struct tileset_animation * +find(const struct tileset *ts, unsigned int r, unsigned int c) +{ + const struct tileset_animation key = { + .id = c + (r * ts->sprite->ncols) + }; + + return bsearch(&key, ts->anims, ts->animsz, sizeof (key), anim_cmp); +} + bool tileset_ok(const struct tileset *ts) { @@ -29,9 +55,39 @@ } void +tileset_start(struct tileset *ts) +{ + for (size_t i = 0; i < ts->animsz; ++i) { + struct tileset_animation *ta = &ts->anims[i]; + + if (ta->animation) + animation_start(ta->animation); + } +} + +void +tileset_update(struct tileset *ts, unsigned int ticks) +{ + for (size_t i = 0; i < ts->animsz; ++i) { + struct tileset_animation *ta = &ts->anims[i]; + + if (!ta->animation) + continue; + + if (animation_update(ta->animation, ticks)) + animation_start(ta->animation); + } +} + +void tileset_draw(const struct tileset *ts, unsigned int r, unsigned int c, int x, int y) { assert(ts); - sprite_draw(ts->sprite, r, c, x, y); + const struct tileset_animation *ta; + + if ((ta = find(ts, r, c))) + animation_draw(ta->animation, x, y); + else + sprite_draw(ts->sprite, r, c, x, y); }