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 b85c96d..30ce072 100644 --- a/fns.h +++ b/fns.h @@ -8,4 +8,6 @@ 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 6e8bd9f..7731785 100644 --- a/samply.c +++ b/samply.c @@ -7,15 +7,37 @@ int samply_step(State *st) { Uint64 ms; - SDL_Texture *tx; + 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) - tx = st->sam->walka->tex; - else - tx = st->sam->walkb->tex; + if ((ms / 100) % 2) { + babble("anim walka"); + st->sam->tx = st->sam->walka; + } else { + babble("anim walkb"); + st->sam->tx = st->sam->walkb; + } - if (SDL_RenderTexture(st->ren, tx, NULL, NULL) == false) { + 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; } @@ -37,7 +59,7 @@ put_samply_to_bed(Samply *sam) } Samply * -wake_samply_up(SDL_Renderer *ren) +wake_samply_up(State *st) { Samply *sam; @@ -49,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); @@ -57,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); @@ -65,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 f0e4724..a735780 100644 --- a/slutpet.c +++ b/slutpet.c @@ -95,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;