SDL (Simple Directmedia Layer). С чего начать?
SDL является наиболее удобным средством разработки игр для начинающих игроделов за счет своей простоты. В посте речь пойдет об установке необходимых библиотек и компиляции простейшего приложения.
Установка
Для нашего проекта потребуется библиотека libsdl1.2-dev, которая присутствует в большинстве дистрибутивов linux. Если вы работаете в системе Ubuntu, то для установки достаточно выполнить команду в терминале:
sudo apt-get install libsdl1.2-dev
В статье речь идет о версии 1.2. На данный момент доступна 2.0.
Подготовка проекта
В данном случае я рекомендую создать папку для проекта с именем sdltest и поместить туда файлы Makefile и main.cpp. Makefile предлагаю сделать более универсальным в отличие от тех, что присутствовали в предыдущих статьях. Вот его содержание:
TARGET = sdltest CC = g++ CFLAGS = -std=c++11 LIBS = -lSDL SRCS = $(wildcard *.cpp) OBJS = $(patsubst %.cpp, %.o, $(SRCS)) $(TARGET): $(OBJS) $(CC) $(OBJS) -o $(TARGET) $(LIBS) %.o: %.cpp $(CC) $(CFLAGS) -c $< -o $@ clean: rm $(TARGET) *.o
Если вкратце, то бинарник будет называться sdltest. Опцией -lSDL подключаем основную библиотеку. Основную, так как существует множество расширений, работающих с графикой, звуком и т.п.. Мы пока ограничимся базовыми функциями. Инструкция $(wildcard *.cpp) преобразуется в перечень файлов, оканчивающихся на .cpp, присутствующих в данной папке. В переменной OBJS будет храниться тот же перечень, но с расширениями .o. Следующий набор целей (кроме clean) существует для получения объектных файлов из соответствующих исходников с последующей компоновкой.
Таким образом, не важно — как будут называться файлы исходников. Все они будут скомпилированы и скомпонованы.
Исходник
А теперь перейдем к написанию кода. Содержание main.cpp будет выглядеть так:
#include <SDL/SDL.h> using namespace std; int main(int argc, char* argv[]) { SDL_Surface* pic; SDL_Surface* back; SDL_Init(SDL_INIT_EVERYTHING); back = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE); pic = SDL_LoadBMP("test.bmp"); SDL_BlitSurface(pic, NULL, back, NULL); SDL_Flip(back); SDL_Delay(5000); SDL_Quit(); return 0; };
В исходнике мы объявили две переменные для отображаемых поверхностей с именами pic и back. Первая из них для хранения пользовательского изображения, а вторая существует для демонстрации этого изображения.
По правилам использования SDL, мы инициализируем систему функцией SDL_Init. Инициализация всех подсистем указана для простоты понимания. Далее видно, что выбрано разрешение — 640х480 с 32 битами на пиксель. Флаг SDL_HWSURFACE влияет на схему обработки и хранения изображения, о чем можно прочитать по ссылке в конце статьи. Затем загружаем картинку с именем test.bmp, и с помощью SDL_BlitSurface отображаем её на поверхность back. Если требуется отрисовать фрагмент изображения и в определенном месте, то вместо NULL нужно передать соответствующие структуры.
Рисование на поверхности не гарантирует появления результата на экране. Поэтому после отрисовки сцены необходимо вызвать функцию SDL_Flip. Для того, чтобы успеть рассмотреть картинку, используем задержку в 5 секунд: SDL_Delay(5000).

Итоги
В данном примере не обсуждались возможные утечки памяти, оптимизация изображений и тому подобные вещи. Более подробный материал можно изучить здесь.
Добавить комментарий