diff options
author | rodri <rgl@antares-labs.eu> | 2021-07-28 22:15:15 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2021-07-28 22:15:15 +0000 |
commit | 9942eb201a657640cf244b261008b850352a29f3 (patch) | |
tree | 43ffc43f9c3fd9dd6e45e835cea0a87381ae16da /sprite.c | |
parent | d85705bf67be2a23e3d928f9670732be5484f958 (diff) | |
download | musw-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.c | 72 |
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); +} |