Предисловие. SDL - библиотека предоставляет доступ к видео и аудио оборудованию вашего компьютера, а также к устройствам ввода, таким как мышь, клавиатура и джойстик. Эту библиотеку используют в самых различных программах, начиная от MPEG-проигрывателей и заканчивая эмуляторами. Но по большей части SDL используется для создания игр. Например таких как Tribes и Civilization: Call to Power.
SDL по своим возможностям очень напоминает Microsoft DirectX API. Но поддерживает большое число операционных систем (то есть ваши программы будут работать в нескольких операционных системах) и имеет интерфейс с многими языками программирования. Библиотека написана на Си (хотя прекрасно работает с С++), но поддерживает очень много других языков, даже такие как Perl, Python и PHP! Поддерживаемые операционные системы: Linux, BeOS, MacOS, Solaris, FreeBSD, IRIX, Win32. Распространяется библиотека по лицензии GNU Lesser General Public License version 2. Это означает, что вы можете без проблем создавать коммерческие программы.
SDL создал замечательный человек Sam Lantinga, который работает в компании Blizzard Entertainment и работал в компании Loki Entertainment Software ведущим программистом. История SDL начинается с времен, когда Сэм работал над программой эмулятором Макинтош для Windows. Он заметил, что многие куски кода без проблем могут работать в Linux. И он решил создать небольшую библиотеку, чтобы ей могли воспользоваться другие программисты. В октябре 1997 был выпущен релиз библиотеки с версией 0.3, а позже эту библиотеку во всю использовала компания Loki Software для портирования игр под Linux.
Как говорит Сэм, сравнивать SDL и DirectX все равно что сравнивать апельсин и яблоко. Единственное сходство в том, что это фрукты. SDL предоставляет значительно более простой API, чем DirectX. SDL изначально создана для 2D-графики и не имеет непосредственно функций для 3D-графики, но прекрасно дружит с OpenGL. Для поддержки сетевых функций можно использовать библиотеку SDL_net.
Конечно, выбор библиотеки для своего проекта - личное дело каждого, но все-таки SDL является бесспорным лидером для создания игр или мультимедиа-программ. Если вы не хотите использовать SDL для своей игры, то все равно рекомендую ознакомиться с приемами работы с библиотекой, чтобы повысить уровень своего образования.
Установка.
Прежде чем устанавливать библиотеку SDL, необходимо ее где-нибудь взять. Самую последнюю версию можно всегда найти на официальном сайте www.libsdl.org. Там можно достать не только библиотеку SDL для всех поддерживаемых платформ, но и другие библиотеки для облегчения программирования SDL-приложений. Например для работы с практически любыми графическими форматами SDL Image или для работы со звуком SDL mixer и очень много других библиотек, в том числе и для облегчения разработки игр. Там же вы найдете огромное количество документации.
Об установке SDL в операционных системах отличных от Linux можно найти в пакетах для этих систем. Например для установки в Win32 для Visual C++ нужно всего лишь скопировать sdl.dll в системную папку и распаковать файлы из архива (который качаете с сайта) в папку с Visual C++. Практически во все дистрибутивы Linux библиотека включена по умолчанию. Поэтому просто выбирайте ее при инсталяции. Кроме того, просто необходимо установить пакет SDL-devel, который нужен для разработки SDL-программ.
Если вы не имеете в системе установленного пакета SDL (проверить можно так: rpm -qa | grep SDL), то ставите так:
rpm -ivh SDL-x.x.x-xxx.rpm
или компилируете исходники make, make install. Если будут ошибки при компиляции ваших программ, после установки библиотеки из исходников выполните команду ldconfig (естественно от рута).
Еще одна важная часть установки - установка документации по библиотеки SDL. Если в вашей системе нету документации (обычно в /usr/share/doc), то загрузите ее с сайта.
Еще одна неприятность может возникнуть при работе приложений в полноэкранном режиме. Если программа установит разрешение экрана меньше чем текущий, то возможно, что изображение будет сфокусировано в центре, а вокруг черная рамка. Это лечится правкой XF86Config. Просто добавьте поддержку этого режима. Вот пример:
Code
Section "Screen"
Identifier "Screen 1"
Device "3dfx"
Monitor "Samsung LCD"
DefaultDepth 16
Subsection "Display"
Depth 8
Modes "1280x1024" "1024x768" "800x600" "640x480" "320x240"
ViewPort 0 0
EndSubsection
Subsection "Display"
Depth 16
Modes "1280x1024" "1024x768" "800x600" "640x480"
ViewPort 0 0
EndSubsection
EndSection
Добавлено (10/12/08, 11:40)
---------------------------------------------
Компиляция.
Давайте рассмотрим очень важный вопрос: как компилировать программы, использующие библиотеку SDL. Что касается компиляции под платформу, отличную от Linux, внимательно ознакомьтесь с документацией для этой платформы. Например, чтобы компилировать программы в среде Visual C++, прочтите файл VisualC.html, который находится в архиве для Visual Studio (см. www.libsdl.org). Еще я просто рекомендую прочитать SDL FAQ, который можно найти все на том же сайте. Пока я расскажу как компилировать программы для Linux.
И так, мы будем использовать компилятор g++ (используйте gcc, если пишете на Си). Сначала рассмотрим все, что касается #include. При подключении заголовков SDL к программе (обычно они находятся в /usr/include/SDL) мы делаем так: #include "SDL.h". А потом указываем компилятору, где искать ненайденные заголовки (как вы помните, если заголовок в команде #include взят в кавычках, то он должен быть в текущей директории). Это нужно для переносимости программ, потому что не у всех заголовки будут лежать там же, где и у вас. При компиляции подставляем в качестве опции:
-I/usr/include/SDL
Или другой путь, если он у вас отличается от моего. Нам также нужно указать сами библиотеки, которые будем линковать к нашей программе, а также путь к этим библиотекам: -L/usr/lib указывает путь к библиотекам, а -lSDL линкует библиотеку libSDL.so к программе(опция -L указывает путь к библиотекам, а опция -l линкует библиотеку).
Соберем все в кучу. Я приведу листинг небольшой програмки, использующей SDL. Вы можете не стараться вникнуть в код, потому что все это разберем далее в уроках.
Code
#include "SDL.h"
#include <stdio.h>
int main() {
printf("Initializing SDL.\n");
if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) {
printf("Could not initialize SDL: %s.\n", SDL_GetError());
exit(-1);
}
printf("SDL initialized.\n");
printf("Quiting SDL.\n");
SDL_Quit();
printf("Quiting....\n");
return 0;
}
Пример взят из SDL Documentation. Назовите его test.cxx и давайте попробуем его собрать.
Code
g++ -O3 -o test test.cxx -I/usr/include/SDL -L/usr/lib -lSDL
Флаг -O3 задает уровень оптимизации (-O3 задает максимальный уровень, по умолчанию используется -O2).
Флаг -o задает имя программы на выходе.
Все остальное я уже рассказал. Но существует более элегантный способ задать флаги компиляции SDL. Просто выполните команду sdl-config --cflags --libs. Все необходимые для компиляции флаги SDL будут на выходе этой программы. То есть мы могли бы сделать так:
Code
g++ -O3 -o test test.cxx `sdl-config --cflags --libs`
Где эту команду нужно поместить между знаков ` (это там где тильда ~).
Если проект большой и состоит из многих файлов, то компилировать каждый неудобно и сложно. По этому приготовьтесь получить CRASH-курс по утилите make.
Наверно не раз собирали какую-нибудь программу, набирая в консоли make. Согласитесь, это гораздо проще, чем компилировать каждый файл проекта примерно так же, как я показывал (см. выше). Чтобы работать с утилитой make, вы должны создать файл с именем "Makefile" в директории с проектом. Теперь возьмем пример простого make-файла для нашей тестовой программы, чтобы было легче разобраться:
Code
TARGET = test
LIBS = `sdl-config --libs`
CFLAGS = -O3 `sdl-config --cflags`
CC = g++
all:
$(CC) $(CFLAGS) -c test.cxx -o test.o
$(CC) -o $(TARGET) test.o $(LIBS)
strip $(TARGET)
clean:
rm *.o
rm $(TARGET)
На первый взгляд немного сложно, но только на первый. И так, начнем по порядку. В верхней части мы задаем переменные: TARGET - имя программы на выходе, LIBS - какие библиотеки использовать, CFLAGS - уровень оптимизации и путь к заголовочным файлам библиотеки SDL, CC - имя выполняемого файла компилятора. Использовать переменные нужно так: $(ПЕРЕМЕННАЯ), т.е. заключать в круглые скобки и перед скобками ставить знак доллара. С переменными все ясно (надеюсь), теперь дальше: в make-файлах самое главное это так называемые цели (target). В нашем примере две цели - это all и clean. С новой строки мы пишем правила для сборки цели - команды, которые нам нужны. Не забудьте начинать каждую строку правил с нажатия кнопки TAB. Это обязательно. Если получите ошибку make-файла, то в первую очередь проверьте, расставлены ли знаки табуляции. Очень удобно в этом плане использовать редактор Midnight Commander, который подсвечивает табуляцию. В нашем случае мы сначала создаем object-файл, а потом программу. Строка
Code
$(CC) $(CFLAGS) -c test.cxx -o test.o
эквивалентна
Code
g++ -O3 -I/usr/include/SDL -c test.cxx -o -test.o
Опция компилятора -с указывает, что нужно пропустить финальную стадию компиляции (линковку), а создать только объектный файл. И следующая строка
Code
$(CC) -o $(TARGET) test.o $(LIBS)
эквивалентна
Code
g++ -o test test.o -I/usr/lib -lSDL
Пути могут отличаться в зависимости от системы. Команда stripоптимизирует исполняемый файл программы. Цель clean удаляет объектные файлы и запускаемый файл программы. Чтобы выполнить цель clean нужно выполнить команду make clean. Для выполнения цели all достаточно просто выполнить команду make. На самом деле синтаксис make-файлов гораздо обширнее и сложнее, но если овладеть им, то ваша жизнь облегчится во много раз. В интернете можно найти очень много информации по утилите make.