Първи стъпки с SDL

Какво е SDL?

SDL (Simple DirectMedia Layer) предоставя достъп до апаратните средства на компютъра – видео, аудио, клавиатура, джойстик, мишка и др.

Използва се за извеждане на поточно видео, създаване на игри и т.н. Съществуват и много разширения (библиотеки), които обогатяват SDL. Например SDL може да работи само с графични файлове BMP, но с помощта на SDL_image.dll можем да работим и с голямо разнообразие от други графични файлови формати (.jpg, png, gif и др.). По възможностите си наподобява DirectX, но за разлика от него е междуплатформена библиотека работеща под Windows, Linux, BSD и др.

Примерите могат да се компилират с:
g++ -o test test.cpp `sdl2-config --cflags --libs`
където test.cpp е кода на примера, а test е името на изпълнимият файл.

SDL (както и много бибилиотеки за SDL, примери, игри и документация) може да се свали от официалния й сайт www.libsdl.org. Освен това ралични програмни езици CPP, Pascal, Python, Perl могат директно, с библиотеки или модули да работят с SDL.

Всъщност има две основни версии на SDL – SDL 1.2 и SDL 2. За съжаление двете не са съвместими. SDL 2 представлява голямо подобрение спрямо версия 1.2 – при версия 2 имаме възможност за работа с Android, подобрена работа с UTF-8, чертаене на примитиви, съществени изменения в графичната част и много други.
Урокът ще използва SDL 2. Предполага се, че читателят може да си инсталира библиотеката (линк за сваляне) и да я ползва с подходяща среда за разработка. Урокът е за начинаещи.

Инициализиране на SDL.

За да може да работим с SDL (след като вече сме я инсталирали) трябва да я инициализираме

#include <stdio.h>
#include <stdlib.h>
//указва къде се намират header файловете
#include <SDL2/SDL.h>
int main (int argc, char *argv[])
{
     //инициализиране на SDL
    //ако инициализирането е неуспешно излизаме
    if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO)<0)
    {
    printf("Unable to init SDL: %s\n", SDL_GetError());
    return 1;
    }
   //Изпълнява SDL_Quit преди завършването на програмата
   atexit(SDL_Quit);
   return 0;
}

Горната програма, ако се компилира, няма да извърши нищо съществено, но самият факт, че се компилира, би било успех, тъй като това показва, че сме инсталирали SDL.
Първата функция от библиотеката, с която се сблъскваме, е SDL_Init(). Тя приема само един параметър – флагове за инициализация и при неуспех връща число по-малко от 0. Флаговете SDL_INIT_AUDIO и SDL_INIT_VIDEO, разделени с |, инициализират аудио и видео подсистемите. Други флагове са SDL_INIT_TIMER, SDL_INIT_CDROM, SDL_INIT_JOYSTICK и т.н.

Инициализиране на видео режима.

Ще допълним горната програма, добавяйки инициализиране на видео режима.

#include <stdio.h>
#include <stdlib.h>
// указва къде се намират header файловете
#include <SDL2/SDL.h>
// прозорец на приложението
// Прозорецът на приложението съдържа повърхност, върху която
// можем да изведаме картинки, да чертаем примитиви и т.н.
SDL_Window* gWindow = NULL;
int main(int argc, char *argv[])
{
     //инициализиране на SDL
    //ако инициализирането е неуспешно излизаме
    if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0) {
                 printf("Unable to init SDL: %s\n", SDL_GetError());
                 return 1;
    }
    //Установяване на видео режима
    gWindow = SDL_CreateWindow("SDL урок" // заглавие на прозореца
                      // x координата на прозореца.
                     // Освен SDL_WINDOWPOS_UNDEFINED може да се използва конкратно число или SDL_WINDOWPOS_CENTERED
                     , SDL_WINDOWPOS_UNDEFINED
                    // y координата на прозореца.
                    , SDL_WINDOWPOS_UNDEFINED
                    , 640 // ширина на екрана
                    , 480 // височина на екрана
                   // флагове определящи характеристики на прозореца
                   // пълният списък може да се види тук https://wiki.libsdl.org/SDL_CreateWindow#flags
                  , SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE
                   );
         SDL_DestroyWindow(gWindow);
         //Изпълнява SDL_Quit преди завършването на програмата
         atexit(SDL_Quit);
         return 0;
}

Горната програма инициализира SDL, подсистемата за видеото показва прозореца и завършва програмата

Добавяне на основен цикъл на приложението.
Прехващане на събития в SDL.

#include <stdio.h>
#include <stdlib.h>
// указва къде се намират header файловете
#include <SDL2/SDL.h>
// прозорец на приложението
// Прозорецът на приложението съдържа повърхност, върху която
// можем да изведаме картинки, да чертаем примитиви и т.н.
SDL_Window* gWindow = NULL;
int main(int argc, char *argv[]) {
     //инициализиране на SDL
     //ако инициализирането е неуспешно излизаме
     if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0) {
     printf("Unable to init SDL: %s\n", SDL_GetError());
     return 1;
     }
     //Установяване на видео режима
     gWindow = SDL_CreateWindow("SDL урок" // заглавие на прозореца
                    // x координата на прозореца.
                    // Освен SDL_WINDOWPOS_UNDEFINED може да се използва конкратно число или SDL_WINDOWPOS_CENTERED
                    , SDL_WINDOWPOS_UNDEFINED
                   // y координата на прозореца.
                   , SDL_WINDOWPOS_UNDEFINED
                   , 640 // ширина на екрана
                   , 480 // височина на екрана
                  // флагове определящи характеристики на прозореца
                  // пълният списък може да се види тук https://wiki.libsdl.org/SDL_CreateWindow#flags
                 , SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE
                  );
     //Създаване на основен цикъл и прехващане на събитията излизане от приложението и
    //натискане на клавиша escape
    //done – променлива управляваща влизането и излизането от основният цикъл
    bool done = false;
    //основен цикъл на приложението.
    while (!done) {
          //цикъл за прихващане на съобщенията
         //SDL_Event – глобална структура служаща за описание на всички събития в SDL
         SDL_Event event;
        //проверка на текущите чакащи събития
        while (SDL_PollEvent(&event)) {
              //ако излизаме от приложението (с Alt-F4 или друг изход)
              if (event.type == SDL_QUIT) {
                  done = 1;
               } //Ако сме натиснали клавиш
               else if (event.type == SDL_KEYDOWN) {
                      //Ако сме натиснали клавиша escape
                      if (event.key.keysym.sym == SDLK_ESCAPE) {
                         done = 1;
                      }
                  }
           }
    }
   SDL_DestroyWindow(gWindow);
   //Изпълнява SDL_Quit преди завършването на програмата
   atexit(SDL_Quit);
   return 0;
}

Горният код също няма особена нужда от разяснения.
Ако стартираме горната програма, ще видим само един празен прозорец, основа на евентуално бъдещо приложение.

Върху този прозорец ние не показваме нищо, така че той е „невидим“ – ще видите ясно заглавната част и рамката :-)

Но все пак това е само началото.

Приятно кодиране!