InSDL - это небольшой C++ фреймворк поверх SDL3, SDL3_ttf и SDL3_image. Он упрощает запуск приложения, ввод, отрисовку, работу с текстом, текстурами и WAV-аудио.
Фреймворк находится в пространстве имен insdl и предоставляет удобные псевдонимы:
insdl::Appinsdl::Rectinsdl::Textureinsdl::Textinsdl::Audioinsdl::InputState
Главный заголовок:
#include <InSDL/InSDL.hpp>Он подключает все публичные заголовки фреймворка и определения SDL scancode.
В репозитории уже есть нужные заголовки и библиотеки SDL в include/ и lib/.
Файл makefile собирает пример из src/main.cpp:
makeПолезные цели:
make compileсобирает исполняемый файлmake runзапускает егоmake cleanудаляет артефакт сборки
Если нужно собрать другой файл, укажите SRC:
make SRC=examples/my_game.cppЕсли вы используете InSDL в своем проекте, добавьте include/ в пути компилятора и линкуйте:
SDL3SDL3_ttfSDL3_image
Минимальное приложение:
#include <InSDL/InSDL.hpp>
int main() {
insdl::App app;
app.init(800, 600, "My InSDL App");
while (!app.quit) {
insdl::handleEvent(app);
app.clear();
app.update();
}
return 0;
}Что здесь происходит:
- создается окно
- настраивается SDL-рендеринг
- каждый кадр обрабатываются события
- очищается экран
- показывается кадр
app.init() поддерживает два режима:
app.init(width, height, title, surface = false, resizeable = false, fontPath = "");surface = falseиспользуетSDL_Renderersurface = trueиспользуетSDL_Surface
Рекомендуется для большинства задач.
Плюсы:
- работа с текстурами
- отрисовка текста
- прямоугольники с вещественными координатами
- поворот и отражение текстур
Подходит для более простого «software-style» рисования.
Плюсы:
- прямое заполнение поверхности
- для базовой заливки не нужен renderer
Ограничения:
- helpers для текста и текстур рассчитаны на renderer-режим
Фреймворк ожидает такой порядок внутри игрового цикла:
while (!app.quit) {
insdl::handleEvent(app);
// логика игры
app.update();
}Важно:
handleEvent(app)обновляет состояние ввода и вызывает привязанные обработчикиapp.update()показывает кадр и обновляет delta time- вызывать
handleEvent(app)нужно один раз за кадр перед чтением input
Главный объект приложения, который хранит окно, renderer или surface, состояние ввода и таблицы привязок.
insdl::App app;Класс нельзя копировать и перемещать. Деструктор автоматически вызывает exit().
void init(int width, int height, std::string name, bool surface = false, bool resizeable = false, std::string fontPath = "")
Инициализирует SDL, создает окно и настраивает либо renderer, либо window surface.
width,height: размер окнаname: заголовок окнаsurface:trueдля surface-режима,falseдля renderer-режимаresizeable: включает изменение размера окнаfontPath: необязательный путь к шрифту для текста
Если fontPath пустой, InSDL использует встроенный шрифт по умолчанию.
Возвращает true, если приложение успешно инициализировалось.
Возвращает последнее сообщение об ошибке фреймворка.
Возвращает указатель на SDL-окно.
Возвращает renderer в renderer-режиме, либо nullptr в surface-режиме.
Возвращает window surface в surface-режиме, либо nullptr в renderer-режиме.
Очищает кадр текущим сохраненным цветом.
Устанавливает текущий цвет и заливает фон кадра.
Псевдоним для clear().
Показывает текущий кадр.
- в renderer-режиме вызывает
SDL_RenderPresent() - в surface-режиме вызывает
SDL_UpdateWindowSurface() - обновляет delta time кадра
Возвращает время в секундах между двумя последними вызовами update().
Устанавливает иконку окна из объекта texture.
Меняет путь к шрифту, который будет использоваться для новых объектов текста.
Меняет сохраненные размер окна и/или заголовок.
-1оставляет размер без изменений- пустое имя сохраняет текущий заголовок
Привязывает функции к нажатию и отпусканию клавиши.
funcвызывается при нажатииfuncUpвызывается при отпускании
Привязывает функцию к нажатию кнопки мыши.
Привязывает функцию к движению мыши.
Колбэк получает int x, int y.
Освобождает SDL-ресурсы и завершает приложение.
bool quitstd::vector<...> keyBindingsstd::vector<...> keyUpBindingsstd::vector<...> mouseBindingsstd::vector<...> mouseMotionBindingsinsdl::inputState inputcolorStruct colorwindowStruct windowDatastd::string font
Обычно напрямую нужны только quit, input и иногда font.
Обрабатывает SDL-события:
- выход из приложения
- нажатие клавиш
- отпускание клавиш
- нажатие кнопок мыши
- движение мыши
Также обновляет app.input.
Устаревший helper, который проверяет только SDL_EVENT_QUIT.
В обычной работе не нужен. Используйте handleEvent(app).
Состояние ввода по кадрам.
Сбрасывает флаги pressed/released для нового кадра и обновляет позицию мыши.
Помечает клавишу как удерживаемую и выставляет pressed в первый кадр нажатия.
Помечает клавишу как отпущенную и выставляет released в текущем кадре.
Сохраняет последние координаты мыши.
Возвращает true, пока клавиша удерживается.
Возвращает true только в кадр, когда клавиша нажата.
Возвращает true только в кадр, когда клавиша отпущена.
Возвращают координаты мыши как целые числа.
Возвращают координаты мыши как float.
Помощник для прямоугольников, который автоматически подстраивается под surface- или renderer-режим.
insdl::Rect rect(app, x, y, w, h);Создает прямоугольник, связанный с указанным приложением.
setRect(int x, int y, int w, int h)setPosition(int x, int y)setSize(int w, int h)setX(int x)setY(int y)setWidth(int w)setHeight(int h)addX(int x)addY(int y)addWidth(int w)addHeight(int h)subX(int x)subY(int y)subWidth(int w)subHeight(int h)
int getX()int getY()int getWidth()int getHeight()rectData getData()
getData() возвращает копию внутренней структуры.
Заполняет прямоугольник цветом.
- если компонент равен
-1, используется сохраненное значение
В surface-режиме перерисовывает прямоугольник его сохраненным цветом.
void fillTexture(texture* textureObject, double deg = 0, SDL_FlipMode mode = SDL_FLIP_NONE, SDL_FPoint point = {0, 0})
Рисует текстуру внутри прямоугольника в renderer-режиме.
Рисует текст внутри прямоугольника в renderer-режиме.
Возвращает true, если два прямоугольника пересекаются.
Возвращает true, если курсор мыши находится внутри прямоугольника.
operator<< печатает геометрию и цвет.
RAII-обертка над SDL surface и texture, загруженными из файла изображения.
insdl::Texture texture(app.renderer(), "assets/image.png");Конструктор требует валидный renderer.
Возвращает true, если изображение и texture успешно загружены.
Возвращает последнюю ошибку текстуры.
Освобождает surface и texture.
Возвращает копию внутренней структуры.
operator<< печатает путь к файлу.
RAII-обертка для текста, отрисованного через SDL_ttf.
insdl::Text title(app.renderer(), "Hello", app.font, 255, 255, 255);Параметры:
renderer: валидный SDL renderertextContent: строка текстаfontPath: путь к.ttfшрифтуr,g,b: цвет текста
Возвращает true, если шрифт, surface и texture готовы.
Возвращает последнюю ошибку текста.
Освобождает surface, texture и шрифт.
Перерисовывает текст с новым содержимым.
Меняет цвет текста и перерисовывает его.
-1сохраняет текущий канал
Возвращает копию внутренней структуры текста.
operator<< печатает строку, путь к шрифту и RGB-цвет.
RAII-обертка для воспроизведения WAV.
insdl::Audio sound("assets/click.wav");Загрузчик ожидает WAV-файл.
Возвращает true, если WAV-данные, audio stream и устройство готовы.
Возвращает последнюю ошибку аудио.
Добавляет загруженные WAV-данные в очередь воспроизведения.
Возобновляет audio device.
Ставит audio device на паузу.
Останавливает воспроизведение и освобождает ресурсы.
Возвращает копию внутренней структуры аудио.
operator<< печатает путь к WAV-файлу.
Помощники для сна потока через std::this_thread::sleep_for.
Примеры:
insdl::delayMs(16);
insdl::delaySec(1);#include <InSDL/InSDL.hpp>
int main() {
insdl::App app;
app.init(800, 600, "Input Demo");
while (!app.quit) {
insdl::handleEvent(app);
if (app.input.isKeyPressed(SDL_SCANCODE_SPACE)) {
app.fill(30, 30, 30);
}
if (app.input.isKeyDown(SDL_SCANCODE_W)) {
// движение вверх
}
app.update();
}
}insdl::Rect box(app, 50, 50, 200, 120);
box.fill(255, 80, 80);insdl::Text label(app.renderer(), "Hello SDL", app.font, 255, 255, 255);
insdl::Rect area(app, 20, 20, 300, 80);
area.fillText(&label);insdl::Texture image(app.renderer(), "assets/logo.png");
insdl::Rect slot(app, 100, 100, 256, 256);
slot.fillTexture(&image);insdl::Audio click("assets/click.wav");
if (click.ok()) {
click.play();
}Texture,TextиAudioявляются объектами только для перемещения.TextиспользуетTTF_RenderText_Solid, поэтому лучше всего подходит для простого одноцветного текста.Audioсейчас рассчитан на WAV-файлы.handleEvent(app)нужно вызывать один раз за кадр перед чтением состояния ввода.exitEvent(app)оставлен для совместимости, но в обычной работе не нужен.