Mirai's Miscellaneous Misadventures

M2 / engines / sdl2.c

#include <stdlib.h>
#include <SDL2/SDL.h>

#include "../game.h"

struct mirai_sdl2
{
	SDL_Renderer *renderer;
};

static void mirai_sdl2_stamp(void *opaque, int x, int y, struct mirai_image *image)
{
	struct mirai_sdl2 *data = opaque;
	SDL_Renderer *renderer = data->renderer;
	
	SDL_Rect rect;
	rect.x = x - image->width / 2;
	rect.y = y - image->height;
	rect.w = image->width;
	rect.h = image->height;
	
	SDL_RenderFillRect(renderer, &rect);
}

int main(int argc, char **argv)
{
	atexit(&SDL_Quit);
	
	SDL_Init(SDL_INIT_VIDEO);
	
	SDL_Window *window;
	SDL_Renderer *renderer;
	
	SDL_CreateWindowAndRenderer(mirai_width, mirai_height, 0, &window, &renderer);
	SDL_RenderSetLogicalSize(renderer, mirai_width, mirai_height);
	SDL_SetWindowTitle(window, "Mirai's Miscellaneous Misadventures");
	
	struct mirai_sdl2 data = {renderer};
	
	struct mirai_engine engine = {&data, &mirai_sdl2_stamp};
	struct mirai_game *game = malloc(mirai_game_size);
	mirai_start(game, &engine);
	
	Uint32 past = SDL_GetTicks();
	
	for (;;)
	{
		Uint32 current = SDL_GetTicks();
		Uint32 delay = current - past;
		if (delay < 33) SDL_Delay(33 - delay);
		past = current;
		
		SDL_Event event;
		while (SDL_PollEvent(&event))
		{
			if (event.type == SDL_QUIT) return 0;
			
			if (event.type == SDL_KEYDOWN)
			{
				switch (event.key.keysym.sym)
				{
					default: continue;
					case SDLK_q: return 0;
				}
			}
		}
		
		struct mirai_keys keys = {0, 0};
		
		unsigned char *keyboard = SDL_GetKeyboardState(NULL);
		if (keyboard[SDL_SCANCODE_LEFT]) keys.left = 1;
		if (keyboard[SDL_SCANCODE_RIGHT]) keys.right = 1;
		
		SDL_SetRenderDrawColor(renderer, 0xEE, 0xEE, 0xEE, 0xEE);
		SDL_RenderClear(renderer);
		SDL_SetRenderDrawColor(renderer, 0x33, 0x33, 0x33, 0x33);
		mirai_step(game, keys);
		SDL_RenderPresent(renderer);
	}
}