diff options
author | Charlie Stanton <charlie@shtanton.xyz> | 2025-04-04 23:47:30 +0100 |
---|---|---|
committer | Charlie Stanton <charlie@shtanton.xyz> | 2025-04-04 23:47:30 +0100 |
commit | f0bf72a54477fb18b1666293a652b52f53320a1d (patch) | |
tree | 1806d9e55d51dad871a3b2eaf369f417ec28be11 | |
download | ldjam57-f0bf72a54477fb18b1666293a652b52f53320a1d.tar |
Initial commit
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/all.c | 180 | ||||
-rw-r--r-- | src/all.h | 13 |
3 files changed, 195 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bfb6190 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +main: src/all.c src/all.h + gcc -Wall -Wextra -Wpedantic -DSDL $$(pkg-config --libs sdl3) -o main src/all.c diff --git a/src/all.c b/src/all.c new file mode 100644 index 0000000..f14a3d2 --- /dev/null +++ b/src/all.c @@ -0,0 +1,180 @@ +#include "all.h" + +#define MEM_SIZE (1<<16) + +typedef struct { + char *start; + char *end; +} Arena; + +#define new(a, c, t) ((t *) alloc(a, c, sizeof(t), _Alignof(t))) +#define affirm(c) while (!(c)) *(volatile int *)0 = 0 + +static void *alloc(Arena *a, ptrdiff_t count, ptrdiff_t size, ptrdiff_t align) { + ptrdiff_t pad = -(size_t) a->start & (align - 1); + affirm(count < (a->end - a->start - pad) / size); + char *r = a->start + pad; + a->start += pad + size * count; + for (ptrdiff_t i = 0; i < count * size; i++) { + r[i] = 0; + } + + return r; +} + +typedef struct { + int width, height; +} UI; + +typedef struct { + int x, y; +} State; + +enum { + INPUT_NONE, + INPUT_UP, + INPUT_DOWN, + INPUT_LEFT, + INPUT_RIGHT, +}; + +typedef struct { + State state; + UI ui; + int input; +} Game; + +static DrawList *render(State state, UI *ui, Arena *a) { + (void) ui; + + DrawList *drawList = new(a, 1, DrawList); + drawList->len = 1; + drawList->els[0] = (DrawElement) { + .rect = (SDL_Rect) { + .x = state.x, + .y = state.y, + .w = 100, + .h = 100, + }, + .color = (SDL_Color) { + .r = 255, + .g = 0, + .b = 0, + .a = 255, + }, + }; + + return drawList; +} + +static void update(Game *game, Arena a) { + switch (game->input) { + case INPUT_UP: + game->state.y -= 20; + break; + case INPUT_DOWN: + game->state.y += 20; + break; + case INPUT_LEFT: + game->state.x -= 20; + break; + case INPUT_RIGHT: + game->state.x += 20; + break; + default: + break; + } +} + +#if SDL + +int main(int argc, char **argv) { + (void) argc; + (void) argv; + + char *mem = SDL_malloc(MEM_SIZE); + Arena a = { + .start = mem, + .end = mem + MEM_SIZE, + }; + + Game *game = new(&a, 1, Game); + game->state = (State) { + .x = 100, + .y = 100, + }; + game->ui = (UI) { + .width = 640, + .height = 480, + }; + + SDL_Init(SDL_INIT_VIDEO); + SDL_Window *w = SDL_CreateWindow( + "LDJam 57", + game->ui.width, + game->ui.height, + 0 + ); + SDL_PropertiesID renderProps = SDL_CreateProperties(); + SDL_SetPointerProperty(renderProps, SDL_PROP_RENDERER_CREATE_WINDOW_POINTER, w); + SDL_SetNumberProperty(renderProps, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER, 1); + SDL_Renderer *r = SDL_CreateRendererWithProperties(renderProps); + SDL_DestroyProperties(renderProps); + + for (;;) { + game->input = INPUT_NONE; + SDL_Event e = {0}; + while (SDL_PollEvent(&e)) { + switch (e.type) { + case SDL_EVENT_QUIT: + return 0; + case SDL_EVENT_KEY_DOWN: + switch (e.key.key) { + case 'w': + game->input = INPUT_UP; + break; + case 'a': + game->input = INPUT_LEFT; + break; + case 's': + game->input = INPUT_DOWN; + break; + case 'd': + game->input = INPUT_RIGHT; + break; + } + break; + } + } + + Arena scratch = a; + DrawList *drawList = render(game->state, &game->ui, &scratch); + SDL_SetRenderDrawColor(r, 0, 0, 0, 255); + SDL_RenderFillRect(r, NULL); + for (int i = 0; i < drawList->len; i++) { + SDL_SetRenderDrawColor( + r, + drawList->els[i].color.r, + drawList->els[i].color.g, + drawList->els[i].color.b, + drawList->els[i].color.a + ); + SDL_FRect rect = { + .x = (float) drawList->els[i].rect.x, + .y = (float) drawList->els[i].rect.y, + .w = (float) drawList->els[i].rect.w, + .h = (float) drawList->els[i].rect.h + }; + SDL_RenderFillRect(r, &rect); + } + + update(game, a); + + SDL_RenderPresent(r); + } + + return 0; +} + +#elif WASM +#endif diff --git a/src/all.h b/src/all.h new file mode 100644 index 0000000..19cc6e5 --- /dev/null +++ b/src/all.h @@ -0,0 +1,13 @@ +#include <SDL3/SDL.h> +#include <stddef.h> +#include <stdint.h> + +typedef struct { + SDL_Rect rect; + SDL_Color color; +} DrawElement; + +typedef struct { + int len; + DrawElement els[256]; +} DrawList; |