Томас ЖВАВА: Гаразд.
Привіт всім.
Я Томас Лайвлі.
Цей семінар буде писати 2D гри в C, використовуючи SDL.
Так що я знаю, що ти все просити, так, я дійсно
хочу грати в ігри і робити гри, але те, що цей бізнес SDL?
Так SDL бібліотека С.
Він стоїть з тієї простої DirectMedia рівня.
І це крос-платформний, гра бібліотека розробки.
Вона працює на Windows, Mac, Linux, навіть IOS і Android.
Він обробляє такі речі, як доступ до аудіо-систем
для комп'ютера, клавіатури, і миші, джойстики, якщо вони прикріплені.
На мобільний телефон, він може навіть зробити сенсорний ввід, і все, що.
І, звичайно, він обробляє графіку, малюнок речі на екрані.
>> Так що це дуже широко використовується, хоча Ви, можливо, не чули про нього раніше.
Він побудований в, наприклад, Джерело двигун від Valve,
який живить такі ігри, як Портал і Team Fortress 2.
Це також в дуже великій кількості інді ігор, які виходять,
так що я радий бачити, що ви все буде робити з цим.
>> Цілі семінару, щоб ви встановити, щоб бути розвивається SDL.
Ми збираємося дізнатися, як створити вікно гри.
Ми збираємося створити спрайт, які є зображення у вашій грі
які можуть пересуватися.
Ми збираємося дізнатися, як щоб і анімувати спрайт,
так переміщати їх, зробити їх з часом змінюватися.
І ми збираємося, щоб дізнатися, як захопити клавіатуру і мишу
надходять з комп'ютера.
Те, що ми не будемо говорити про сьогодні 3D-графіка,
тому що це дуже складний предмет, який ми не маємо часу для.
Ми не дізнаємося, як грати аудіо на наших іграх.
І ми не будемо будувати для чого, крім Linux.
>> Тепер застереження є, що Будемо сподіватися, що до кінця року відбувся семінар,
Ви будете комфортно документація SDL,
так що ви зможете піти з'ясувати як грати аудіо для себе.
Також будівлю для Mac або PC повинен працювати точно так само, як будівництво для Linux,
але установка збирається буде трохи відрізнятися.
Таким чином, ви повинні бути в змозі зрозуміти як зробити ці речі
до кінця сьогоднішнього семінару.
>> Таким чином, для установки, ми збираємося використовувати віртуальну машину.
Ми хотіли б використовувати CS50 IDE, бо ми тільки збираємося, щоб писати на C.
Але так як IDE НЕ браузер, ми не можуть створювати нові вікна або дисплей
графіка в ній.
Таким чином, ми повинні віртуальну машину.
Таким чином, ви можете слідувати інструкціям тут manual.CS50.net/appliance/15~~pobj
встановити офіційне CS50 прилад, що лише віртуальний Linux
машина.
>> А потім, як тільки у вас є що все це встановити up--
може зайняти деякий час, тому що дуже великий download-- ви збираєтеся
працювати в В.М. SUDO поновлення APT-GET.
І що насправді відбувається оновити все програмне забезпечення,
пакети на вашій віртуальній машині.
>> Після цього, ви збираєтеся запустити Судо APT-отримати установку, libsdl2-2.0-0,
libsdl2-DBG, libsdl2-DEV, а додатково libsdl2-зображення 2.0-0,
libsdl2-зображення DBG, і libsdl2-зображення DEV.
Так що це робить?
Це всього лише встановлює налагодження інформації, документації, заголовки,
і бінарні файли для двох бібліотек.
Регулярний старий, SDL 2.0, і ще бібліотека
називається SDL зображення, які ми збираємося використовувати
завантажувати файли зображень у нашій грі.
>> Тому, як тільки у вас є, що також що, якраз коли він просить,
Ви просто наберіть да, просто натисніть Enter встановити ці пакети,
а потім ви повинні бути добре йти.
Таким чином, щоб отримати код розподілу, ви can-- боже, це не оновлюється.
Якщо у вас є account-- GitHub якщо у вас є акаунт GitHub,
Ви можете зробити це Git клон команда репо
і що буде завантажити Git РЕПО з усіма коду в ньому,
так що ви будете мати код.
>> Якщо ви не маєте GitHub рахунок, те, що ви повинні зробити, це ввести
wgithttps: //github.com/tlively/sdl seminar-- і тут це different--
/archive/master.zip.
Отже, ще раз, це точно такий же Посилання, за винятком того, що відбувається, щоб бути
tlively / SDL_seminar / master.zip і Ви використовуєте wgit на скачування цього.
І тоді ви можете просто розпакувати цей архів
і тоді ви будете мати весь вихідний код.
Так шкода, що так.
А потім код також буде розміщений на веб-сторінки в CS50 семінару в парі
днів.
>> Добре.
Так як ми почнемо писати нашу власну гру?
Ну, перше, що ми збираємося хочете зробити
це подивитися на SDL документації.
Так от В.М ..
А ось веб-сторінка.
Я вийшов, щоб жити libsdl.org.
Те, що я збираюся зробити тут перейти до бічної панелі, під документації,
і натисніть на вікі.
Це принесе мені в вікі, що має більшість документації для SDL.
За на бічній панелі тут, ми збирається натисніть API за категоріями,
бо збирається дати нам приємно категорична вид
всього API для SDL.
>> Так, наприклад, у нас є основний ініціалізації
і закрили, все те Адміністративний матеріал для використання SDL,
а то у нас в розділі для відображення речі на екрані.
Це відео.
Вхідні події, це стає ввести з клавіатури,
отримувати введення від миші, і джойстик, якщо у вас є навіть.
Там же зворотною силою речей як ігрові контролери, які
ми не збираємося говорити.
А ось звук.
А тут ще купа інших речі, які SDL може зробити для вас.
>> Але сьогодні ми збираємося зосередитися на ініціалізації тут,
відображення зображень у відео розділ, і обробку подій введення.
Так ось головні розділи документації
що ви повинні турбуватися про.
Просто для задоволення, якщо перейти тут і натисніть на API по імені,
ми можемо побачити список всіх окрема річ в SDL бібліотеці.
Таким чином, всі ці функції, перерахування, структури, божевільне кількість матеріалу,
алфавітний порядок.
Чи не І ясно, що до тих пір, Ви знаєте, що ви робите,
це не буде занадто корисним, який є, чому ми робимо API за категоріями.
>> Отже, давайте почнемо.
Сподіваюся, ви вже завантажили код розподілу.
І так, що ви можете зробити, це, право тут, в CS50 приладу,
просто відкрийте термінал.
Ось і ми.
Так що я вже скачав Код розподілу за допомогою .zip
спосіб.
І я розстебнув його.
Так от в SDL майстра семінару.
Так що я збираюся йти в цьому каталозі.
І те, що ми бачимо тут що у нас є сім C файли.
І це буде код ми збираємося бути дивлячись на сьогоднішній день.
У нас є Makefile.
І у нас є каталог ресурсів, який просто має зображення
що ви будете бачити досить скоро.
>> Так давайте відкриємо ці файли за допомогою G-Edit редактора.
Тому я хочу, щоб відкрити всі файли, які Почнемо з привіт і закінчуються на .c.
Ось і ми.
Так що ця крихітна вікно, таким чином, ми збираюся спробувати зробити що більше.
Ні, він пішов.
>> Добре.
Так от саме перше Файл ми збираємося дивитися.
Це називається hello1_sdl.c.
І все це робить ініціалізацію SDL Бібліотека, так що ми можемо почати використовувати його.
Як би Ви знаєте, щоб прийти з цим кодом самі?
Ну, якщо ми подивимося більш в документації
і ми йдемо в ініціалізації і закрили розділ,
він збирається розповісти нам про те, як ініціалізувати SDL.
Так, безумовно, читати це іншим разом.
Це відбувається, щоб сказати вам все про те, що тут відбувається.
Але головне утруднення в тому, що ми повинні викликати цю функцію SDL У Цьому
і передати його, які речі ми хочемо, щоб бібліотека для ініціалізації.
Таким чином, в нашому випадку, ми просто ініціалізувати відео зараз,
так що ми можемо почати показ зображень.
>> Тут, ви можете побачити, якщо клікаємо на SDL в ньому, ми
може отримати ще більше інформації, у тому числі, що повертається.
Таким чином, ми бачимо, що це returnes нулю на успіх.
Таким чином, в нашому коді, ми збираємося побачити, якщо вона не повернеться до нуля,
і якщо він не повертає нулю, так що це не було успішним,
тоді ми йдемо до друку просто помилка при використанні цього іншу функцію,
SDL помилок Get, який повертає рядок описуючи помилка, що виникала.
Ми збираємося, щоб роздрукувати що помилки, а потім ми просто
збирається вийти з програми з кодом помилки.
>> Тоді інша справа, що ми повинні зробити це до виходу з програми,
якщо ми успішно инициализирован SDL, нам просто потрібно назвати його SDL вийти.
І, що збирається звертатися очищення всі внутрішні ресурси SDL для нас.
Таким чином, документація there-- знову, тут ми знаходимося в ініціалізації
і закрили розділ документації.
Ви можете просто натисніть на Функція тут, SDL кинути,
і ви можете прочитати все про те, що, як добре.
І багато хто з цих функцій сторінки документації
є приклад коду, так що це дуже хороший ресурс.
Безумовно витратити якийсь час читати частини цієї вікі
якщо ви збираєтеся зробити це для проекту.
>> Добре.
Так ось вся наша програма.
Що ми можемо зробити зараз, я is-- збирається відкрити Makefile тут,
так що я збираюся взяти подивитися на, як це працює.
І це дуже простий Makefile, схоже на те, що ви бачили раніше.
Одним з основних відмінностей є те, що тут, у цьому
буде вставити результат бігу Ця команда, ви вже
встановлений, якщо ви встановили SDL.
І це команда який буде генерувати
деякі додаткові прапори для компілятора.
>> Крім того, ми даємо його всі звичайні команди, а також
ці дві команди.
Так що -lsdl2-зображення ручки пов'язуючи в бібліотеці SDL зображення.
І насправді -lm обробляє зв'язування в стандартній математичної бібліотеки C.
Таким чином, ми не знадобиться тих, для всіх наших файлів на Сі,
але ми просто покласти їх у так що ми можемо використовувати ту ж Makefile для всього
без змін.
>> Сюди в джерелах, це де ви б
помістити файли, які ви збираєтеся компілювати для вашого проекту.
Але так як кожен з моєї C файли сюди має основну функцію,
це буде заплутатися якщо покласти їх у.
Так що я збираюся просто сказати, зараз, hello1_sdl.c,
який є одним ми просто дивилися.
Так що, якщо я повертаюся протягом тут, я можу дійсно роблять.
І що він зробив це просто складений, що перший файл.
І тоді ми можемо ввести ./game, бо це виконуваний файл він справив.
І все це зробив для друку ініціалізація успішно.
Таким чином, ми зробили щось правильне.
Але це було нудно, тому що ми не бачимо вікно,
нічого не рухалось навколо.
>> Так здорово, ми отримали SDL инициализируются.
Тепер, давайте перейдемо до чогось трохи більш цікавим.
Так от у нас є hello2_window.c, і це буде трохи більше
комплекс С програма, ініціалізує SDL, як і раніше,
тільки тепер ми також збираємося для ініціалізації SDL таймер.
І це буде, щоб повідомити доступ до внутрішньої таймер
і використовувати функції, пов'язані часу.
>> А потім подивимося сюди.
Те, що ми робимо, ми повинні цей покажчик до SDL вікно структури, яка
буде створюватися цей заклик функції, SDL створити вікно.
Тепер, це займає багато аргументів, так що давайте дивитися на документацію.
Отже, ще раз, я збираюся API за категоріями, я
знижується у відео тут, і перший розділ, показуючи управління вікнами.
Таким чином, це секція має тонна речей у ньому,
але якщо ви дивитеся через ці функції, ви будете
бачити, що ймовірно, один ми потрібен, називається SDL створити вікно,
який, трапляється, на самому верху.
>> І тому це документація для цієї функції.
Вікно матиме заголовок, Х і Y позиції на екрані,
це матиме ширину, висоту, а потім він збирається прийняти деякі прапори.
Тепер ми насправді не хвилює будь-який з цих прапорів зараз
але якщо ви хочете зробити щось як зробити вікно на весь екран,
Ви могли б поглянути на це.
В даний час, ми тільки збираємося використовувати ці спеціальні значення,
SDL вікно плюс центру для х і у в порядку
просто створити вікно в центрі нашого екрану.
>> Так ось, що це робить.
А якщо вікно трапляється NULL, означаючи, що це помилка,
Потім ми знову збираємося просто роздрукувати, використовуючи SDL помилку помилку отримаєте.
А потім, тому що ми ініціалізації SDL, нам потрібно, щоб закрити його.
Так ми називаємо SDL, перш ніж кинути Повертаючи одну для основної.
>> Отже, ми маємо вікно відкрити, сподіваюся.
І що ми збираємося зробити, ми збираємося
зателефонувати SDL для 5000 мілісекунд, що те ж саме, як п'ять секунд.
І коли ми зробили з цим, він збирається знищити вікно,
прибирати бібліотека SDL, і вийти з програми.
Так що давайте йти вперед і дати, що постріл.
>> Так що тепер замість зміни Makefile, кожен раз,
Я можу просто зробити, і Потім в командному рядку,
кажуть джерела дорівнює, а потім файл ми компіляції.
Так що це hello2_window.c.
Фантастичний.
Немає erros.
Тепер, якщо ми запустимо наш виконуваний файл, ми бачимо це вікно.
Тепер є декілька Проблеми з вікном.
Ми можемо перемістити його навколо, але вона має На цьому тлі небажаної всередині нього.
Таким чином, ми не тягне що-небудь, і так це
тільки повний сміття, яке це досить багато, що ми очікуємо.
>> Крім того, ми не можемо закрити вікно.
Я натисканні цієї X в кут і нічого, що відбувається.
Таким чином, ми побачимо, як виправити що в небагато.
Так що давайте виправити частину, де Вікно сповнена сміття в першу чергу.
Так що, якщо ми йдемо до hello3_image.c, те, що ми бачимо в тому, що ми додали кілька
більше речей тут.
Ми додали цей новий заголовок подати, щоб отримати функції таймера.
Я думаю, що ми зробили це в останній Один з них, теж, і я не згадувати.
Але тепер, бо ми роботи із зображеннями,
ми повинні включати SDL Файл заголовка зображення, а також.
Так що це те ж саме, перш, ініціалізація SDL тут,
Те ж саме справу зі створенням вікна.
Ми бачили, що до цих пір.
>> Тепер нам потрібно створити щось під назвою рендерер, який начебто йде разом
з вікном.
Але це свого роду абстрактний об'єкт, що це
відповідальний робити всі ці малюнок операцій до вікна.
І це насправді відповідає на програми, завантаженої
в графічному обладнанні у вашій комп'ютер або телефон, або що завгодно.
Таким чином, прапори, які ми хочемо передати it-- і ви можете дивитися на документацію
щоб отримати більш детальну інформацію here-- збираєтеся щоб бути SDL винести прискорюється, що
означає, що він буде за допомогою графічного обладнання
і не тільки емулювати в програмному забезпеченні.
>> І ми збираємося використовувати SDL рендеринга PRESENTVSYNC.
VSYNC це річ, яка просто робить Ваші графіки виглядають краще і запобігає
це те, що називається екраном терор, де половина
одного кадру і половина наступного рамка втягнутися в той же час
і це виглядає жахливо.
Але, знову ж, ви можете йти читати про те, що за своїм розсудом.
>> Отже, ми маємо деякі прапори тут.
І так ми тільки збираємося називати ця функція SDL створити візуалізації.
Ми збираємося дати йому вікно пов'язати з цієї візуалізації.
Негативний одним означає, що ми не хвилює, що Графічний драйвер ми збираємося використовувати.
Так що треба дуже багато завжди негативний,
якщо ви не знаєте про графічних драйверів.
І тоді ми тільки збираємося передати їй наші прапори.
Так що, якщо повертається NULL, то ми в друк помилку, як зазвичай,
але тоді ми також збираємося знищити вікно
прибирати ці ресурси, перш ніж називаючи SDL кинути і повернутися.
>> Тепер, цікава частина тут те, де ми завантажуємо наш імідж
Використовуючи цю функцію IMG_load.
Це єдина функція ми збираємося використовувати з бібліотеки SDL зображення.
Це єдиний, хто нам потрібен.
Це функція, яка сприймає рядок це шлях будь-якого ресурсу зображення.
І це може бути .png, А GIF, растрові, будь-який з цих речей.
І ось чому ця функція так добре.
Він може обробляти майже будь-який формат.
Вантажі його в пам'ять і зберігає його як річ називається SDL поверхню.
>> Тепер SDL поверхню лише структура яка представляє дані зображення в пам'яті.
Таким чином, ви можете прочитати більше про що в документації два.
І якщо це помилки, то ми збираюся зробити все це десь
ми друкуємо помилку, закрити ресурси, а потім вийти з програми.
Тепер найцікавіше, до ми можемо зробити цей образ до вікна,
ми повинні насправді зробити це текстура.
Тепер текстура відповідає до даних зображення, завантажених
в пам'ять апаратної графічної з відділу.
>> Таким чином, поверхня в основний пам'яті, регулярне пам'яті
що ми використали всі семестр, і текстура в цій окремій відеопам'яті
пам'яті, елементи управління графічної карти.
Так ми називаємо цю функцію SDL_CreateTextureFromSurface.
Ми даємо йому нашу візуалізації і наш поверхню.
І тоді ми насправді зроблено з поверхнею,
так ми тільки збираємося, щоб звільнити його.
Ми не потрібен.
А потім, так що якщо цей заклик помилками і повернувся порожнім,
то ми збираємося зробити весь Помилка звітності саме.
>> Добре.
Тут ми отримуємо до деяких фактичні функції рендеринга.
Так називаючи SDL_RenderClear і передачі його
рендер, пов'язані з нашим вікном просто робить вікно темніє.
Так він знімає, що сміття, який ми бачили в наше вікно, перш ніж вона і робить чорний.
А потім ми збираємося зателефонувати SDL_RenderCopy,
дати йому наш візуалізації, нашу текстуру.
І ми будемо говорити про те, що ці поля знаходяться в небагато.
Але що відбувається, щоб прийняти дані текстури
і скопіювати його на наш Вікно для отрисовки зображення.
Так після того як ми зробили цю копію даних на нашому вікні,
ми повинні зробити це додаткова функція називається SDL_RenderPresent.
>> І це цікаво бо це стає
в темі під назвою подвійний буферизації.
Так подвійний буферизації є метод, який робить ваші графіки виглядають набагато краще.
Знову ж, це запобігає розриву екрану Я говорив раніше, де
у вас є два буфера.
Там це знову буфера в пам'ять і передній буфер.
Передня буфер буквально що на екрані в даний момент.
Таким чином, ми робимо все це намалювати варіації, як SDL надати копію або SDL_RenderClear
у вторинний буфер.
Так вони змінюють речі У заднього буфера.
Тут ми могли б малювати цей зелений квадрат, щоб буфера.
>> Отже, коли ми зробили робити наші роблять операції, які
може зайняти дуже довго Час, що ми збираємося зробити
це перемкнути буфери.
Так що буквально бере передній буфер і назад буфер
і перемикає їх, так що, миттєво,
за одну операцію замість може бути, сотні або тисячі,
всі наші знову опиняється об'єкти на екрані.
І це заважає речі як оновлювати екран
коли ми тільки половина звертається наших об'єктів в кадрі.
Так ось чому ми повинні викликати SDL_RenderPresent, а також
а SDL_RenderCopy.
>> Знову ж таки, ми тільки збираємося чекати протягом п'яти секунд.
Тоді ми йдемо до очистити наші ресурси.
У нас є досить кілька більш цього разу.
І тоді ми тільки збираємося для виходу з програми.
Так давайте зробимо це.
Я збираюся ввести марку, а потім джерела дорівнює hello-- це тепер 3image.c.
Гаразд, не складений без помилок.
І ви можете подивитися тут Я тепер витягується моє зображення, Привіт, CS50!
в нашому вікні, яке зникає через п'ять секунд.
>> Тепер, це все ще є проблеми, чи не так?
Це не хороший додаток, тому що, коли я намагаюся закрити вікно,
нічого не відбувається.
Це х як і раніше не відповідає.
Отже, давайте поглянемо на наступний файл, hello4animation.
Так що це файл що збирається ввести
переміщення і рух до нашого зображення.
Так що ми збираємося зробити Те ж саме, як і колись,
ініціювати SDL, створити вікна, створити візуалізації,
завантажити зображення в пам'яті, створити текстуру.
Ми бачили все це раніше.
Тепер, ось це нове.
Ми збираємося, щоб мати структуру, звану SDL прямокутник, який є просто прямокутник.
Якщо ми йдемо сюди, ми можемо зробити пошук для SDL прямокутника,
і ви можете бачити, що це Дуже проста структура.
Він має х, а у для положення, і
має ширину і висоту для розмір прямокутника.
>> Отже, що ми збираємося зробити, це ми буде визначати цей SDL прямокутника адресата,
для призначення.
І це місце, на екрані, де
ми збираємося бути малюнок наш образ, прямо так
якщо ми збираємося бути переміщення зображення навколо,
то призначення, де ми збираємося залучити зображення
повинні бути в русі.
Отже, ми збираємося назвати це Функція SDL_QueryTexture.
І зауважте, я передаю адреса з dest.w, що ширина,
і dest.h, що висота.
І так буде SDL_QueryTexture зберігати в цих областях ширина
а висота нашої текстури.
>> І тоді те, що я збираюся зробити, я збираюся
встановити dest.x бути вікно ширина мінус dest.w, що
ширина спрайту, ділиться на 2.
І це буде налаштувати його так, що образ ідеально по центру
в нашому вікні, все в порядку?
Так що тепер у мене є позиція у.
І це буде бути змінної, яка
змінюється, тому що ми збираємося, щоб бути переміщення зображення у напрямку у.
І тепер у нас є щось називається цикл анімації.
>> Так як же анімація працює?
Ну, людське око може виявити 12 різних зображення в кожну секунду, добре?
Так що, якщо ви блимати 12 зображень карт на мене в секунду, я бачив кожен з цих образів
а своїм власним окремого зображення.
Тепер, якщо ви блимати більш зображення у мене в секунду,
то моє око почне щоб розмити їх разом
і я б сприймати його як рух, замість одного окремого зображення.
Так, наприклад, кіно і телебачення, вони блимають зображення у вас 24 рази
секунда.
Так от 24 кадрів в секунду.
Екрани комп'ютера, з іншого боку, часто при 60 кадрах в секунду.
Це їх швидкість оновлення.
Ось як часто вони оновити зображення на екрані.
Таким чином, наша мета буде 60 кадрів в секунду для наших ігор.
>> Отже, давайте подивимося, що в коді.
Таким чином, для кожного кадру, ми в першу чергу збирається очистити вікно.
Це загальна картина.
Ви завжди очистити Вікно кожен кадр, а потім
робити все на кресленні операції, а потім врешті-решт,
у RenderPresent, щоб показати все в кадрі.
І тоді ви будете є очікування в кінці
не чекати до наступного рама повинна розпочатися.
>> Так що, якщо я роблю багато Комплекс обчислення тут
що було потрібно більше 16 мілісекунд, було б неможливо для мене
щоб отримати, що частота кадрів 60, що Я хотів, тому що кожен кадр
занадто довго, щоб обчислити.
Крім того, ми дійсно робимо Сортувати мізерної кількості роботи
тут, тому що є тільки Єдине, що ми малюємо.
Так що я просто почекати 1/60 по-друге, що довжина
рами між кадрами.
Так що я начебто прикидаючись робити вся моя робота займає нульовий час.
Але в реальній грі, ви повинні відняти
кількість часу, який треба було, щоб зробити вся ця робота з Вашого часу відпочинку.
>> Так чи інакше, що я насправді робить в цьому циклі?
Очистити вікно.
Я встановив dest.y, який є INT, щоб моя фактична позиція у кинутий у міжнар.
Тепер я хочу, плавати дозвіл для моєї позиції у в моїй грі,
але тоді насправді намалювати його на екрані,
він повинен Інтс, тому що це в одиницях пікселів, так це те, що приведення в.
Я збираюся намалювати зображення.
Так що це вихідний прямокутник.
І це прямокутник призначення.
Так я пройшов нуль для джерело прямокутник
сказати, що я хочу звернути всю свою текстуру.
Але якщо у вас багато текстури у вашій грі
і всі вони в один великий карти текстури який був завантажений в SDL в тільки один
текстури, ви могли б використовувати вихідний прямокутник
вибрати один з невеликих текстур, один з невеликих спрайтів,
з цього великої мапі текстури.
>> Отже, ще раз, я передаю мій рендер, мій текстура, і в даний час призначення.
Це буде десь в Вікно це буде звернено.
А потім, тому що я малюю то, мені потрібен рух,
Я збираюся бути оновленню Положення спрайт в кожному кадрі.
Так що в мене це постійне назвою сувій швидкості в блоки пікселів в секунду.
Тепер, кожен раз, коли ми робимо рух, кадр тільки 1/60 секунди.
Так що я збираюся розділити, що на 60.
А потім, давайте подивимося, я віднімання, що з позиції у.
Чому я віднімання?
Ми повернемося до цього в секунду.
Тоді я очистити свої ресурси і програма закінчиться.
>> Так давайте зробимо це.
Так що давайте йти в макіяж SRCS = hello4 animation.c, все в порядку?
Игра.
Ось так.
Так він у мене прокрутки вгору по вікно, яке є досить охайно.
Але тримайтеся, я був віднімання від положення у кожного разу.
Що там відбувається?
Ну, виходить, що в SDL, і Справді, в більшості комп'ютерної графіки,
походження для системи координат є верхній лівій частині вікна.
>> Таким чином, позитивний напрямок йде х по вашому вікні праворуч.
І позитивний у напрямок насправді йде вниз.
Отже, ще раз, в походженні в верхній лівий вікна,
позитивний напрямок у вниз, і позитивний х вправо.
Тому, коли я відняти з позиція у, це
збирається зробити це перейти на негативі у напрям, який становить вікні.
Так ось те, що там відбувається.
Прохолодний.
>> Давайте подивимося на наступний файл.
Ось частина з показати, де ми, нарешті,
отримати цю X в кутку вікна що, як передбачається, щоб закрити вікно
працювати.
Так що ж відбувається?
Ми ініціалізіруем SDL, створити вікно, створити візуалізації, завантажте зображення,
створити текстуру як ми бачили раніше.
У нас же прямокутник призначення як і колись, той самий виклик, щоб запросити текстуру.
Але цього разу, ми тоді розділимо ширину
і висота нашого призначення за 4.
Це має тільки ефект масштабування наш образ вниз, коли
ми показуємо його у вікні на чотири.
Так що це досить охайно.
Ми можемо просто масштабувати просто так.
Ми збираємося почати спрайт в центрі екрану.
І тепер у нас є х і швидкість у і вони обидва збираються почати з нуля.
>> Це неправильний файл.
Мені дуже шкода.
Так що все це правда.
Це все ще в цьому файлі.
У нас є поділ на 4, і все.
Так от у нас є х і у позиції для центру вікна.
І ми даємо йому початкову швидкість цієї постійною швидкістю, яка
Я вважаю, це 300 пікселів в секунду.
Тепер у нас є це INT може так само добре, бути логічне називається рядом просив.
І замість того, Ведення нескінченний цикл по таймеру тут,
ми збираємося анімувати, як Поки близько не просив.
>> Так як ми обробляємо події?
Ну, SDL черзі до подій в буквальне черзі за лаштунками.
І тоді кожен кадр, ми можемо з черги подій
від цієї черги, використовуючи цей виклик SDL_PullEvent.
І знову, виразно йти читати про це в документації.
Там дуже багато більше деталей і багато більше функцій ви можете використовувати в цьому.
Ми передаємо їй адреса цієї речі, SDL_Event
що ми маємо тут в стеку.
>> Тепер, що є SDL_event?
Тому що SDL, якщо ми подивимося в в documentation-- давайте
см, API за категоріями, вхід Події, обробка подій,
ми можемо подивитися на кількість різних подій тут
і ми бачимо, що є в цілому т з них.
Так що це SDL_Event річ?
SDL_Event є об'єднанням.
Нічого собі, що таке об'єднання?
Ви ймовірно ніколи не чув, що раніше.
І це нормально.
>> Союз ніби як на структуру, за винятком структури
має місце для всіх його поля і пам'яті,
в той час як союз тільки має достатньо місця, щоб відповідати найбільшим
один з його полів, що означає його може зберігати тільки один з його полів
в той час, який вид має сенс для подій, вірно?
Ми можемо мати клавіатуру подія або захід вікно,
але одна подія не може бути й Захід клавіатура і вікно подій,
так що було б нерозумно мати простір для і тих, хто всередині нашого союзу подій.
Так що, якщо ви хочете, щоб створити свій власний союз,
це виглядає точно так само, як створення на структуру,
крім того, що ми використовуємо ключове слово союзу замість слова структури.
І пам'ятайте, для всіх з речі всередині вашого союзу,
фактична величина, об'єднання може мати тільки один з цих значень
зараз.
>> Так як ми можемо сказати, що це за події ми просто виштовхується з цієї черги?
Ну, ми можемо перевірити Event.type.
І якщо це одно щоб SDL_Quit, ми знаємо,
це подія, яка був створений, коли ми
вдарив, що X в кутку вікна.
І ми можемо встановити поруч просив дорівнює 1.
В іншому це просто деякі анімації що ви бачили раніше.
Так що давайте йти вперед і зробити це і побачити, наскільки добре вона працює.
Так що я збираюся ввести марку і Потім SRCS = hello5_events.c.
Там ми йдемо.
Ігри.
>> Тепер ми можемо бачити, що це було дійсно скоротили в чотири рази.
І тепер це підстрибуючи.
У мене є виявлення зіткнення відбувається з бічних сторін вікна
що ми можемо поглянути на.
І те, що відбувається, коли я йду, щоб закрити його?
Він закриває.
Фантастичний.
Ми отримали цю подію.
І ми впоралися.
>> Отже, давайте подивимося назад на код.
Отже, як же я його підстрибуючи, як, що?
Пам'ятаєте, я встановити обидва х і у спочатку швидкостей.
А швидкість є позитивним постійна, так що
збирався зробити це, починаючи з йде вниз і вправо.
>> Тепер, кожен кадр, в додаток до обробки будь-які події, які могли статися,
Я збираюся виявити чи мій спрайт намагається вийти з вікна.
Таким чином, ми можемо зробити це, просто перевірка x_pos з 0, y_pos 0, а потім
також x_pos і y_pos з ширина і висота вікна вікно.
Зверніть увагу, я віднімається ширина спрайту.
І це тому, що, якщо я не зробив відняти ширину спрайту,
це тільки перевірити, що походження спрайту
не виходити за межі вікна.
Але ми хочемо, цільні ширина спрайту
щоб завжди бути у вікні і вся висота спрайту
щоб завжди бути у вікні.
Так ось те, що віднімання для.
Багато геометрії тут можна корисно звернути його
на папері з координатою Система подивитися, що відбувається.
>> Так що, якщо я стикаються, я просто просто скинути позицію
так, що вона не буде з екрана.
І я збираюся, якщо він відскакує на одній з бічних стінок,
Я збираюся заперечувати х швидкість, так що
починається підстрибуючи в іншому напрямку.
І точно так само, якщо вона потрапляє верхньої або нижньої,
Я збираюся встановити швидкість у одно негативною швидкості у,
так що воно повернеться.
Так що це просто, як ми отримали це тут.
>> І оновлення позиції так само, як ми бачили раніше,
розділити на 60, тому що ми тільки обробка 1/60 секунди.
А потім рендеринга, точно так само, як і раніше.
І так, що все, що відбувається на цьому файлі.
Так от, як ми робимо події.
Головне, щоб забрати тут ця функція SDL_PullEvent.
І ви повинні, безумовно, читати Документація більше про SDL_Event
об'єднання, тому що цей тип даних є дуже, дуже важливо, тому що ми використовуємо його
для всіх видів заходів.
>> Наприклад, ми використовуємо його для клавіатури Події, які це те, що цей файл для.
Отже, що ж ми маємо?
У нас є те ж саме, як і колись, ініціалізації SDL, створити вікно,
створити візуалізації, завантажити зображення в пам'ять, створити текстуру.
Знову ж таки, ми збираємося Тобто цей Dest прямокутник,
ми збираємося масштабувати зображення на чотири, зробити його трохи менше.
Тепер, ми збираємося, щоб почати спрайт в центрі екрану.
Але цього разу, ми збираємося встановити Початкові х і у швидкості до нуля,
бо клавіатура контролюватиме їх.
І, крім того, ми збираємося відслідковувати цих змінних
вгору, вниз, вліво і вправо.
І що буде тримати трек ми маю
натисканні кнопок клавіатури, що відповідають вгору, вниз, вліво,
і правильно.
>> Тепер, це свого роду фантазії тому що ми можемо використовувати W, A, S,
D тут, або клавіш зі стрілками фактичні.
Ми побачимо, що всього за секунду.
Отже, ми збираємося, щоб обробити подія, як і раніше.
Тягнемо подія.
Але тепер ми збираємося перейти від типу події.
Якщо це SDL_Quit, ми збирається встановити поруч
прохання одного, як раніше.
Це обробляє х в кут вікна,
так що наше вікно дійсно закривається.
>> В іншому випадку, якщо ми отримаємо SDL клавішу натиснутою подія, яка означає, що ми натиснули на клавішу,
те, що ми збираємося зробити, це ми збирається перейти на цю річ тут,
який означає: так event.key означає ставитися наш союз подій,
піти і отримати ключ Структура подія в ньому.
Так що виходить, що це Союз є ключовою структурою подія.
А потім перейти до ключа Структура заходу його поле
називається символ клавіші, а потім скан.
І знову, виразно читав документація про це.
Ключове слово входи досить цікаво.
Ви можете отримати коди сканування або ключові коди.
І це трохи тонкі, але документація досить добре.
>> Так що, якщо ми бачимо, що код для сканування наша натисніть клавішу бути Вт або вгору,
ми збираємося створити, рівне 1.
І тоді ми вирватися з цієї перемикача.
Якщо це або вліво, ми встановлюємо зліва 1, ET далі, і так далі, для вниз і вправо.
Тепер, в цій зовнішньої перемикач, якщо ми бачимо ключ до події,
це означає, що ми випустили ключ ні, і ми більше не натискаючи її.
Так що я збираюся сказати, до дорівнює 0, лівий дорівнює 0, 0 вниз дорівнює, право
дорівнює 0, і так далі.
>> І зверніть увагу, у нас є в кожному з них два випадки виправити поруч один з одним
без окремого коду в першому випадку, який
означає, що будь то При S або прямо тут,
він збирається виконати цей код.
Так що це досить зручно.
Це охороняє нас від необхідності робити більше умови і IFS і речі
так.
>> Отже, ми збираємося, щоб визначення швидкості.
Ми встановлюємо швидкість в 0.
Тоді при натисканні на і не працює, то ми
встановити у швидкість для негативного швидкості.
Запам'ятати негативним, тому що негативне напрямок у вгору.
І позитивний у напрямок вниз.
Якщо натиснута і не вгору, тоді ми
збирається встановити його на позитивній швидкості, що означає йти вниз по екрану.
Те ж саме з лівого і правого.
>> А потім ми збираємося оновити позиції так само, як раніше.
Ми збираємося зробити зіткнення Виявлення з оцінками,
але ми не збираємося, щоб скинути Швидкість, оскільки швидкість всього
управляється клавіатурою.
Але ми збираємося скинути позиції, щоб тримати його у вікні.
І ми збираємося, щоб встановити позиції в структури
а потім зробити все надання речі від до.
Отже, давайте подивимося, що він робить.
Так що SRCS-- давайте подивимося, це hello6_keyboard.c.
>> О ні.
Таким чином, ми отримали деякі попередження тут.
І це просто говорить ми не перевірити для кожного можливого виду
події.
Це нормально, тому що є 236 з них, або так.
Так що я збираюся ігнорувати ці попередження.
Він як і раніше складений добре.
Так що я збираюся грати в цю гру.
Це не рухається.
Але тепер, коли я пюре на моїй клавіатурі, Я можу зробити якийсь рух WASD тут,
Я також використовувати мої клавіш зі стрілками.
І зауважте, навіть якщо я натискання правої прямо зараз,
це не виходячи з вікна, бо я скинути його на кожному кадрі.
Так що це досить охайно.
Ви можете собі уявити, рухаючись навколо Маріо з деякі клавіші зі стрілками або щось подібне.
І так, Х робить роботу.
>> Так кінцевий файл ми збираємося дивитись, hellow7_mouse.
Це про отримання введення миші.
Таким чином, у цьому, ми імпортувати математичну заголовок,
тому що ми збираємося, щоб мати трохи математики тут.
Все та ж стара, ті ж старі речі, призначення, те ж саме старе, бачив, що раніше.
Ну, це цікаво.
Так ми повернулися тільки перевірка для SDL кинути подія.
Чому так?
Таким чином, ви можете отримати введення миші з подіями.
Наприклад, коли миша переміщується, Ви отримуєте подія для цього.
При натисканні кнопки миші, Ви можете отримати подія для цього.
>> Але є ще один, дещо простіше можливо, API для отримання введення миші.
І це просто SDL стан Get миші.
Так у мене є Int для х і у для позиції курсора.
Я передати його SDL_GetMouseState, яка встановлює їх.
І це положення в систему координат вікна.
Таким чином, якщо маса в лівому верхньому кутку вікна, що б 0, 0.
>> Тепер, що я збираюся зробити, це я збираюся щоб зробити трохи векторної математики.
Б'юся об заклад, ви думали, що не буде Видно, що в CS50, але тут це.
Я збираюся зробити деякі вектор математика, щоб отримати вектор
від зображення на курсор.
І так чому я повинен це віднімання тут?
Ну, якщо я просто використав Dest .-- так Мені потрібно, щоб перевести миші х
і у на половину ширини і висота зображення,
тому що я хочу центрі зображення, яке буде йти до миші,
не походження образу.
>> Так що це просто, щоб переконатися, що я говорю про центр картинки тут.
Тоді ми отримаємо трикутник х і у, що різниця від мети
з фактичним становищем зображення.
І тоді ми можемо отримати відстань тут, що
буде Піфагора Теорема, корінь квадратний з х
раз х плюс у раз у.
>> Тепер, щоб запобігти тремтіння, і я можу показати Ви що це робить, якщо я не роблю цього,
якщо відстань між курсором і центр зображення менше, ніж п'ять,
Я просто не збираюся, щоб перемістити зображення.
В іншому випадку, ми встановлюємо швидкість.
І ми встановіть його так, що швидкість завжди буде постійною.
І кінцевий результат всього це математика, що зображення
буде рухатися в напрямку курсору.
>> Тепер, виходить, що SDL_GetMouseState,
на додаток до встановивши х і у аргументи тут,
він також повертає Int, що відповідає в змозі кнопок миші.
Таким чином, ми не читаємо, що безпосередньо, але ми можемо
використовувати ці макроси, один побітовое оператор, не страшно,
тільки побітовое і.
Тому ми говоримо, кнопки, яка є результатом нашої SDL_GetMouseState, якщо
і побітовое і цей макрос тут, SDL_BUTTON_LEFT.
>> Так що це буде просто вирішити в растровому зображенні, що відповідає
в лівою кнопкою миші натиснута.
І тому, якщо побітовое і відбувається, і це
не дорівнює нулю, що означає, залишили була натиснута кнопка,
то ми насправді відбувається, щоб звести нанівець і х і у швидкості,
який буде просто зробити зображення втечу.
Оновлення позиції.
Зіткнення виявлень, бачив його всі колись, рендеринга, все в порядку.
Давайте зробимо це.
Таким чином, ви отримали зробити SRCS = hello7_mouse.c.
Відмінно.
Немає помилок.
І гра.
>> Так от у мене є миша.
І образ дійсно чеканка миша.
Тепер, у грі ви робите, може бути, це як ворожого чеканка
ваш маленький символ або що завгодно.
Але тут у нас є чеканка зображення мишею.
І коли я натисніть, миша починається карбування зображення
і зображення тікаючи від миші.
Так що це досить прохолодно.
І зауважте знову, є ще виявлення зіткнення тут.
>> Так що це фінал трохи демо я створив тут.
І давайте поглянемо на ще одну річ.
Отже, повернемося сюди, я згадав цей тремтіння.
Добре.
Так що, якщо відстань менше, ніж п'ять пікселів, Я сидів х і у швидкість до нуля.
Що станеться, якщо ми позбутися цього?
Так що я збираюся зробити це просто.
Будь ласка, вибачте цю страхітливу стиль, але ми закоментувавши правильний код.
Так що я збираюся врятувати і зробити Та ж команда з перш ніж зробити це.
>> Добре.
А тепер що відбувається?
Добре.
Ми як і раніше слідуючи миші, як і раніше,
але коли ми добираємося до миші, ми отримали це грубе тремтіння.
Що там відбувається?
Ну, в нашому векторі математика, пам'ятаю, ми були
приймаючи відстань між курсор і центр зображення?
Ну, як те, що підходить 0, ми починаємо отримувати
як такого роду поведінка божевільного де зображення є свого роду
як коливається навколо курсора.
І це створює цей тремтіння.
І це дійсно негарно.
І ви, ймовірно, не хочете, щоб ваші ігри робить, що
якщо це не якийсь особливий ефект.
>> Так ось чому у нас є тільки в цьому довільне
відрізати п'яти пікселів, де ми говоримо, якщо це протягом п'яти пікселів, ми добре.
Нам не потрібно, щоб перемістити зображення більше.
Так ось те, що там відбувається.
>> Так що це досить багато його.
Тепер ви знаєте, як створити вікно, завантажити зображення,
намалювати зображення у вікні, отримати введення з клавіатури, миші отримати введення,
є купа інших вхід, що ви не
знаєте, як отримати, якщо ви просто провести Кілька хвилин, дивлячись на документації.
Таким чином, ви насправді мають досить кілька інструментів у вашому розпорядженні тепер
написати повноцінну гру.
>> Тепер, кожна гра необхідний аудіо, але звук документація
також досить добре.
І я готовий посперечатися, що якщо Ви розумієте, всі речі,
ми говорили про сьогодні з зображення і поверхні,
вікна, і все те, з'ясувати аудіо API НЕ
буде, що погано.
Так що я з нетерпінням чекаю зустрічі що ви створюєте з SDL.