Как я могу использовать новую структуру обратного вызова SDL3 без функции main()
вместо традиционной, в которой приложение прокачивает основной цикл?
Между прочим, все остальные теги, специфичные для SDL , имеют дефис между «sdl» и спецификатором, например. sdl-net или sdl-1.2 . Поскольку ваш тег только что создан, думаете ли вы, что он должен быть sdl-3 вместо sdl3?
@dbc Спасибо за улов. Вы правы, там должен был быть дефис. Я создал в мета-посте поддержку с просьбой помочь удалить sdl3
. Meta.stackoverflow.com/questions/429949/delete-tag-sdl3
На самом деле вам не нужно создавать запрос в службу поддержки, если я правильно помню, тег автоматически удалит через день, если он не используется.
@dbc Исторически сложилось так, что большой проблемой с документацией SDL было выяснение того, применимо ли руководство или другой ресурс к используемой вами версии, используя тег sdl-3
для основного выпуска для функции, которая будет представлена только в этом основном выпуске. На мой взгляд, предпочтительнее использовать общий тег всего лишь sdl
.
В этом примере C++ открывается окно с неопределенным содержимым, с которым можно взаимодействовать (изменять размер, перемещать, сворачивать, закрывать и т. д.), а также выводить ход выполнения и полученные события на консоль ошибок. Он был разработан на Ubuntu 23.10.
#define SDL_MAIN_USE_CALLBACKS
#include <SDL3/SDL_main.h>
#include <SDL3/SDL_init.h>
#include <iostream>
namespace {
struct AppState
{
/// The window we'll open to show our rendering inside.
SDL_Window *window{nullptr};
/// Count of the number of times the main loop has been run.
long long iterations{0};
};
}
extern "C" {
int SDL_AppInit(void **appstate, int argc, char **argv)
{
std::cerr << "SDL_AppInit" << std::endl;
// Create an object that will be passed back to each callback:
*appstate = new AppState;
AppState& state = *static_cast<AppState*>(*appstate);
int result = 0;
if (result = SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_EVENTS) < 0)
{
std::cerr << "SDL_InitSubSystem failed with code " << result << std::endl;
goto error_exit;
}
state.window = SDL_CreateWindow( "SDL3 Window", 960, 540, 0 /* | SDL_WINDOW_VULKAN*/ );
if ( state.window == NULL )
{
std::cerr << "SDL_CreateWindow failed" << std::endl;
goto error_exit;
}
return 0;
error_exit:
std::cerr << "Last SDL error: " << SDL_GetError() << std::endl;
return -1;
}
int SDL_AppIterate(void *appstate)
{
AppState& state = *static_cast<AppState*>(appstate);
++state.iterations;
return 0;
}
int SDL_AppEvent(void *appstate, const SDL_Event *event)
{
std::cerr << "SDL_AppEvent";
if (event)
{
std::cerr << ": type = " << event->type << ", timestamp = " << event->common.timestamp << std::endl;
}
std::cerr << std::endl;
if (event->type == SDL_EVENT_QUIT)
{
std::cerr << "SDL_EVENT_QUIT" << std::endl;
return 1;
}
return 0;
}
void SDL_AppQuit(void *appstate)
{
AppState* state = static_cast<AppState*>(appstate);
std::cerr << "SDL_AppQuit after " << state->iterations << " iterations of the main loop." << std::endl;
delete state;
return;
}
}
Кажется, вы создали новый тег sdl3 . Однако уже есть тег sdl с 4969 вопросами: Simple DirectMedia Layer (SDL) — это кроссплатформенная бесплатная мультимедийная библиотека с открытым исходным кодом. . Похоже, ваш вопрос также касается Simple DirectMedia Layer (SDL), в частности версии 3.0, поэтому требуется ли новый тег? Следует ли также помечать вопросы sdl3 тегом sdl ? Можете ли вы добавить некоторые рекомендации для вашего нового тега, подобные руководству sdl-2 здесь?