/* * Copyright (c) Camden Dixie O'Brien * SPDX-License-Identifier: AGPL-3.0-only */ #include "engine_hooks.h" #include #include #include #include #define FRAMERATE 60 #define INTERVAL (1000 / FRAMERATE) int main(int argc, char *argv[]) { int err = SDL_Init(SDL_INIT_VIDEO); assert(0 == err); SDL_Window *window = SDL_CreateWindow( game_conf.win.title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, game_conf.win.w, game_conf.win.h, 0); assert(NULL != window); SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0); assert(NULL != renderer); void *gamemem = calloc(1, game_conf.memsize); game_init(argc, argv, gamemem, renderer); uint64_t prevt = SDL_GetTicks64(); while (1) { uint64_t t = SDL_GetTicks64(); uint64_t dt = t - prevt; if (dt >= INTERVAL) { // Handle all events currently in queue SDL_Event evt; while (SDL_PollEvent(&evt)) { if (game_evthandle(gamemem, &evt) != GAMESTATUS_OK) goto quit; } // Update game state if (game_update(gamemem, dt) != GAMESTATUS_OK) goto quit; // Render frame SDL_RenderClear(renderer); game_render(gamemem, renderer, t); SDL_RenderPresent(renderer); // Set previous frame draw time prevt = t; } SDL_Delay(2); } quit: game_teardown(gamemem); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); }