forked from tas/major_tom
Initial commit
This commit is contained in:
728
src/game/sprites.c
Normal file
728
src/game/sprites.c
Normal file
@@ -0,0 +1,728 @@
|
||||
#include "game/sprites.h"
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
SDL_Texture *g_spritesheet = NULL;
|
||||
|
||||
/* ── Pixel art data ─────────────────────────────────
|
||||
* Each sprite is defined as a 16x16 grid of hex color values.
|
||||
* 0x00000000 = transparent
|
||||
* Colors are RGBA packed as 0xRRGGBBAA
|
||||
*/
|
||||
|
||||
#define T 0x00000000 /* transparent */
|
||||
|
||||
/* Color palette */
|
||||
#define BLK 0x1a1a2eFF /* black/dark */
|
||||
#define WHT 0xeeeeeaFF /* white */
|
||||
#define SKN 0xe8b796FF /* skin tone */
|
||||
#define SKD 0xc48e6aFF /* skin dark */
|
||||
#define BLU 0x4a7cbdFF /* blue */
|
||||
#define BLD 0x365e8fFF /* blue dark */
|
||||
#define BLL 0x6fa8dcFF /* blue light */
|
||||
#define RED 0xd94444FF /* red */
|
||||
#define RDD 0xa83232FF /* red dark */
|
||||
#define RDL 0xff6666FF /* red light */
|
||||
#define GRN 0x4caf50FF /* green */
|
||||
#define GRD 0x388e3cFF /* green dark */
|
||||
#define YLW 0xffd54fFF /* yellow */
|
||||
#define YLD 0xd4a017FF /* yellow dark */
|
||||
#define ORG 0xff9800FF /* orange */
|
||||
#define ORD 0xcc7a00FF /* orange dark */
|
||||
#define PRP 0x9c27b0FF /* purple */
|
||||
#define PRD 0x7b1fa2FF /* purple dark */
|
||||
#define PRL 0xce93d8FF /* purple light */
|
||||
#define GRY 0x888888FF /* grey */
|
||||
#define GYD 0x555555FF /* grey dark */
|
||||
#define GYL 0xbbbbbbFF /* grey light */
|
||||
#define BRN 0x8d6e63FF /* brown */
|
||||
#define BRD 0x5d4037FF /* brown dark */
|
||||
#define CYN 0x4dd0e1FF /* cyan */
|
||||
#define CYD 0x00acc1FF /* cyan dark */
|
||||
|
||||
/* ── Player sprites ────────────────────────────────── */
|
||||
|
||||
/* Player idle frame 1 - heroic adventurer */
|
||||
static const uint32_t player_idle1[16*16] = {
|
||||
T, T, T, T, T, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLL, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLK, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, SKN, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, BLK, SKN, SKN, BLK, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKN, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKD, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, T, T, T, T, T,
|
||||
T, T, SKN, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, SKN, T, T, T, T,
|
||||
T, T, SKN, T, BLU, BLU, BLU, BLU, BLU, BLU, T, SKN, T, T, T, T,
|
||||
T, T, T, T, BLD, BLD, BLU, BLU, BLD, BLD, T, T, T, T, T, T,
|
||||
T, T, T, T, BLD, BLD, T, T, BLD, BLD, T, T, T, T, T, T,
|
||||
T, T, T, T, BRN, BRN, T, T, BRN, BRN, T, T, T, T, T, T,
|
||||
T, T, T, T, BRD, BRD, T, T, BRD, BRD, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Player idle frame 2 - slight bob */
|
||||
static const uint32_t player_idle2[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLL, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLK, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, SKN, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, BLK, SKN, SKN, BLK, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKN, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKD, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, T, T, T, T, T,
|
||||
T, T, SKN, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, SKN, T, T, T, T,
|
||||
T, T, T, T, BLD, BLD, BLU, BLU, BLD, BLD, T, T, T, T, T, T,
|
||||
T, T, T, T, BLD, BLD, T, T, BLD, BLD, T, T, T, T, T, T,
|
||||
T, T, T, T, BRN, BRN, T, T, BRN, BRN, T, T, T, T, T, T,
|
||||
T, T, T, T, BRD, BRD, T, T, BRD, BRD, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Player run frame 1 */
|
||||
static const uint32_t player_run1[16*16] = {
|
||||
T, T, T, T, T, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLL, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLK, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, SKN, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, BLK, SKN, SKN, BLK, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKN, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKD, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T,
|
||||
T, T, SKN, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, T, T, T, T, T,
|
||||
T, T, SKN, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, SKN, T, T, T, T,
|
||||
T, T, T, T, BLU, BLU, BLU, BLU, BLU, BLU, T, SKN, T, T, T, T,
|
||||
T, T, T, T, T, BLD, BLU, BLU, BLD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, BLD, T, T, T, BLD, T, T, T, T, T, T,
|
||||
T, T, T, T, BRN, BRN, T, T, T, BRN, BRN, T, T, T, T, T,
|
||||
T, T, T, BRD, BRD, T, T, T, T, T, BRD, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Player run frame 2 */
|
||||
static const uint32_t player_run2[16*16] = {
|
||||
T, T, T, T, T, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLL, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLK, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, SKN, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, BLK, SKN, SKN, BLK, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKN, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKD, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, SKN, T, T, T, T,
|
||||
T, T, T, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, SKN, T, T, T, T,
|
||||
T, T, SKN, T, BLU, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, BLD, T, BLU, BLU, T, BLD, T, T, T, T, T, T,
|
||||
T, T, T, T, BLD, T, T, T, BLD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, BRN, T, BRN, BRN, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, BRD, T, BRD, T, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Player run frame 3 */
|
||||
static const uint32_t player_run3[16*16] = {
|
||||
T, T, T, T, T, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLL, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLK, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, SKN, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, BLK, SKN, SKN, BLK, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKN, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKD, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, T, T, T, T, T,
|
||||
T, T, SKN, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, SKN, T, T, T, T,
|
||||
T, T, SKN, T, BLU, BLU, BLU, BLU, BLU, BLU, T, SKN, T, T, T, T,
|
||||
T, T, T, T, BLD, BLD, BLU, BLU, BLD, BLD, T, T, T, T, T, T,
|
||||
T, T, T, BLD, T, T, T, T, T, T, BLD, T, T, T, T, T,
|
||||
T, T, BRN, BRN, T, T, T, T, T, BRN, BRN, T, T, T, T, T,
|
||||
T, T, T, BRD, T, T, T, T, BRD, BRD, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Player run frame 4 - same as run2 mirrored leg positions */
|
||||
static const uint32_t player_run4[16*16] = {
|
||||
T, T, T, T, T, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLL, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLK, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, SKN, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, BLK, SKN, SKN, BLK, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKN, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKD, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T,
|
||||
T, T, SKN, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, T, T, T, T, T,
|
||||
T, T, T, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, SKN, T, T, T, T,
|
||||
T, T, SKN, T, BLU, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, T, BLD, BLU, BLU, BLD, T, T, T, T, T, T, T,
|
||||
T, T, T, BLD, T, T, T, T, T, BLD, T, T, T, T, T, T,
|
||||
T, T, BRN, BRN, T, T, T, T, BRN, BRN, T, T, T, T, T, T,
|
||||
T, T, BRD, T, T, T, T, T, T, BRD, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Player jump */
|
||||
static const uint32_t player_jump[16*16] = {
|
||||
T, T, T, T, T, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLL, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLK, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, SKN, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, BLK, SKN, SKN, BLK, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKN, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, SKN, T, SKN, SKN, SKD, SKD, SKN, SKN, T, SKN, T, T, T, T,
|
||||
T, T, SKN, BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, SKN, T, T, T, T,
|
||||
T, T, T, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, T, T, T, T, T,
|
||||
T, T, T, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, BLD, BLD, T, T, BLD, BLD, T, T, T, T, T, T,
|
||||
T, T, T, BRN, BRN, T, T, T, BRN, BRN, T, T, T, T, T, T,
|
||||
T, T, T, BRD, BRD, T, T, T, T, BRN, BRN, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, BRD, BRD, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Player fall */
|
||||
static const uint32_t player_fall[16*16] = {
|
||||
T, T, T, T, T, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLU, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLL, BLL, BLL, BLL, BLL, BLU, T, T, T, T, T,
|
||||
T, T, T, T, BLK, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, SKN, SKN, SKN, SKN, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, BLK, SKN, BLK, SKN, SKN, BLK, SKN, BLK, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKN, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, T, T, T, SKN, SKN, SKD, SKD, SKN, SKN, T, T, T, T, T, T,
|
||||
T, SKN, SKN, BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, SKN, SKN, T, T, T,
|
||||
T, T, T, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, T, T, T, T, T,
|
||||
T, T, T, BLD, BLU, BLU, BLU, BLU, BLU, BLU, BLD, T, T, T, T, T,
|
||||
T, T, T, T, BLU, BLU, BLU, BLU, BLU, BLU, T, T, T, T, T, T,
|
||||
T, T, T, T, BLD, BLD, T, T, BLD, BLD, T, T, T, T, T, T,
|
||||
T, T, T, T, BRN, BRN, T, T, T, BRN, T, T, T, T, T, T,
|
||||
T, T, T, BRN, BRD, T, T, T, T, BRN, T, T, T, T, T, T,
|
||||
T, T, T, BRD, T, T, T, T, T, BRD, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* ── Grunt enemy sprites ───────────────────────────── */
|
||||
/* Grunt: Red spiky enemy that patrols back and forth */
|
||||
|
||||
static const uint32_t grunt_idle1[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, RED, T, T, T, T, T, RED, T, T, T, T, T,
|
||||
T, T, T, T, RED, RED, T, T, T, RED, RED, T, T, T, T, T,
|
||||
T, T, T, T, RDD, RED, RED, RED, RED, RED, RDD, T, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, WHT, BLK, RED, WHT, BLK, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, BLK, BLK, BLK, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, T, RDD, RED, RED, RED, RED, RED, RDD, T, T, T, T, T,
|
||||
T, T, T, T, RDD, RED, RED, RED, RED, RED, RDD, T, T, T, T, T,
|
||||
T, T, T, T, T, RDD, RED, RED, RDD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, RDD, RDD, T, T, RDD, RDD, T, T, T, T, T, T,
|
||||
T, T, T, T, RDD, RDD, T, T, RDD, RDD, T, T, T, T, T, T,
|
||||
T, T, T, T, BLK, BLK, T, T, BLK, BLK, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
static const uint32_t grunt_idle2[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, RED, T, T, T, T, T, RED, T, T, T, T, T,
|
||||
T, T, T, T, RED, RED, T, T, T, RED, RED, T, T, T, T, T,
|
||||
T, T, T, T, RDD, RED, RED, RED, RED, RED, RDD, T, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, WHT, BLK, RED, WHT, BLK, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, BLK, BLK, BLK, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, T, RDD, RED, RED, RED, RED, RED, RDD, T, T, T, T, T,
|
||||
T, T, T, T, T, RDD, RED, RED, RDD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, RDD, RDD, T, T, RDD, RDD, T, T, T, T, T, T,
|
||||
T, T, T, T, RDD, RDD, T, T, RDD, RDD, T, T, T, T, T, T,
|
||||
T, T, T, T, BLK, BLK, T, T, BLK, BLK, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Grunt walk frames (same body, different leg positions) */
|
||||
static const uint32_t grunt_walk1[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, RED, T, T, T, T, T, RED, T, T, T, T, T,
|
||||
T, T, T, T, RED, RED, T, T, T, RED, RED, T, T, T, T, T,
|
||||
T, T, T, T, RDD, RED, RED, RED, RED, RED, RDD, T, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, WHT, BLK, RED, WHT, BLK, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, BLK, BLK, BLK, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, T, RDD, RED, RED, RED, RED, RED, RDD, T, T, T, T, T,
|
||||
T, T, T, T, RDD, RED, RED, RED, RED, RED, RDD, T, T, T, T, T,
|
||||
T, T, T, T, T, RDD, RED, RED, RDD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, RDD, T, T, RDD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, RDD, T, T, T, T, RDD, T, T, T, T, T, T,
|
||||
T, T, T, T, BLK, T, T, T, T, BLK, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
static const uint32_t grunt_walk2[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, RED, T, T, T, T, T, RED, T, T, T, T, T,
|
||||
T, T, T, T, RED, RED, T, T, T, RED, RED, T, T, T, T, T,
|
||||
T, T, T, T, RDD, RED, RED, RED, RED, RED, RDD, T, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, WHT, BLK, RED, WHT, BLK, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, BLK, BLK, BLK, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, T, RDD, RED, RED, RED, RED, RED, RDD, T, T, T, T, T,
|
||||
T, T, T, T, RDD, RED, RED, RED, RED, RED, RDD, T, T, T, T, T,
|
||||
T, T, T, T, T, RDD, RED, RED, RDD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, RDD, T, T, T, T, RDD, T, T, T, T, T, T,
|
||||
T, T, T, T, T, RDD, T, T, RDD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, BLK, T, T, BLK, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Grunt death frame */
|
||||
static const uint32_t grunt_death[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T,
|
||||
T, T, RDD, RED, RED, BLK, BLK, RED, BLK, BLK, RED, RED, RDD, T, T, T,
|
||||
T, T, RDD, RED, RED, RED, RED, BLK, RED, RED, RED, RED, RDD, T, T, T,
|
||||
T, T, T, RDD, RED, RED, RED, RED, RED, RED, RED, RDD, T, T, T, T,
|
||||
T, T, T, T, RDD, RDD, RDD, RDD, RDD, RDD, RDD, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* ── Flyer enemy sprites ───────────────────────────── */
|
||||
/* Flying enemy: Purple bat-like creature */
|
||||
|
||||
static const uint32_t flyer_idle1[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, PRP, PRP, PRP, PRP, PRP, T, T, T, T, T, T,
|
||||
T, T, T, T, PRP, PRP, PRP, PRP, PRP, PRP, PRP, T, T, T, T, T,
|
||||
T, T, T, PRP, PRP, YLW, BLK, PRP, YLW, BLK, PRP, PRP, T, T, T, T,
|
||||
T, T, T, PRD, PRP, PRP, PRP, PRP, PRP, PRP, PRP, PRD, T, T, T, T,
|
||||
T, T, T, PRD, PRP, PRP, BLK, BLK, PRP, PRP, PRP, PRD, T, T, T, T,
|
||||
T, T, PRL, PRD, PRP, PRP, PRP, PRP, PRP, PRP, PRP, PRD, PRL, T, T, T,
|
||||
T, PRL, PRL, T, PRD, PRP, PRP, PRP, PRP, PRP, PRD, T, PRL, PRL, T, T,
|
||||
PRL, PRL, T, T, T, PRD, PRP, PRP, PRD, T, T, T, T, PRL, PRL, T,
|
||||
PRL, T, T, T, T, T, PRD, PRD, T, T, T, T, T, T, PRL, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
static const uint32_t flyer_idle2[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, PRP, PRP, PRP, PRP, PRP, T, T, T, T, T, T,
|
||||
T, T, T, T, PRP, PRP, PRP, PRP, PRP, PRP, PRP, T, T, T, T, T,
|
||||
T, T, T, PRP, PRP, YLW, BLK, PRP, YLW, BLK, PRP, PRP, T, T, T, T,
|
||||
T, T, T, PRD, PRP, PRP, PRP, PRP, PRP, PRP, PRP, PRD, T, T, T, T,
|
||||
T, T, T, PRD, PRP, PRP, BLK, BLK, PRP, PRP, PRP, PRD, T, T, T, T,
|
||||
T, T, T, PRD, PRP, PRP, PRP, PRP, PRP, PRP, PRP, PRD, T, T, T, T,
|
||||
T, PRL, T, T, PRD, PRP, PRP, PRP, PRP, PRP, PRD, T, T, PRL, T, T,
|
||||
PRL, PRL, PRL, T, T, PRD, PRP, PRP, PRD, T, T, T, PRL, PRL, PRL, T,
|
||||
T, T, PRL, PRL, T, T, PRD, PRD, T, T, T, PRL, PRL, T, T, T,
|
||||
T, T, T, PRL, PRL, T, T, T, T, T, PRL, PRL, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Flyer death */
|
||||
static const uint32_t flyer_death[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, PRP, PRP, PRP, PRP, PRP, T, T, T, T, T, T,
|
||||
T, T, T, T, PRP, PRP, PRP, PRP, PRP, PRP, PRP, T, T, T, T, T,
|
||||
T, T, T, PRP, PRP, BLK, BLK, PRP, BLK, BLK, PRP, PRP, T, T, T, T,
|
||||
T, T, T, PRD, PRP, PRP, PRP, PRP, PRP, PRP, PRP, PRD, T, T, T, T,
|
||||
T, T, T, PRD, PRP, PRP, PRP, BLK, PRP, PRP, PRP, PRD, T, T, T, T,
|
||||
T, T, T, T, PRD, PRP, PRP, PRP, PRP, PRP, PRD, T, T, T, T, T,
|
||||
T, T, T, PRL, T, PRD, PRP, PRP, PRD, T, PRL, T, T, T, T, T,
|
||||
T, T, PRL, T, T, T, PRD, PRD, T, T, T, PRL, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* ── Projectile sprites ────────────────────────────── */
|
||||
|
||||
/* Player bullet frame 1 */
|
||||
static const uint32_t bullet1[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, CYD, CYN, CYN, CYD, T, T, T, T, T, T,
|
||||
T, T, T, T, T, CYD, CYN, WHT, WHT, CYN, CYD, T, T, T, T, T,
|
||||
T, T, T, T, T, CYN, WHT, WHT, WHT, WHT, CYN, T, T, T, T, T,
|
||||
T, T, T, T, T, CYN, WHT, WHT, WHT, WHT, CYN, T, T, T, T, T,
|
||||
T, T, T, T, T, CYD, CYN, WHT, WHT, CYN, CYD, T, T, T, T, T,
|
||||
T, T, T, T, T, T, CYD, CYN, CYN, CYD, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Player bullet frame 2 - glow variation */
|
||||
static const uint32_t bullet2[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, CYD, CYD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, CYN, WHT, WHT, CYN, T, T, T, T, T, T,
|
||||
T, T, T, T, T, CYN, WHT, WHT, WHT, WHT, CYN, T, T, T, T, T,
|
||||
T, T, T, T, CYD, WHT, WHT, WHT, WHT, WHT, WHT, CYD, T, T, T, T,
|
||||
T, T, T, T, CYD, WHT, WHT, WHT, WHT, WHT, WHT, CYD, T, T, T, T,
|
||||
T, T, T, T, T, CYN, WHT, WHT, WHT, WHT, CYN, T, T, T, T, T,
|
||||
T, T, T, T, T, T, CYN, WHT, WHT, CYN, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, CYD, CYD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Impact effect frame 1 */
|
||||
static const uint32_t impact1[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, WHT, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, WHT, T, T, T, WHT, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, CYN, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, CYN, CYN, WHT, CYN, CYN, T, T, T, T, T, T,
|
||||
T, T, T, T, T, CYN, WHT, WHT, WHT, CYN, T, T, T, T, T, T,
|
||||
T, T, WHT, T, CYN, WHT, WHT, WHT, WHT, WHT, CYN, T, WHT, T, T, T,
|
||||
T, T, T, T, T, CYN, WHT, WHT, WHT, CYN, T, T, T, T, T, T,
|
||||
T, T, T, T, T, CYN, CYN, WHT, CYN, CYN, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, CYN, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, WHT, T, T, T, WHT, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, WHT, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Impact effect frame 2 - expanding */
|
||||
static const uint32_t impact2[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, CYD, T, T, T, T, T, CYD, T, T, T, T, T,
|
||||
T, T, T, T, T, T, CYN, T, CYN, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, CYN, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, CYN, WHT, CYN, T, T, T, T, T, T, T,
|
||||
T, T, T, CYN, T, CYN, T, WHT, T, CYN, T, CYN, T, T, T, T,
|
||||
T, T, T, T, CYN, WHT, WHT, WHT, WHT, WHT, CYN, T, T, T, T, T,
|
||||
T, T, T, CYN, T, CYN, T, WHT, T, CYN, T, CYN, T, T, T, T,
|
||||
T, T, T, T, T, T, CYN, WHT, CYN, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, CYN, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, CYN, T, CYN, T, T, T, T, T, T, T,
|
||||
T, T, T, T, CYD, T, T, T, T, T, CYD, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Impact effect frame 3 - fading */
|
||||
static const uint32_t impact3[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, CYD, T, T, T, T, T, T, T, CYD, T, T, T, T,
|
||||
T, T, T, T, T, T, T, CYD, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, CYD, T, CYD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, CYD, T, T, T, CYD, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, CYD, T, CYD, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, CYD, T, T, T, T, T, T, T, T,
|
||||
T, T, T, CYD, T, T, T, T, T, T, T, CYD, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
/* Enemy bullet */
|
||||
static const uint32_t enemy_bullet1[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, ORD, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, ORG, YLW, ORG, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, ORD, YLW, WHT, YLW, ORD, T, T, T, T, T, T,
|
||||
T, T, T, T, T, ORD, YLW, WHT, YLW, ORD, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, ORG, YLW, ORG, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, ORD, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
static const uint32_t enemy_bullet2[16*16] = {
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, ORD, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, ORG, YLW, ORG, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, ORG, YLW, WHT, YLW, ORG, T, T, T, T, T, T,
|
||||
T, T, T, T, ORD, YLW, WHT, WHT, WHT, YLW, ORD, T, T, T, T, T,
|
||||
T, T, T, T, ORD, YLW, WHT, WHT, WHT, YLW, ORD, T, T, T, T, T,
|
||||
T, T, T, T, T, ORG, YLW, WHT, YLW, ORG, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, ORG, YLW, ORG, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, ORD, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
|
||||
};
|
||||
|
||||
|
||||
/* ── Spritesheet generation ────────────────────────── */
|
||||
|
||||
/* All sprite definitions for the sheet - row, column, pixel data */
|
||||
typedef struct SpriteDef {
|
||||
int row;
|
||||
int col;
|
||||
const uint32_t *pixels;
|
||||
} SpriteDef;
|
||||
|
||||
static const SpriteDef s_sprite_defs[] = {
|
||||
/* Row 0: Player */
|
||||
{0, 0, player_idle1},
|
||||
{0, 1, player_idle2},
|
||||
{0, 2, player_run1},
|
||||
{0, 3, player_run2},
|
||||
{0, 4, player_run3},
|
||||
{0, 5, player_run4},
|
||||
{0, 6, player_jump},
|
||||
{0, 7, player_fall},
|
||||
|
||||
/* Row 1: Grunt */
|
||||
{1, 0, grunt_idle1},
|
||||
{1, 1, grunt_idle2},
|
||||
{1, 2, grunt_walk1},
|
||||
{1, 3, grunt_walk2},
|
||||
{1, 4, grunt_walk1}, /* reuse frame */
|
||||
{1, 5, grunt_walk2}, /* reuse frame */
|
||||
{1, 6, grunt_death},
|
||||
|
||||
/* Row 2: Flyer */
|
||||
{2, 0, flyer_idle1},
|
||||
{2, 1, flyer_idle2},
|
||||
{2, 2, flyer_idle1}, /* reuse for fly anim */
|
||||
{2, 3, flyer_idle2},
|
||||
{2, 4, flyer_idle1},
|
||||
{2, 5, flyer_idle2},
|
||||
{2, 6, flyer_death},
|
||||
|
||||
/* Row 3: Projectiles */
|
||||
{3, 0, bullet1},
|
||||
{3, 1, bullet2},
|
||||
{3, 2, impact1},
|
||||
{3, 3, impact2},
|
||||
{3, 4, impact3},
|
||||
{3, 5, enemy_bullet1},
|
||||
{3, 6, enemy_bullet2},
|
||||
};
|
||||
|
||||
#define SHEET_COLS 8
|
||||
#define SHEET_ROWS 4
|
||||
|
||||
SDL_Texture *sprites_generate(SDL_Renderer *renderer) {
|
||||
int w = SHEET_COLS * SPRITE_CELL;
|
||||
int h = SHEET_ROWS * SPRITE_CELL;
|
||||
|
||||
SDL_Surface *surface = SDL_CreateRGBSurfaceWithFormat(
|
||||
0, w, h, 32, SDL_PIXELFORMAT_RGBA8888);
|
||||
if (!surface) {
|
||||
fprintf(stderr, "Failed to create sprite surface: %s\n", SDL_GetError());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Clear to transparent */
|
||||
SDL_FillRect(surface, NULL, 0);
|
||||
|
||||
/* Blit each sprite definition */
|
||||
int count = sizeof(s_sprite_defs) / sizeof(s_sprite_defs[0]);
|
||||
for (int i = 0; i < count; i++) {
|
||||
const SpriteDef *def = &s_sprite_defs[i];
|
||||
int ox = def->col * SPRITE_CELL;
|
||||
int oy = def->row * SPRITE_CELL;
|
||||
|
||||
uint32_t *pixels = (uint32_t *)surface->pixels;
|
||||
int pitch = surface->pitch / 4; /* pitch in uint32_t */
|
||||
|
||||
for (int y = 0; y < SPRITE_CELL; y++) {
|
||||
for (int x = 0; x < SPRITE_CELL; x++) {
|
||||
uint32_t rgba = def->pixels[y * SPRITE_CELL + x];
|
||||
if (rgba == 0) continue; /* transparent */
|
||||
|
||||
/* Convert from our RRGGBBAA to surface format */
|
||||
uint8_t r = (rgba >> 24) & 0xFF;
|
||||
uint8_t g = (rgba >> 16) & 0xFF;
|
||||
uint8_t b = (rgba >> 8) & 0xFF;
|
||||
uint8_t a = (rgba) & 0xFF;
|
||||
|
||||
pixels[(oy + y) * pitch + (ox + x)] =
|
||||
SDL_MapRGBA(surface->format, r, g, b, a);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SDL_Texture *tex = SDL_CreateTextureFromSurface(renderer, surface);
|
||||
SDL_FreeSurface(surface);
|
||||
|
||||
if (!tex) {
|
||||
fprintf(stderr, "Failed to create sprite texture: %s\n", SDL_GetError());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SDL_SetTextureBlendMode(tex, SDL_BLENDMODE_BLEND);
|
||||
|
||||
g_spritesheet = tex;
|
||||
printf("Generated spritesheet: %dx%d (%d sprites)\n", w, h, count);
|
||||
return tex;
|
||||
}
|
||||
|
||||
|
||||
/* ── Animation definitions ─────────────────────────── */
|
||||
|
||||
#define FRAME(col, row, dur) \
|
||||
{ .src = {(col)*SPRITE_CELL, (row)*SPRITE_CELL, SPRITE_CELL, SPRITE_CELL}, .duration = (dur) }
|
||||
|
||||
/* Player */
|
||||
static AnimFrame s_player_idle_frames[] = {
|
||||
FRAME(0, 0, 0.6f),
|
||||
FRAME(1, 0, 0.6f),
|
||||
};
|
||||
|
||||
static AnimFrame s_player_run_frames[] = {
|
||||
FRAME(2, 0, 0.1f),
|
||||
FRAME(3, 0, 0.1f),
|
||||
FRAME(4, 0, 0.1f),
|
||||
FRAME(5, 0, 0.1f),
|
||||
};
|
||||
|
||||
static AnimFrame s_player_jump_frames[] = {
|
||||
FRAME(6, 0, 1.0f),
|
||||
};
|
||||
|
||||
static AnimFrame s_player_fall_frames[] = {
|
||||
FRAME(7, 0, 1.0f),
|
||||
};
|
||||
|
||||
/* Grunt */
|
||||
static AnimFrame s_grunt_idle_frames[] = {
|
||||
FRAME(0, 1, 0.5f),
|
||||
FRAME(1, 1, 0.5f),
|
||||
};
|
||||
|
||||
static AnimFrame s_grunt_walk_frames[] = {
|
||||
FRAME(2, 1, 0.15f),
|
||||
FRAME(3, 1, 0.15f),
|
||||
FRAME(4, 1, 0.15f),
|
||||
FRAME(5, 1, 0.15f),
|
||||
};
|
||||
|
||||
static AnimFrame s_grunt_death_frames[] = {
|
||||
FRAME(6, 1, 0.3f),
|
||||
};
|
||||
|
||||
/* Flyer */
|
||||
static AnimFrame s_flyer_idle_frames[] = {
|
||||
FRAME(0, 2, 0.3f),
|
||||
FRAME(1, 2, 0.3f),
|
||||
};
|
||||
|
||||
static AnimFrame s_flyer_fly_frames[] = {
|
||||
FRAME(2, 2, 0.12f),
|
||||
FRAME(3, 2, 0.12f),
|
||||
FRAME(4, 2, 0.12f),
|
||||
FRAME(5, 2, 0.12f),
|
||||
};
|
||||
|
||||
static AnimFrame s_flyer_death_frames[] = {
|
||||
FRAME(6, 2, 0.3f),
|
||||
};
|
||||
|
||||
/* Projectiles */
|
||||
static AnimFrame s_bullet_frames[] = {
|
||||
FRAME(0, 3, 0.08f),
|
||||
FRAME(1, 3, 0.08f),
|
||||
};
|
||||
|
||||
static AnimFrame s_impact_frames[] = {
|
||||
FRAME(2, 3, 0.05f),
|
||||
FRAME(3, 3, 0.05f),
|
||||
FRAME(4, 3, 0.08f),
|
||||
};
|
||||
|
||||
static AnimFrame s_enemy_bullet_frames[] = {
|
||||
FRAME(5, 3, 0.1f),
|
||||
FRAME(6, 3, 0.1f),
|
||||
};
|
||||
|
||||
/* Exported animation definitions */
|
||||
AnimDef anim_player_idle;
|
||||
AnimDef anim_player_run;
|
||||
AnimDef anim_player_jump;
|
||||
AnimDef anim_player_fall;
|
||||
|
||||
AnimDef anim_grunt_idle;
|
||||
AnimDef anim_grunt_walk;
|
||||
AnimDef anim_grunt_death;
|
||||
|
||||
AnimDef anim_flyer_idle;
|
||||
AnimDef anim_flyer_fly;
|
||||
AnimDef anim_flyer_death;
|
||||
|
||||
AnimDef anim_bullet;
|
||||
AnimDef anim_bullet_impact;
|
||||
AnimDef anim_enemy_bullet;
|
||||
|
||||
void sprites_init_anims(void) {
|
||||
anim_player_idle = (AnimDef){s_player_idle_frames, 2, true, NULL};
|
||||
anim_player_run = (AnimDef){s_player_run_frames, 4, true, NULL};
|
||||
anim_player_jump = (AnimDef){s_player_jump_frames, 1, false, NULL};
|
||||
anim_player_fall = (AnimDef){s_player_fall_frames, 1, false, NULL};
|
||||
|
||||
anim_grunt_idle = (AnimDef){s_grunt_idle_frames, 2, true, NULL};
|
||||
anim_grunt_walk = (AnimDef){s_grunt_walk_frames, 4, true, NULL};
|
||||
anim_grunt_death = (AnimDef){s_grunt_death_frames, 1, false, NULL};
|
||||
|
||||
anim_flyer_idle = (AnimDef){s_flyer_idle_frames, 2, true, NULL};
|
||||
anim_flyer_fly = (AnimDef){s_flyer_fly_frames, 4, true, NULL};
|
||||
anim_flyer_death = (AnimDef){s_flyer_death_frames, 1, false, NULL};
|
||||
|
||||
anim_bullet = (AnimDef){s_bullet_frames, 2, true, NULL};
|
||||
anim_bullet_impact = (AnimDef){s_impact_frames, 3, false, NULL};
|
||||
anim_enemy_bullet = (AnimDef){s_enemy_bullet_frames, 2, true, NULL};
|
||||
}
|
||||
Reference in New Issue
Block a user