90 lines
2.4 KiB
C++
90 lines
2.4 KiB
C++
module;
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <SDL3/SDL.h>
|
|
|
|
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);
|
|
}
|
|
}
|