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).

SDL 1.2 test application simple example

Итоги

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

Добавить комментарий

Ваш e-mail не будет опубликован.