module; #include #include #include import sprite; export module sdl_app; export { struct AppState { SDL_Window* window = nullptr; SDL_Renderer* renderer = nullptr; Sprite* sprite = nullptr; }; SDL_AppResult sdl_panic( const std::string& error_prefix, SDL_Window* window = nullptr, SDL_Renderer* renderer = nullptr ) { std::cerr << error_prefix << ": " << SDL_GetError() << std::endl; if (renderer != nullptr) { SDL_DestroyRenderer(renderer); } if (window != nullptr) { SDL_DestroyWindow(window); } SDL_Quit(); return SDL_APP_FAILURE; } SDL_AppResult sdl_app_init(AppState* app_state) { if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)) { return sdl_panic("SDL_Init error"); } app_state->window = SDL_CreateWindow("BuildSystemTest", 640, 480, 0); if (app_state->window == nullptr) { return sdl_panic("SDL_CreateWindow error"); } app_state->renderer = SDL_CreateRenderer(app_state->window, nullptr); if (app_state->renderer == nullptr) { return sdl_panic("SDL_CreateRenderer error", app_state->window); } try { app_state->sprite = new Sprite(app_state->renderer, "assets/neocat.png", 100, 100); } catch (const std::runtime_error& e) { return sdl_panic(e.what(), app_state->window, app_state->renderer); } return SDL_APP_CONTINUE; } SDL_AppResult sdl_app_event(const AppState* app_state, const SDL_Event* event) { if (event->type == SDL_EVENT_QUIT) { return SDL_APP_SUCCESS; } if (event->type == SDL_EVENT_MOUSE_MOTION) { app_state->sprite->move( event->motion.x - 50, event->motion.y - 50 ); } return SDL_APP_CONTINUE; } SDL_AppResult sdl_app_iterate(const AppState* app_state) { SDL_RenderClear(app_state->renderer); app_state->sprite->render(app_state->renderer); SDL_RenderPresent(app_state->renderer); return SDL_APP_CONTINUE; } void sdl_app_shutdown(const AppState* app_state) { delete app_state->sprite; SDL_DestroyRenderer(app_state->renderer); SDL_DestroyWindow(app_state->window); } }