annotate libmlk-core/core/animation.c @ 243:71b3b7036de7

misc: lot of cleanups, - prefix libraries with libmlk, - move assets from source directories closes #2520, - prefix header guards closes #2519
author David Demelier <markand@malikania.fr>
date Sat, 28 Nov 2020 22:37:30 +0100
parents libcore/core/animation.c@64f24b482722
children c4da052c0def
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>
136
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
20 #include <string.h>
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
136
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
22 #include "drawable.h"
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include "animation.h"
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include "sprite.h"
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
136
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
26 static bool
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
27 update(struct drawable *dw, unsigned int ticks)
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
28 {
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
29 return animation_update(dw->data, ticks);
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
30 }
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
31
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
32 static void
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
33 draw(struct drawable *dw)
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
34 {
169
eb0a7ab71023 misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
35 animation_draw(dw->data, dw->x, dw->y);
136
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
36 }
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
37
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 void
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
39 animation_init(struct animation *an, struct sprite *sprite, unsigned int delay)
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 {
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 assert(an);
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 assert(sprite);
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 an->sprite = sprite;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 an->row = 0;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 an->column = 0;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 an->delay = delay;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 an->elapsed = 0;
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
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 void
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 animation_start(struct animation *an)
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 {
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 assert(an);
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 an->row = 0;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 an->column = 0;
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 an->elapsed = 0;
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
127
6691c9f69028 core: animation_update now returns true when complete
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
61 bool
183
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
62 animation_completed(const struct animation *an)
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
63 {
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 183
diff changeset
64 assert(an);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 183
diff changeset
65
183
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
66 return an->elapsed >= an->delay &&
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
67 an->row >= an->sprite->nrows &&
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
68 an->column >= an->sprite->ncols;
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
69 }
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
70
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
71 bool
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
72 animation_update(struct animation *an, unsigned int ticks)
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 {
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 assert(an);
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
75
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 an->elapsed += ticks;
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 if (an->elapsed < an->delay)
127
6691c9f69028 core: animation_update now returns true when complete
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
79 return false;
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
9
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
81 /* Increment column first */
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
82 if (++an->column >= an->sprite->ncols) {
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
83 /*
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
84 * 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
85 * at the last frame.
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
86 */
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 if (++an->row >= an->sprite->nrows)
9
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
88 an->row = an->sprite->nrows;
66f318fd97a0 core: fix animation_is_complete
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
89 else
183
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
90 an->column = an->elapsed = 0;
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
91 } else
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
92 an->elapsed = 0;
127
6691c9f69028 core: animation_update now returns true when complete
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
93
183
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
94 return animation_completed(an);
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 }
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
169
eb0a7ab71023 misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
97 bool
183
604fad63bd9c core: fix animation delay
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
98 animation_draw(const struct animation *an, int x, int y)
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 {
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 183
diff changeset
100 assert(an);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 183
diff changeset
101
169
eb0a7ab71023 misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
102 return sprite_draw(an->sprite, an->row, an->column, x, y);
7
fbb7101b7bd8 core: implement animations, closes #2439
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 }
136
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
104
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
105 void
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
106 animation_drawable(struct animation *an, struct drawable *dw, int x, int y)
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
107 {
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
108 assert(an);
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
109 assert(dw);
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
110
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
111 memset(dw, 0, sizeof (*dw));
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
112
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
113 dw->data = an;
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
114 dw->x = x - (an->sprite->cellw / 2);
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
115 dw->y = y - (an->sprite->cellh / 2);
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
116 dw->update = update;
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
117 dw->draw = draw;
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
118
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
119 animation_start(an);
30b68089ae70 core: rework actions and a bit of drawables, closes #2492
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
120 }