diff options
| -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; | 
