Съдържание

 

  1. Какво е SDL?
  2. Инициализиране на SDL.
  3. Инициализиране на видео режима.
  4. Добавяне на основен цикъл на приложението. Прехващане на събития в SDL.

 

Какво е SDL?

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

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 (след като вече сме я инсталирали) трябва да я инициализираме

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //указва къде се намират header файловете
  4. #include <SDL2/SDL.h>
  5. int main (int argc, char *argv[])
  6. {
  7.      //инициализиране на SDL
  8.     //ако инициализирането е неуспешно излизаме
  9.     if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO)<0)
  10.     {
  11.     printf(„Unable to init SDL: %s\n“, SDL_GetError());
  12.     return 1;
  13.     }
  14.    //Изпълнява SDL_Quit преди завършването на програмата
  15.    atexit(SDL_Quit);
  16.    return 0;
  17. }

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

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

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // указва къде се намират header файловете
  4. #include <SDL2/SDL.h>
  5. // прозорец на приложението
  6. // Прозорецът на приложението съдържа повърхност, върху която
  7. // можем да изведаме картинки, да чертаем примитиви и т.н.
  8. SDL_Window* gWindow = NULL;
  9. int main(int argc, char *argv[])
  10. {
  11.      //инициализиране на SDL
  12.     //ако инициализирането е неуспешно излизаме
  13.     if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0) {
  14.                  printf(„Unable to init SDL: %s\n“, SDL_GetError());
  15.                  return 1;
  16.     }
  17.     //Установяване на видео режима
  18.     gWindow = SDL_CreateWindow(„SDL урок“ // заглавие на прозореца
  19.                       // x координата на прозореца.
  20.                      // Освен SDL_WINDOWPOS_UNDEFINED може да се използва конкратно число или SDL_WINDOWPOS_CENTERED
  21.                      , SDL_WINDOWPOS_UNDEFINED
  22.                     // y координата на прозореца.
  23.                     , SDL_WINDOWPOS_UNDEFINED
  24.                     , 640 // ширина на екрана
  25.                     , 480 // височина на екрана
  26.                    // флагове определящи характеристики на прозореца
  27.                    // пълният списък може да се види тук https://wiki.libsdl.org/SDL_CreateWindow#flags
  28.                   , SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE
  29.                    );
  30.          SDL_DestroyWindow(gWindow);
  31.          //Изпълнява SDL_Quit преди завършването на програмата
  32.          atexit(SDL_Quit);
  33.          return 0;
  34. }

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

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // указва къде се намират header файловете
  4. #include <SDL2/SDL.h>
  5. // прозорец на приложението
  6. // Прозорецът на приложението съдържа повърхност, върху която
  7. // можем да изведаме картинки, да чертаем примитиви и т.н.
  8. SDL_Window* gWindow = NULL;
  9. int main(int argc, char *argv[]) {
  10.      //инициализиране на SDL
  11.      //ако инициализирането е неуспешно излизаме
  12.      if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0) {
  13.      printf(„Unable to init SDL: %s\n“, SDL_GetError());
  14.      return 1;
  15.      }
  16.      //Установяване на видео режима
  17.      gWindow = SDL_CreateWindow(„SDL урок“ // заглавие на прозореца
  18.                     // x координата на прозореца.
  19.                     // Освен SDL_WINDOWPOS_UNDEFINED може да се използва конкратно число или SDL_WINDOWPOS_CENTERED
  20.                     , SDL_WINDOWPOS_UNDEFINED
  21.                    // y координата на прозореца.
  22.                    , SDL_WINDOWPOS_UNDEFINED
  23.                    , 640 // ширина на екрана
  24.                    , 480 // височина на екрана
  25.                   // флагове определящи характеристики на прозореца
  26.                   // пълният списък може да се види тук https://wiki.libsdl.org/SDL_CreateWindow#flags
  27.                  , SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE
  28.                   );
  29.      //Създаване на основен цикъл и прехващане на събитията излизане от приложението и
  30.     //натискане на клавиша escape
  31.     //done – променлива управляваща влизането и излизането от основният цикъл
  32.     bool done = false;
  33.     //основен цикъл на приложението.
  34.     while (!done) {
  35.           //цикъл за прихващане на съобщенията
  36.          //SDL_Event – глобална структура служаща за описание на всички събития в SDL
  37.          SDL_Event event;
  38.         //проверка на текущите чакащи събития
  39.         while (SDL_PollEvent(&event)) {
  40.               //ако излизаме от приложението (с Alt-F4 или друг изход)
  41.               if (event.type == SDL_QUIT) {
  42.                   done = 1;
  43.                } //Ако сме натиснали клавиш
  44.                else if (event.type == SDL_KEYDOWN) {
  45.                       //Ако сме натиснали клавиша escape
  46.                       if (event.key.keysym.sym == SDLK_ESCAPE) {
  47.                          done = 1;
  48.                       }
  49.                   }
  50.            }
  51.     }
  52.    SDL_DestroyWindow(gWindow);
  53.    //Изпълнява SDL_Quit преди завършването на програмата
  54.    atexit(SDL_Quit);
  55.    return 0;
  56. }

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

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

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

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

Автор: Янко Попов