Skip to content

Instantly share code, notes, and snippets.

@skeeto
Last active August 6, 2025 17:50
Show Gist options
  • Save skeeto/95dd9c6aae1b873911cc878c70e52995 to your computer and use it in GitHub Desktop.
Save skeeto/95dd9c6aae1b873911cc878c70e52995 to your computer and use it in GitHub Desktop.
// $ eval cc main_sdl2.c $(pkg-config --cflags --libs sdl2) -lm
char *SDL_itoa(int, char *, int);
#undef main // undo SDL_main from pkg-config
#define main appmain
#define itoa SDL_itoa
#include "SRC/AABB.C"
#include "SRC/BALL.C"
#include "SRC/BREAKOUT.C"
#include "SRC/GAMELVL.C"
#undef ADJ
#include "SRC/LVLMNGR.C"
#include "SRC/PADDLE.C"
#include "SRC/RENDERER.C"
#include "SRC/UI.C"
#undef main
#include "SDL.h"
static SDL_Window *window;
static SDL_Renderer *renderer;
static SDL_Texture *texture;
static Sint32 pixel_buffer[320*200];
static SDL_bool keyboard[256];
static Sint32 palette[256] = {
0x000000, 0x0000aa, 0x00aa00, 0x00aaaa, 0xaa0000, 0xaa00aa, 0xaa5500,
0xaaaaaa, 0x555555, 0x5555ff, 0x55ff55, 0x55ffff, 0xff5555, 0xff55ff,
0xffff55, 0xffffff, 0x000000, 0x141414, 0x202020, 0x2c2c2c, 0x383838,
0x454545, 0x515151, 0x616161, 0x717171, 0x828282, 0x929292, 0xa2a2a2,
0xb6b6b6, 0xcbcbcb, 0xe3e3e3, 0xffffff, 0x0000ff, 0x4100ff, 0x7d00ff,
0xbe00ff, 0xff00ff, 0xff00be, 0xff007d, 0xff0041, 0xff0000, 0xff4100,
0xff7d00, 0xffbe00, 0xffff00, 0xbeff00, 0x7dff00, 0x41ff00, 0x00ff00,
0x00ff41, 0x00ff7d, 0x00ffbe, 0x00ffff, 0x00beff, 0x007dff, 0x0041ff,
0x7d7dff, 0x9e7dff, 0xbe7dff, 0xdf7dff, 0xff7dff, 0xff7ddf, 0xff7dbe,
0xff7d9e, 0xff7d7d, 0xff9e7d, 0xffbe7d, 0xffdf7d, 0xffff7d, 0xdfff7d,
0xbeff7d, 0x9eff7d, 0x7dff7d, 0x7dff9e, 0x7dffbe, 0x7dffdf, 0x7dffff,
0x7ddfff, 0x7dbeff, 0x7d9eff, 0xb6b6ff, 0xc7b6ff, 0xdbb6ff, 0xebb6ff,
0xffb6ff, 0xffb6eb, 0xffb6db, 0xffb6c7, 0xffb6b6, 0xffc7b6, 0xffdbb6,
0xffebb6, 0xffffb6, 0xebffb6, 0xdbffb6, 0xc7ffb6, 0xb6ffb6, 0xb6ffc7,
0xb6ffdb, 0xb6ffeb, 0xb6ffff, 0xb6ebff, 0xb6dbff, 0xb6c7ff, 0x000071,
0x1c0071, 0x380071, 0x550071, 0x710071, 0x710055, 0x710038, 0x71001c,
0x710000, 0x711c00, 0x713800, 0x715500, 0x717100, 0x557100, 0x387100,
0x1c7100, 0x007100, 0x00711c, 0x007138, 0x007155, 0x007171, 0x005571,
0x003871, 0x001c71, 0x383871, 0x453871, 0x553871, 0x613871, 0x713871,
0x713861, 0x713855, 0x713845, 0x713838, 0x714538, 0x715538, 0x716138,
0x717138, 0x617138, 0x557138, 0x457138, 0x387138, 0x387145, 0x387155,
0x387161, 0x387171, 0x386171, 0x385571, 0x384571, 0x515171, 0x595171,
0x615171, 0x695171, 0x715171, 0x715169, 0x715161, 0x715159, 0x715151,
0x715951, 0x716151, 0x716951, 0x717151, 0x697151, 0x617151, 0x597151,
0x517151, 0x517159, 0x517161, 0x517169, 0x517171, 0x516971, 0x516171,
0x515971, 0x000041, 0x100041, 0x200041, 0x300041, 0x410041, 0x410030,
0x410020, 0x410010, 0x410000, 0x411000, 0x412000, 0x413000, 0x414100,
0x304100, 0x204100, 0x104100, 0x004100, 0x004110, 0x004120, 0x004130,
0x004141, 0x003041, 0x002041, 0x001041, 0x202041, 0x282041, 0x302041,
0x382041, 0x412041, 0x412038, 0x412030, 0x412028, 0x412020, 0x412820,
0x413020, 0x413820, 0x414120, 0x384120, 0x304120, 0x284120, 0x204120,
0x204128, 0x204130, 0x204138, 0x204141, 0x203841, 0x203041, 0x202841,
0x2c2c41, 0x302c41, 0x342c41, 0x3c2c41, 0x412c41, 0x412c3c, 0x412c34,
0x412c30, 0x412c2c, 0x41302c, 0x41342c, 0x413c2c, 0x41412c, 0x3c412c,
0x34412c, 0x30412c, 0x2c412c, 0x2c4130, 0x2c4134, 0x2c413c, 0x2c4141,
0x2c3c41, 0x2c3441, 0x2c3041, 0x000000, 0x000000, 0x000000, 0x000000,
0x000000, 0x000000, 0x000000, 0x000000,
};
void vgaInit(void)
{
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow(
"Breakout (SDL2 Port)",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
320, 200, 0
);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);
texture = SDL_CreateTexture(
renderer,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING,
320, 200
);
}
void vgaExit(void) {}
void vgaPutPixel(int x, int y, char color)
{
if (x>=0 && x<320 && y>=0 && y<200) {
Sint32 rgb = palette[color&255];
pixel_buffer[y*320 + x] = rgb; // ARGB
}
}
void vgaClearOffscreen(char color)
{
Sint32 c = palette[color&255];
for (int i = 0; i < 320*200; ++i) {
pixel_buffer[i] = c;
}
}
void vgaUpdateVram(void)
{
SDL_UpdateTexture(texture, 0, pixel_buffer, 320*sizeof(Sint32));
SDL_RenderCopy(renderer, texture, 0, 0);
SDL_RenderPresent(renderer);
}
void kbInit(void) {}
void kbExit(void) {}
int kbHit(KeyCode c)
{
for (SDL_Event e = {0}; SDL_PollEvent(&e);) {
switch (e.type) {
case SDL_QUIT: keyboard[ESC] = SDL_TRUE; break;
case SDL_KEYDOWN:
switch (e.key.keysym.sym) {
case SDLK_UP: keyboard[U_ARROW] = SDL_TRUE; break;
case SDLK_DOWN: keyboard[D_ARROW] = SDL_TRUE; break;
case SDLK_RIGHT: keyboard[R_ARROW] = SDL_TRUE; break;
case SDLK_LEFT: keyboard[L_ARROW] = SDL_TRUE; break;
} break;
case SDL_KEYUP:
switch (e.key.keysym.sym) {
case SDLK_UP: keyboard[U_ARROW] = SDL_FALSE; break;
case SDLK_DOWN: keyboard[D_ARROW] = SDL_FALSE; break;
case SDLK_RIGHT: keyboard[R_ARROW] = SDL_FALSE; break;
case SDLK_LEFT: keyboard[L_ARROW] = SDL_FALSE; break;
} break;
}
}
return keyboard[c];
}
int main(int, char **)
{
appmain();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment