Mirai's Miscellaneous Misadventures

M3 / engines / sdl2.c

1#include <stdlib.h>
2#include <SDL2/SDL.h>
3
4#include "../game.h"
5
6struct mirai_sdl2
7{
8	SDL_Renderer *renderer;
9};
10
11static void mirai_sdl2_stamp(void *opaque, int x, int y, struct mirai_image *image)
12{
13	struct mirai_sdl2 *data = opaque;
14	SDL_Renderer *renderer = data->renderer;
15	
16	SDL_Rect rect;
17	rect.x = x - image->width / 2;
18	rect.y = y - image->height;
19	rect.w = image->width;
20	rect.h = image->height;
21	
22	SDL_RenderFillRect(renderer, &rect);
23}
24
25int main(int argc, char **argv)
26{
27	atexit(&SDL_Quit);
28	
29	SDL_Init(SDL_INIT_VIDEO);
30	
31	SDL_Window *window;
32	SDL_Renderer *renderer;
33	
34	SDL_CreateWindowAndRenderer(mirai_width, mirai_height, 0, &window, &renderer);
35	SDL_RenderSetLogicalSize(renderer, mirai_width, mirai_height);
36	SDL_SetWindowTitle(window, "Mirai's Miscellaneous Misadventures");
37	
38	struct mirai_sdl2 data = {renderer};
39	
40	struct mirai_engine engine = {&data, &mirai_sdl2_stamp};
41	struct mirai_game *game = malloc(mirai_game_size);
42	mirai_start(game, &engine);
43	
44	Uint32 past = SDL_GetTicks();
45	
46	for (;;)
47	{
48		Uint32 current = SDL_GetTicks();
49		Uint32 delay = current - past;
50		if (delay < 33) SDL_Delay(33 - delay);
51		past = current;
52		
53		SDL_Event event;
54		while (SDL_PollEvent(&event))
55		{
56			if (event.type == SDL_QUIT) return 0;
57			
58			if (event.type == SDL_KEYDOWN)
59			{
60				switch (event.key.keysym.sym)
61				{
62					default: continue;
63					case SDLK_q: return 0;
64				}
65			}
66		}
67		
68		struct mirai_keys keys = {0, 0};
69		
70		unsigned char *keyboard = SDL_GetKeyboardState(NULL);
71		if (keyboard[SDL_SCANCODE_LEFT]) keys.left = 1;
72		if (keyboard[SDL_SCANCODE_RIGHT]) keys.right = 1;
73		
74		SDL_SetRenderDrawColor(renderer, 0xEE, 0xEE, 0xEE, 0xEE);
75		SDL_RenderClear(renderer);
76		SDL_SetRenderDrawColor(renderer, 0x33, 0x33, 0x33, 0x33);
77		mirai_step(game, keys);
78		SDL_RenderPresent(renderer);
79	}
80}