Using SDL3 Callbacks instead of main() Использование SDL3-callbacks вместо main()
If you look at the official SDL3 examples, you will notice that the traditional main() function is gone. Instead, SDL3 uses four mandatory callback functions:
Если вы откроете официальные примеры SDL3, вы заметите, что привычная функция main() отсутствует. Вместо неё используются четыре функции:
- SDL_AppInit: Initialization. Runs once at the start.Инициализация. Срабатывает один раз в начале.
- SDL_AppEvent: Event handling (mouse, keys, window resizing).Обработка событий (мышь, клавиши, изменение размера окна).
- SDL_AppIterate: The main loop. Runs many times per second for logic/rendering.Основной цикл. Выполняется многократно в секунду для логики и отрисовки.
- SDL_AppQuit: Cleanup. Runs once before the application closes.Очистка ресурсов. Выполняется перед закрытием приложения.
Prerequisites Предварительные условия
Example: Clear Screen (clear.c) Пример: Очистка экрана (clear.c)
Copy this code into your main.c. It smoothly transitions the background color using a sine wave.
Скопируйте этот код в ваш main.c. Он плавно меняет цвет фона, используя синусоиду.
#define SDL_MAIN_USE_CALLBACKS 1
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
static SDL_Window *window = NULL;
static SDL_Renderer *renderer = NULL;
SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) {
(void)appstate; (void)argc; (void)argv;
if (!SDL_Init(SDL_INIT_VIDEO)) return SDL_APP_FAILURE;
if (!SDL_CreateWindowAndRenderer("SDL3 Callback Example", 640, 480, 0, &window, &renderer)) return SDL_APP_FAILURE;
return SDL_APP_CONTINUE;
}
SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) {
(void)appstate;
if (event->type == SDL_EVENT_QUIT) return SDL_APP_SUCCESS;
return SDL_APP_CONTINUE;
}
SDL_AppResult SDL_AppIterate(void *appstate) {
(void)appstate;
const double now = ((double)SDL_GetTicks()) / 1000.0;
const float red = (float) (0.5 + 0.5 * SDL_sin(now));
const float green = (float) (0.5 + 0.5 * SDL_sin(now + SDL_PI_D * 2 / 3));
const float blue = (float) (0.5 + 0.5 * SDL_sin(now + SDL_PI_D * 4 / 3));
SDL_SetRenderDrawColorFloat(renderer, red, green, blue, SDL_ALPHA_OPAQUE_FLOAT);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
return SDL_APP_CONTINUE;
}
void SDL_AppQuit(void *appstate, SDL_AppResult result) {
(void)appstate; (void)result;
}
Dealing with Compilation Errors Решение ошибок компиляции
If your build fails with unused parameter 'appstate', it's because of the -Werror flag in CMakeLists.txt. You have two choices:
Если сборка падает с ошибкой unused parameter 'appstate', это происходит из-за флага -Werror в CMakeLists.txt. У вас есть два пути:
-
Relax the rules:Смягчить правила:
Remove
-Werrorfromtarget_compile_optionsinCMakeLists.txt. Удалите-Werrorизtarget_compile_optionsвCMakeLists.txt. -
Professional way:Профессиональный путь:
Add
(void)appstate;inside your functions as shown in the code block above to explicitly tell the compiler the parameter is intentionally unused. Добавьте(void)appstate;внутри функций (как в коде выше), чтобы явно сообщить компилятору, что параметр не используется намеренно.
Build and Install Сборка и установка
Run these commands in separate terminals for efficiency: Запускайте эти команды в разных консолях для удобства:
Terminal 1: BuildКонсоль 1: Сборка
gradlew assembleDebug
Terminal 2: InstallКонсоль 2: Установка
adb install -r app-debug.apk