Back to shtanton's homepage
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharlie Stanton <charlie@shtanton.xyz>2025-04-04 23:47:30 +0100
committerCharlie Stanton <charlie@shtanton.xyz>2025-04-04 23:47:30 +0100
commitf0bf72a54477fb18b1666293a652b52f53320a1d (patch)
tree1806d9e55d51dad871a3b2eaf369f417ec28be11
downloadldjam57-f0bf72a54477fb18b1666293a652b52f53320a1d.tar
Initial commit
-rw-r--r--Makefile2
-rw-r--r--src/all.c180
-rw-r--r--src/all.h13
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;