aboutsummaryrefslogtreecommitdiff
path: root/sprite.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2021-07-28 22:15:15 +0000
committerrodri <rgl@antares-labs.eu>2021-07-28 22:15:15 +0000
commit9942eb201a657640cf244b261008b850352a29f3 (patch)
tree43ffc43f9c3fd9dd6e45e835cea0a87381ae16da /sprite.c
parentd85705bf67be2a23e3d928f9670732be5484f958 (diff)
downloadmusw-9942eb201a657640cf244b261008b850352a29f3.tar.gz
musw-9942eb201a657640cf244b261008b850352a29f3.tar.bz2
musw-9942eb201a657640cf244b261008b850352a29f3.zip
brought the Sprite struct for future animations.
implemented per-party game state and dynamics. now the state is broadcast after integration, not before. fixed a bug in the broadcast procedure where it would keep referencing an already freed Party and its players. implemented a proper Keymap the user will be able to configure. added mkfile rules to manage installation and dependencies. defined a ton of structs in dat.h for new game objects. started work on a general vector model abstraction to define ship `skins'. removed some debug clauses we no longer need. fixed some other ones.
Diffstat (limited to 'sprite.c')
-rw-r--r--sprite.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/sprite.c b/sprite.c
new file mode 100644
index 0000000..a2bf290
--- /dev/null
+++ b/sprite.c
@@ -0,0 +1,72 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include "dat.h"
+#include "fns.h"
+
+static void
+sprite_step(Sprite *spr, ulong Δt)
+{
+ if(spr->nframes < 2)
+ return;
+
+ spr->elapsed += Δt;
+
+ if(spr->elapsed >= spr->period){
+ spr->elapsed -= spr->period;
+ spr->curframe = ++spr->curframe % spr->nframes;
+ }
+}
+
+static void
+sprite_draw(Sprite *spr, Image *dst, Point dp)
+{
+ Point sp = (Point){
+ spr->curframe * Dx(spr->r),
+ 0
+ };
+ sp = addpt(spr->sp, sp);
+
+ draw(dst, rectaddpt(spr->r, dp), spr->sheet, nil, sp);
+}
+
+Sprite *
+newsprite(Image *sheet, Point sp, Rectangle r, int nframes, ulong period)
+{
+ Sprite *spr;
+
+ spr = emalloc(sizeof(Sprite));
+ spr->sheet = sheet;
+ spr->sp = sp;
+ spr->r = r;
+ spr->nframes = nframes;
+ spr->curframe = 0;
+ spr->period = period;
+ spr->elapsed = 0;
+ spr->step = sprite_step;
+ spr->draw = sprite_draw;
+
+ return spr;
+}
+
+Sprite *
+readsprite(char *sheetfile, Point sp, Rectangle r, int nframes, ulong period)
+{
+ Image *sheet;
+ int fd;
+
+ fd = open(sheetfile, OREAD);
+ if(fd < 0)
+ sysfatal("readsprite: %r");
+ sheet = readimage(display, fd, 1);
+ close(fd);
+
+ return newsprite(sheet, sp, r, nframes, period);
+}
+
+void
+delsprite(Sprite *spr)
+{
+ freeimage(spr->sheet);
+ free(spr);
+}