annotate src/animation.c @ 41:3996f873a54b

core: implement walksprite, closes #2455
author David Demelier <markand@malikania.fr>
date Wed, 15 Jan 2020 13:11:47 +0100
parents 66f318fd97a0
children b815621df3e3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * animation.c -- basic animations
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include "animation.h"
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include "sprite.h"
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 void
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 animation_init(struct animation *an, struct sprite *sprite, uint16_t delay)
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 {
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 assert(an);
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 assert(sprite);
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 an->sprite = sprite;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 an->row = 0;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 an->column = 0;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 an->delay = delay;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 an->elapsed = 0;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 }
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 bool
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 animation_is_complete(const struct animation *an)
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 {
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 assert(an);
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 return an->row == an->sprite->nrows &&
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 an->column == an->sprite->ncols &&
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 an->elapsed >= an->delay;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 }
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 void
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 animation_start(struct animation *an)
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 {
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 assert(an);
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 an->row = 0;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 an->column = 0;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 an->elapsed = 0;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 }
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 void
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 animation_update(struct animation *an, unsigned ticks)
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 {
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 assert(an);
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 an->elapsed += ticks;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 if (an->elapsed < an->delay)
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 return;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
9
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
67 /* Increment column first */
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
68 if (++an->column >= an->sprite->ncols) {
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
69 /*
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
70 * Increment row, if we reach the last row it means we are
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
71 * at the last frame.
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
72 */
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 if (++an->row >= an->sprite->nrows)
9
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
74 an->row = an->sprite->nrows;
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
75 else
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
76 an->column = 0;
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 }
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 }
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 void
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 animation_draw(struct animation *an, int x, int y)
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 {
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 sprite_draw(an->sprite, an->row, an->column, x, y);
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 }