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() отсутствует. Вместо неё используются четыре функции:

Prerequisites Предварительные условия

First, complete the initial setup guide: Сначала пройдите базовую инструкцию по сборке: SDL3 Android Setup Guide

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. У вас есть два пути:

  1. Relax the rules:Смягчить правила: Remove -Werror from target_compile_options in CMakeLists.txt. Удалите -Werror из target_compile_options в CMakeLists.txt.
  2. 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