Render player with animated sprite

This commit is contained in:
Camden Dixie O'Brien 2024-12-27 17:13:33 +00:00
parent fa7315d6b3
commit 39e8002caf

View File

@ -10,9 +10,11 @@
#include <libxml/parser.h> #include <libxml/parser.h>
#include <string.h> #include <string.h>
#define SCALE 4
#define TILESIZE 32 #define TILESIZE 32
#define VIEWWIDTH 30 #define VIEWWIDTH 8
#define VIEWHEIGHT 20 #define VIEWHEIGHT 6
#define MAX_PATH_LEN 128 #define MAX_PATH_LEN 128
@ -25,10 +27,17 @@
#define TSASSET "/tileset.png" #define TSASSET "/tileset.png"
#define TSCOLS 56 #define TSCOLS 56
#define PIASSET "/player/idle/down.png"
#define PIWIDTH 48
#define PIHEIGHT 64
#define PIANIMLEN 8
#define BASEANIMPERIOD 200
static SDL_Window *window; static SDL_Window *window;
static SDL_Renderer *renderer; static SDL_Renderer *renderer;
static unsigned map[MAPWIDTH][MAPHEIGHT]; static unsigned map[MAPWIDTH][MAPHEIGHT];
static SDL_Texture *tstex; static SDL_Texture *tstex, *pitex;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
@ -44,7 +53,7 @@ int main(int argc, char *argv[])
assert(0 == err); assert(0 == err);
window = SDL_CreateWindow( window = SDL_CreateWindow(
"2D Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, "2D Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
TILESIZE * VIEWWIDTH, TILESIZE * VIEWHEIGHT, 0); SCALE * TILESIZE * VIEWWIDTH, SCALE * TILESIZE * VIEWHEIGHT, 0);
assert(NULL != window); assert(NULL != window);
renderer = SDL_CreateRenderer(window, -1, 0); renderer = SDL_CreateRenderer(window, -1, 0);
assert(NULL != renderer); assert(NULL != renderer);
@ -127,9 +136,36 @@ int main(int argc, char *argv[])
tstex = IMG_LoadTexture(renderer, path); tstex = IMG_LoadTexture(renderer, path);
assert(NULL != tstex); assert(NULL != tstex);
// Render map -- no motion yet so just needs to be done once // Load player idle spritesheet
int offx = 0, offy = 0; assert(strlen(argv[1]) + strlen(PIASSET) < MAX_PATH_LEN);
strcpy(path, argv[1]);
strcat(path, PIASSET);
pitex = IMG_LoadTexture(renderer, path);
assert(NULL != pitex);
int offx = 16, offy = 0;
const SDL_Rect pdest = {
.x = SCALE * 80,
.y = SCALE * 80,
.w = SCALE * PIWIDTH,
.h = SCALE * PIHEIGHT,
};
SDL_Event event;
while (1) {
// Handle events
SDL_PollEvent(&event);
switch (event.type) {
case SDL_QUIT:
goto quit;
default:
break;
}
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
// Draw map
for (int y = 0; y < VIEWHEIGHT; ++y) { for (int y = 0; y < VIEWHEIGHT; ++y) {
for (int x = 0; x < VIEWWIDTH; ++x) { for (int x = 0; x < VIEWWIDTH; ++x) {
const unsigned tileid const unsigned tileid
@ -143,26 +179,27 @@ int main(int argc, char *argv[])
.h = TILESIZE, .h = TILESIZE,
}; };
const SDL_Rect dest = { const SDL_Rect dest = {
.x = TILESIZE * x, .x = SCALE * TILESIZE * x,
.y = TILESIZE * y, .y = SCALE * TILESIZE * y,
.w = TILESIZE, .w = SCALE * TILESIZE,
.h = TILESIZE, .h = SCALE * TILESIZE,
}; };
SDL_RenderCopy(renderer, tstex, &src, &dest); SDL_RenderCopy(renderer, tstex, &src, &dest);
} }
} }
// Draw player
const unsigned piframe
= (SDL_GetTicks64() / BASEANIMPERIOD) % PIANIMLEN;
const SDL_Rect psrc = {
.x = PIWIDTH * piframe,
.y = 0,
.w = PIWIDTH,
.h = PIHEIGHT,
};
SDL_RenderCopy(renderer, pitex, &psrc, &pdest);
SDL_RenderPresent(renderer); SDL_RenderPresent(renderer);
SDL_Event event;
while (1) {
SDL_PollEvent(&event);
switch (event.type) {
case SDL_QUIT:
goto quit;
default:
break;
}
} }
quit: quit: