diff --git a/Makefile b/Makefile index 377ac21..ad7965e 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ PREFIX ?= /usr/local CFLAGS := $(CFLAGS) `pkg-config --cflags --libs sdl3` LDFLAGS := $(LDFLAGS) -lm -SRCS = slutpet.c img.c samply.c +SRCS = slutpet.c img.c samply.c sdl.c all: slutpet diff --git a/dat.h b/dat.h index 4254bd2..89a4580 100644 --- a/dat.h +++ b/dat.h @@ -3,6 +3,8 @@ typedef struct Image Image; typedef struct State State; struct Samply { + Image *tx; /* this is a pointer to one of the images below */ + Image *idle; Image *walka; Image *walkb; @@ -21,6 +23,8 @@ struct Image { struct State { SDL_Window *win; SDL_Renderer *ren; + SDL_DisplayID dpy; + SDL_Rect bounds; Uint64 lastframe; Samply *sam; diff --git a/fns.h b/fns.h index 6e26cb6..30ce072 100644 --- a/fns.h +++ b/fns.h @@ -6,5 +6,8 @@ void free_image(Image *i); Image *load_image(SDL_Renderer *ren, char *path); +int samply_step(State *st); void put_samply_to_bed(Samply *sam); -Samply *wake_samply_up(SDL_Renderer *ren); +Samply *wake_samply_up(State *st); + +int in_bounds(Image *i, int x, int y, SDL_Rect *bounds); diff --git a/samply.c b/samply.c index a82bd31..7731785 100644 --- a/samply.c +++ b/samply.c @@ -3,6 +3,46 @@ #include "dat.h" #include "fns.h" +int +samply_step(State *st) +{ + Uint64 ms; + int x, y; + + if (SDL_GetWindowPosition(st->win, &x, &y) == false) { + shit("window pos query fail: %s", SDL_GetError()); + goto render_it; + } + + ms = SDL_GetTicks(); + if ((ms / 100) % 2) { + babble("anim walka"); + st->sam->tx = st->sam->walka; + } else { + babble("anim walkb"); + st->sam->tx = st->sam->walkb; + } + + x++; + babble("bounds %d %d %d %d", st->bounds.x, st->bounds.y, + st->bounds.w, st->bounds.h); + babble("img %d %d %d %d", x, y, st->sam->tx->w, st->sam->tx->h); + // if (in_bounds(st->sam->tx, x, y, &st->bounds) == false) { + if (st->bounds.w - st->sam->tx->w < x) { + st->sam->tx = st->sam->idle; + x = st->bounds.w - st->sam->tx->w; + babble("*bonk*"); + } + if (SDL_SetWindowPosition(st->win, x, y) == false) + shit("window pos set fail: %s", SDL_GetError()); + +render_it: + if (SDL_RenderTexture(st->ren, st->sam->tx->tex, NULL, NULL) == false) { + fuck("rendertexture fail: %s", SDL_GetError()); + return -1; + } +} + void put_samply_to_bed(Samply *sam) { @@ -19,7 +59,7 @@ put_samply_to_bed(Samply *sam) } Samply * -wake_samply_up(SDL_Renderer *ren) +wake_samply_up(State *st) { Samply *sam; @@ -31,7 +71,7 @@ wake_samply_up(SDL_Renderer *ren) } babble("stand samply up!!"); - sam->idle = load_image(ren, "samply/Samply.png"); + sam->idle = load_image(st->ren, "samply/Samply.png"); if (!sam->idle) { fuck("samply would rather stay in bed. too bad!"); put_samply_to_bed(sam); @@ -39,7 +79,7 @@ wake_samply_up(SDL_Renderer *ren) } babble("samply walk! part 1!!"); - sam->walka = load_image(ren, "samply/Samply_Walk1.png"); + sam->walka = load_image(st->ren, "samply/Samply_Walk1.png"); if (!sam->walka) { fuck("samply would rather stay in bed. too bad!"); put_samply_to_bed(sam); @@ -47,12 +87,14 @@ wake_samply_up(SDL_Renderer *ren) } babble("samply walk! part 2!!"); - sam->walkb = load_image(ren, "samply/Samply_Walk2.png"); + sam->walkb = load_image(st->ren, "samply/Samply_Walk2.png"); if (!sam->walkb) { fuck("samply would rather stay in bed. too bad!"); put_samply_to_bed(sam); return NULL; } + sam->tx = sam->idle; + return sam; } diff --git a/sdl.c b/sdl.c new file mode 100644 index 0000000..90f23b0 --- /dev/null +++ b/sdl.c @@ -0,0 +1,17 @@ +#include + +#include "dat.h" +#include "fns.h" + +int +in_bounds(Image *i, int x, int y, SDL_Rect *bounds) +{ + SDL_Rect r; + SDL_Rect irect = { x, y, i->w, i->h }; + + if (SDL_GetRectUnion(&irect, bounds, &r) == false) { + shit("rect union math fail: %s", SDL_GetError()); + return false; + } + return SDL_RectsEqual(&irect, &r); +} diff --git a/slutpet.c b/slutpet.c index 883cd73..a735780 100644 --- a/slutpet.c +++ b/slutpet.c @@ -53,18 +53,12 @@ SDL_AppIterate(void *as) SDL_SetRenderDrawColor(st->ren, 0, 0, 0, SDL_ALPHA_TRANSPARENT); SDL_RenderClear(st->ren); - ms = SDL_GetTicks(); - if ((ms / 100) % 2) - tx = st->sam->walka->tex; - else - tx = st->sam->walkb->tex; - - if (SDL_RenderTexture(st->ren, tx, NULL, NULL) == false) { - fuck("rendertexture fail: %s", SDL_GetError()); + if (samply_step(st) < 0) return SDL_APP_FAILURE; - } + SDL_RenderPresent(st->ren); st->lastframe = SDL_GetTicks(); + return SDL_APP_CONTINUE; } @@ -101,8 +95,22 @@ SDL_AppInit(void **as, int argc, char **argv) return SDL_APP_FAILURE; } + if (SDL_EnableScreenSaver() == false) + shit("cannot disable screensaver: %s", SDL_GetError()); + + st->dpy = SDL_GetDisplayForWindow(st->win); + if (!st->dpy) { + fuck("cannot get current display: %s", SDL_GetError()); + return SDL_APP_FAILURE; + } + + if (SDL_GetDisplayBounds(st->dpy, &st->bounds) == false) { + fuck("cannot get display bounds: %s", SDL_GetError()); + return SDL_APP_FAILURE; + } + babble("create samply!!..."); - st->sam = wake_samply_up(st->ren); + st->sam = wake_samply_up(st); if (!st->sam) { fuck("samply said no. too bad!"); return SDL_APP_FAILURE;