На цій сторінці я покажу, як з нуля визначити та створити графічний додаток SDL2,
використовуючи лише улюблений текстовий редактор. Документ написаний для у Linux, оскільки це найкраща
платформа для вивчення програмування.
Створення зразка програми
Тепер нам потрібно створити файл вихідного коду та файл визначення збірки cmake.
Ми взагалі не будемо використовувати SDL, а почнемо з простої програми, яка лише
друкує певний текст. Як тільки вона запрацює, ми зможемо розширити її для
відображення графіки. Вихідний код зберігається у файлі main.cpp та має такий вміст:
#include<iostream>intmain(intargc,char**argv){std::cout<<"App is running.\n";return0;}
Визначення збірки зберігається у файлі з назвою CMakeLists.txt та виглядає так:
Буду старатися використовувати розумний менеджмент пам’яті. Тому підключаємо необхідні
для цього заголовки.
#include<memory>
Створимо структуру яка при вихоід з області видимоті автоматично викличе SDL_Quit().
Це обов’язково. А для початку треба ініціалізувати все, що нам потрібно функцією
SDL_Init(Uint32), яка проініціалізує потрібні нам системи.
SDL_INIT_TIMER
timer subsystem
SDL_INIT_AUDIO
audio subsystem
SDL_INIT_VIDEO
video subsystem; automatically initializes the events subsystem
SDL_INIT_JOYSTICK
joystick subsystem; automatically initializes the events subsystem
SDL_INIT_HAPTIC
haptic (force feedback) subsystem
SDL_INIT_GAMECONTROLLER
controller subsystem; automatically initializes the joystick subsystem
SDL_INIT_EVENTS
events subsystem
SDL_INIT_EVERYTHING
all of the above subsystems
Можна ініціалізувати всі потрібні системи одразу, або згодом при необхідності SDL_InitSubSystem(Uint32) ініціалізувати конкретну систему, або зупинити SDL_QuitSubSystem(Uint32) вже не потрібну систему. При виклику SDL_Quit() зупиняються всі системи.
structSDL_Guard{SDL_Guard(Uint32flags){if(0>SDL_Init(flags))throwstd::runtime_error("SDL could not initialize! SDL_Error:"+std::string(SDL_GetError()));}~SDL_Guard(){SDL_Quit();}};
Для вікна ми використаємо розумний вказівник який розглянемо трохи пізніше.
Створюємо вікно функцією SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags). Перший параметр це заголовок (назва) вікна і є собою c-string параметром. Інші параметри вказують на позицію та розміри вікна.
-
-
-
-
-
-
-
-
-
-
SDL_WINDOW_FULLSCREEN
fullscreen window
SDL_WINDOW_OPENGL
window usable with OpenGL context
SDL_WINDOW_SHOWN
window is visible
SDL_WINDOW_HIDDEN
window is not visible
SDL_WINDOW_BORDERLESS
no window decoration
SDL_WINDOW_RESIZABLE
window can be resized
SDL_WINDOW_MINIMIZED
window is minimized
SDL_WINDOW_MAXIMIZED
window is maximized
SDL_WINDOW_MOUSE_GRABBED
window has grabbed mouse input
SDL_WINDOW_INPUT_FOCUS
window has input focus
SDL_WINDOW_MOUSE_FOCUS
window has mouse focus
SDL_WINDOW_FULLSCREEN_DESKTOP
SDL_WINDOW_FOREIGN
window not created by SDL
SDL_WINDOW_ALLOW_HIGHDPI
window should be created in high-DPI mode if supported. On macOS NSHighResolutionCapable must be set true in the application’s Info.plist for this to have any effect.
SDL_WINDOW_MOUSE_CAPTURE
window has mouse captured (unrelated to MOUSE_GRABBED)
SDL_WINDOW_ALWAYS_ON_TOP
window should always be above others
SDL_WINDOW_SKIP_TASKBAR
window should not be added to the taskbar
SDL_WINDOW_UTILITY
window should be treated as a utility window
SDL_WINDOW_TOOLTIP
window should be treated as a tooltip
SDL_WINDOW_POPUP_MENU
window should be treated as a popup menu
SDL_WINDOW_KEYBOARD_GRABBED
window has grabbed keyboard input
SDL_WINDOW_VULKAN
window usable for Vulkan surface
SDL_WINDOW_METAL
window usable for Metal view
SDL_WINDOW_INPUT_GRABBED
equivalent to SDL_WINDOW_MOUSE_GRABBED for compatibility