Частина 3 - Перші кроки

Розділ 3 - перші кроки

У цьому підручнику передбачається, що Ви знайомі з процедурами, функціями, циклами, вказівниками та стандартними командами Free Pascal або його діалектів. Якщо це не так, Вас можуть очікувати проблеми, оскільки цей посібник розглядає особливості та використання бібліотеки SDL 2.0 і не пояснює основні поняття програмування на Паскалі. Для швидкого оновлення знань з основ Паскаля загляньте в цю (хорошу) статтю Modern Object Pascal Introduction For Programmers by Michalis Kamburelis (англійською).

Ви можете легко скопіювати приклад сирцевого коду безпосередньо з вікна сирцевого коду для кожного розділу.

Модуль SDL2 та перша програма

Давайте вже починати. Найважливішим правилом для підготовки до використання SDL 2.0 у програмах Pascal є:

Завжди підключайте модуль SDL2 в розділ uses.

Модуль SDL2 - це серце кожної програми, що використовує бібліотеку SDL 2.0! Коли Ви це зробите, тоді Ви повністю готові розпочинати кодування.

Різні функції SDL 2.0 (робота з екраном / відео, обробка аудіо, клавіатура тощо) повинні ініціалізуватися окремо, використовуючи наступну функцію

SDL_Init(flags:UInt32):SInt32

У разі успішного виконання вона повертає 0, в негативний код помилки в разі збою. Ви можете здивуватись типам змінних SInt32 та UInt32 в оголошенні функції SDL_Init. Такі цілочисельні типи (як ми знову побачимо в наступних частинах) походять від оригінального коду SDL 2.0 на мові C. Для зручності перекладу на Free Pascal їх зберегли. S та U означає “signed” (допустимі негативні значення) та “unsigned” (лише значення рівні або більші нуля), Int означає “integer” (ціле) і число означає кількість значимих біт. Отже, UInt32 це 32-бітне беззнакове ціле (що відповідає в Free Pascal типу longword).

У першому прикладі ми хочемо ініціалізувати відеопідсистему SDL 2.0 для обробки екрану. Наступний приклад коду показує каркас типової програми SDL 2.0.

program Chapter3_SDL2;

uses SDL2;

begin

  //ініціалізація відеопідсистеми
  if SDL_Init( SDL_INIT_VIDEO ) < 0 then HALT;

  //Ваша гра/програма з SDL2

  //зупинка відеопідсистеми
  SDL_Quit;

end.

Замість SDL_INIT_VIDEO Ви можете ініціалізувати відповідну підсистему, викристовуючи SDL_INIT_AUDIO для аудіопідсистеми, SDL_EVENTS для підсистеми обробки подій, і т.д. У таблиці наведено огляд усіх можливих прапорців та їхні значення:

ПрапорецьОпис
SDL_INIT_TIMERІніціює підсистему таймера для обробки подій, пов’язаних з часом.
SDL_INIT_AUDIOІніціює підсистему аудіо для відтворення музики або звукових ефектів.
SDL_INIT_VIDEOІніціює відеопідсистему для малювання / показу / маніпулювання графікою, текстурами та екраном, як правило, найважливіша підсистема.
SDL_INIT_JOYSTICKІніціює підсистему джойстика для роботи з джойстиками.
SDL_INIT_HAPTICІніціалізує підсистему гаптичного зв'язку (зворотного зв'язку).
SDL_INIT_GAMECONTROLLERІніціює підсистему ігрового контролера.
SDL_INIT_EVENTSІніціює підсистему подій для обробки введення від миші або клавіатури.
SDL_INIT_EVERYTHINGІніціалізує всі вищезазначені підсистеми.
SDL_INIT_NOPARACHUTEІгнорує фатальні сигнали. В SDL2 це встановлено по замовчуванню і цей стан неможливо змінити. Пояснення наведено в офіційному керівництві з міграції, який я наведу тут: Парашута SDL більше немає. Те, що в SDL1.2 називалось SDL_INIT_NOPARACHUTE зараз є типовим та єдиним станом. Це може викликати проблеми, якщо щось окрім головного потоку збоїть, і це заважатиме додаткам налаштовувати власні обробники сигналів / винятків. Недоліком є ​​те, що деякі платформи погано очищають повноекранне відео при збоях. Вам слід встановити власний обробник збоїв, або викликати SDL_Quit() в функції atexit() function чи якщо це викликає занепокоєння. Зверніть увагу, що на платформах Unix SDL все ще ловить SIGINT і відображає його до події SDL_QUIT.

Звичайно, можна поєднувати кілька компонентів за допомогою OR, напр. “SDL_Init(SDL_INIT_VIDEO OR SDL_INIT_AUDIO)” для ініціалізації підтримки відео та аудіо. Якщо Ви вже запустили деякі підсистеми, але Вам потрібно завантажити інші, використовуйте

SDL_InitSubSystem(flags:UInt32):Integer

Знову 0 повертається у випадку успішного виконання і від'ємний код у разі помилки.

Вихід із програм

Кожна програма SDL має завершуватись викликом

SDL_Quit.

Це очищає Вашу систему. Ніколи цього не забувайте! Ця процедура забезпечує вивантаження всіх ініційованих підсистем. Також є відповідна процедура для вивантаження специфічної підсистеми, визначена як

SDL_QuitSubSystem(flags:UInt32).

Ця функція дозволяє Вам вийти з двох або більше підсистем за допомогою оператора OR. Рекомендується завжди завершувати програми SDL 2.0 за допомогою SDL_Quit навіть якщо Ви попередньо вийшли з усіх підсистем за допомогою SDL_QuitSubSystem

Тепер Ви можете спробувати приклад програми. Ви не побачите багато, але якщо Ви не отримали повідомлення про помилку, то досягли успіху. Перш ніж продовжити, давайте швидко розглянемо обробку помилок.

Функції та помилки SDL 2.0

Кожна функція SDL 2.0 повертає для Вас значення помилки щоб перевірити чи функція спрацювала коректно під час виконання. Значення, що повертаються, мають цілочисельний тип або тип вказівника. Не існує загального правила, які значення відповідають якому статусу. У SDL 2.0 зазвичай ціле значення 0 означає "функція успішно працює / запущена", значення нижче 0 відповідають статусу "функцію неможливо запустити, щось не так". Для покажчиків nil означає помилку, а будь-який ненульовий покажчик означає успіх. Однак у більшості випадків я не буду перевіряти помилки, щоб зберегти приклади коду короткими. Я згадаю значення помилок, які слід очікувати.

Ви повинні знати, що існує функція, яка називається

SDL_GetError: PAnsiChar

яка перекладає останню отриману помилку в повідомлення (типу PAnsiChar) яке може прочитати та роздрукувати на екрані будь-яка функція, яка також може обробляти рядки (наприклад, загальна функція Pascal write ()). Оскільки SDL 2.0 написана на мові C, використовується тип PAnsiChar на відміну від типу String (який частіше зустрічається серед програмістів на Pascal для зберігання та обробки повідомлень).

Швидкий спосіб повернути повідомлення про помилку - скористатися функцією вікна повідомлення SDL2:

SDL_ShowSimpleMessageBox(flags: UInt32; title: PAnsiChar; _message: PAnsiChar; window: PSDL_Window): Integer

Прапорці для вікна повідомлення можуть бути:

  • SDL_MESSAGEBOX_ERROR
  • SDL_MESSAGEBOX_WARNING
  • SDL_MESSAGEBOX_INFORMATION

Поки прапорці вказують причину вікна повідомлення, аргументи заголовка та повідомлення використовуються для встановлення заголовка вікна та тексту повідомлення. Аргумент вікна може бути встановлений як вказівник nil.

Наступний короткий фрагмент коду демонструє зручний спосіб використання вікна для відображення повідомлень про помилки у випадку ініціалізації SDL2, як це зроблено вище.

//ініціалізація підсистеми відео
if SDL_Init( SDL_INIT_VIDEO ) < 0 then 
begin
  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, 'Error Box',  SDL_GetError, nil);
  Halt;
end;

Що ж, ми ініціювали підсистему відео та вивільнили її згодом, і ми дізналися про показ повідомлень про помилки у простому вікні повідомлень. Simple Directmedia Layer заслуговує на свою назву, чи не так?

Лише якщо Ви з цим погоджуєтесь, можете перейти до наступної частини ;-)!

← Частина 2 (Windows) | ← Частина 2 (Linux) | Наступна частина →

Немає коментарів:

Опублікувати коментар