Mercurial > molko
annotate src/animation.c @ 9:66f318fd97a0
core: fix animation_is_complete
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 07 Jan 2020 20:22:22 +0100 |
parents | fbb7101b7bd8 |
children | b815621df3e3 |
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 } |