#include #include #include #include #define SDL_MAIN_USE_CALLBACKS #include #include #include "app.h" #include "font.h" #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 #define WINDOW_TITLE "Match 3" #define MAX_DELTATIME (1000.0 / 30) SDL_Window* window; SDL_Renderer* renderer; MIX_Mixer* mixer; application_state app_state; SDL_AppResult SDL_AppInit(void** userdata, int nargs, char** argc) { SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); srand(time(NULL)); window = SDL_CreateWindow(WINDOW_TITLE, WINDOW_WIDTH, WINDOW_HEIGHT, 0); renderer = SDL_CreateRenderer(window, NULL); #ifndef SDL_PLATFORM_EMSCRIPTEN SDL_SetRenderVSync(renderer, true); #endif MIX_Init(); mixer = MIX_CreateMixerDevice( SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, NULL); init_app(renderer, mixer); return SDL_APP_CONTINUE; } SDL_AppResult SDL_AppEvent(void* userdata, SDL_Event* e) { if (e->type == SDL_EVENT_QUIT) { return SDL_APP_SUCCESS; } switch (app_state) { case game_state: game_event(e); break; default: break; } return SDL_APP_CONTINUE; } SDL_AppResult SDL_AppIterate(void* userdata) { static uint64_t then = 0, now = 0; then = now; now = SDL_GetTicks(); float dt = (now - then) / 1000.0f; switch (app_state) { case game_state: update_game(SDL_min(dt, MAX_DELTATIME)); draw_game(renderer); break; default: break; } return SDL_APP_CONTINUE; } void SDL_AppQuit(void* userdata, SDL_AppResult result) { SDL_DestroyWindow(window); SDL_DestroyRenderer(renderer); free_app(); SDL_Quit(); } void init_app(SDL_Renderer* renderer, MIX_Mixer* mixer) { init_timed_game(renderer, mixer, 200); app_state = game_state; } void free_app() { free_game(); }