1 00:00:00,000 --> 00:00:05,069 2 00:00:05,069 --> 00:00:06,110 Томас ЖВАВА: Гаразд. 3 00:00:06,110 --> 00:00:07,450 Привіт всім. 4 00:00:07,450 --> 00:00:08,690 Я Томас Лайвлі. 5 00:00:08,690 --> 00:00:15,160 Цей семінар буде писати 2D гри в C, використовуючи SDL. 6 00:00:15,160 --> 00:00:17,970 Так що я знаю, що ти все просити, так, я дійсно 7 00:00:17,970 --> 00:00:22,050 хочу грати в ігри і робити гри, але те, що цей бізнес SDL? 8 00:00:22,050 --> 00:00:25,320 Так SDL бібліотека С. 9 00:00:25,320 --> 00:00:28,270 Він стоїть з тієї простої DirectMedia рівня. 10 00:00:28,270 --> 00:00:31,340 І це крос-платформний, гра бібліотека розробки. 11 00:00:31,340 --> 00:00:37,160 Вона працює на Windows, Mac, Linux, навіть IOS і Android. 12 00:00:37,160 --> 00:00:40,380 Він обробляє такі речі, як доступ до аудіо-систем 13 00:00:40,380 --> 00:00:44,900 для комп'ютера, клавіатури, і миші, джойстики, якщо вони прикріплені. 14 00:00:44,900 --> 00:00:48,300 На мобільний телефон, він може навіть зробити сенсорний ввід, і все, що. 15 00:00:48,300 --> 00:00:53,030 І, звичайно, він обробляє графіку, малюнок речі на екрані. 16 00:00:53,030 --> 00:00:56,470 >> Так що це дуже широко використовується, хоча Ви, можливо, не чули про нього раніше. 17 00:00:56,470 --> 00:01:00,860 Він побудований в, наприклад, Джерело двигун від Valve, 18 00:01:00,860 --> 00:01:04,970 який живить такі ігри, як Портал і Team Fortress 2. 19 00:01:04,970 --> 00:01:08,680 Це також в дуже великій кількості інді ігор, які виходять, 20 00:01:08,680 --> 00:01:13,545 так що я радий бачити, що ви все буде робити з цим. 21 00:01:13,545 --> 00:01:20,000 >> Цілі семінару, щоб ви встановити, щоб бути розвивається SDL. 22 00:01:20,000 --> 00:01:22,700 Ми збираємося дізнатися, як створити вікно гри. 23 00:01:22,700 --> 00:01:26,130 Ми збираємося створити спрайт, які є зображення у вашій грі 24 00:01:26,130 --> 00:01:27,744 які можуть пересуватися. 25 00:01:27,744 --> 00:01:29,910 Ми збираємося дізнатися, як щоб і анімувати спрайт, 26 00:01:29,910 --> 00:01:32,910 так переміщати їх, зробити їх з часом змінюватися. 27 00:01:32,910 --> 00:01:35,580 І ми збираємося, щоб дізнатися, як захопити клавіатуру і мишу 28 00:01:35,580 --> 00:01:38,240 надходять з комп'ютера. 29 00:01:38,240 --> 00:01:41,550 Те, що ми не будемо говорити про сьогодні 3D-графіка, 30 00:01:41,550 --> 00:01:45,520 тому що це дуже складний предмет, який ми не маємо часу для. 31 00:01:45,520 --> 00:01:49,010 Ми не дізнаємося, як грати аудіо на наших іграх. 32 00:01:49,010 --> 00:01:53,300 І ми не будемо будувати для чого, крім Linux. 33 00:01:53,300 --> 00:01:58,330 >> Тепер застереження є, що Будемо сподіватися, що до кінця року відбувся семінар, 34 00:01:58,330 --> 00:02:01,660 Ви будете комфортно документація SDL, 35 00:02:01,660 --> 00:02:05,370 так що ви зможете піти з'ясувати як грати аудіо для себе. 36 00:02:05,370 --> 00:02:12,150 Також будівлю для Mac або PC повинен працювати точно так само, як будівництво для Linux, 37 00:02:12,150 --> 00:02:14,700 але установка збирається буде трохи відрізнятися. 38 00:02:14,700 --> 00:02:17,700 Таким чином, ви повинні бути в змозі зрозуміти як зробити ці речі 39 00:02:17,700 --> 00:02:20,900 до кінця сьогоднішнього семінару. 40 00:02:20,900 --> 00:02:26,980 >> Таким чином, для установки, ми збираємося використовувати віртуальну машину. 41 00:02:26,980 --> 00:02:31,010 Ми хотіли б використовувати CS50 IDE, бо ми тільки збираємося, щоб писати на C. 42 00:02:31,010 --> 00:02:35,120 Але так як IDE НЕ браузер, ми не можуть створювати нові вікна або дисплей 43 00:02:35,120 --> 00:02:36,410 графіка в ній. 44 00:02:36,410 --> 00:02:38,450 Таким чином, ми повинні віртуальну машину. 45 00:02:38,450 --> 00:02:47,790 Таким чином, ви можете слідувати інструкціям тут manual.CS50.net/appliance/15~~pobj 46 00:02:47,790 --> 00:02:53,290 встановити офіційне CS50 прилад, що лише віртуальний Linux 47 00:02:53,290 --> 00:02:55,110 машина. 48 00:02:55,110 --> 00:02:58,090 >> А потім, як тільки у вас є що все це встановити up-- 49 00:02:58,090 --> 00:03:02,090 може зайняти деякий час, тому що дуже великий download-- ви збираєтеся 50 00:03:02,090 --> 00:03:07,060 працювати в В.М. SUDO поновлення APT-GET. 51 00:03:07,060 --> 00:03:09,410 І що насправді відбувається оновити все програмне забезпечення, 52 00:03:09,410 --> 00:03:12,670 пакети на вашій віртуальній машині. 53 00:03:12,670 --> 00:03:20,130 >> Після цього, ви збираєтеся запустити Судо APT-отримати установку, libsdl2-2.0-0, 54 00:03:20,130 --> 00:03:27,960 libsdl2-DBG, libsdl2-DEV, а додатково libsdl2-зображення 2.0-0, 55 00:03:27,960 --> 00:03:32,560 libsdl2-зображення DBG, і libsdl2-зображення DEV. 56 00:03:32,560 --> 00:03:33,640 Так що це робить? 57 00:03:33,640 --> 00:03:38,440 Це всього лише встановлює налагодження інформації, документації, заголовки, 58 00:03:38,440 --> 00:03:41,260 і бінарні файли для двох бібліотек. 59 00:03:41,260 --> 00:03:45,090 Регулярний старий, SDL 2.0, і ще бібліотека 60 00:03:45,090 --> 00:03:50,110 називається SDL зображення, які ми збираємося використовувати 61 00:03:50,110 --> 00:03:54,560 завантажувати файли зображень у нашій грі. 62 00:03:54,560 --> 00:03:57,860 >> Тому, як тільки у вас є, що також що, якраз коли він просить, 63 00:03:57,860 --> 00:04:01,100 Ви просто наберіть да, просто натисніть Enter встановити ці пакети, 64 00:04:01,100 --> 00:04:04,430 а потім ви повинні бути добре йти. 65 00:04:04,430 --> 00:04:14,800 Таким чином, щоб отримати код розподілу, ви can-- боже, це не оновлюється. 66 00:04:14,800 --> 00:04:18,480 Якщо у вас є account-- GitHub якщо у вас є акаунт GitHub, 67 00:04:18,480 --> 00:04:24,450 Ви можете зробити це Git клон команда репо 68 00:04:24,450 --> 00:04:30,490 і що буде завантажити Git РЕПО з усіма коду в ньому, 69 00:04:30,490 --> 00:04:31,700 так що ви будете мати код. 70 00:04:31,700 --> 00:04:36,470 >> Якщо ви не маєте GitHub рахунок, те, що ви повинні зробити, це ввести 71 00:04:36,470 --> 00:04:48,867 wgithttps: //github.com/tlively/sdl seminar-- і тут це different-- 72 00:04:48,867 --> 00:04:49,700 /archive/master.zip. 73 00:04:49,700 --> 00:04:55,610 74 00:04:55,610 --> 00:04:59,220 Отже, ще раз, це точно такий же Посилання, за винятком того, що відбувається, щоб бути 75 00:04:59,220 --> 00:05:09,010 tlively / SDL_seminar / master.zip і Ви використовуєте wgit на скачування цього. 76 00:05:09,010 --> 00:05:12,940 І тоді ви можете просто розпакувати цей архів 77 00:05:12,940 --> 00:05:14,900 і тоді ви будете мати весь вихідний код. 78 00:05:14,900 --> 00:05:17,580 Так шкода, що так. 79 00:05:17,580 --> 00:05:23,880 А потім код також буде розміщений на веб-сторінки в CS50 семінару в парі 80 00:05:23,880 --> 00:05:25,230 днів. 81 00:05:25,230 --> 00:05:26,590 >> Добре. 82 00:05:26,590 --> 00:05:29,932 Так як ми почнемо писати нашу власну гру? 83 00:05:29,932 --> 00:05:31,890 Ну, перше, що ми збираємося хочете зробити 84 00:05:31,890 --> 00:05:34,740 це подивитися на SDL документації. 85 00:05:34,740 --> 00:05:37,020 Так от В.М .. 86 00:05:37,020 --> 00:05:38,720 А ось веб-сторінка. 87 00:05:38,720 --> 00:05:40,340 Я вийшов, щоб жити libsdl.org. 88 00:05:40,340 --> 00:05:43,110 89 00:05:43,110 --> 00:05:48,140 Те, що я збираюся зробити тут перейти до бічної панелі, під документації, 90 00:05:48,140 --> 00:05:51,040 і натисніть на вікі. 91 00:05:51,040 --> 00:05:56,870 Це принесе мені в вікі, що має більшість документації для SDL. 92 00:05:56,870 --> 00:06:01,360 За на бічній панелі тут, ми збирається натисніть API за категоріями, 93 00:06:01,360 --> 00:06:04,300 бо збирається дати нам приємно категорична вид 94 00:06:04,300 --> 00:06:07,770 всього API для SDL. 95 00:06:07,770 --> 00:06:12,390 >> Так, наприклад, у нас є основний ініціалізації 96 00:06:12,390 --> 00:06:18,380 і закрили, все те Адміністративний матеріал для використання SDL, 97 00:06:18,380 --> 00:06:21,630 а то у нас в розділі для відображення речі на екрані. 98 00:06:21,630 --> 00:06:23,000 Це відео. 99 00:06:23,000 --> 00:06:25,790 Вхідні події, це стає ввести з клавіатури, 100 00:06:25,790 --> 00:06:29,710 отримувати введення від миші, і джойстик, якщо у вас є навіть. 101 00:06:29,710 --> 00:06:32,901 Там же зворотною силою речей як ігрові контролери, які 102 00:06:32,901 --> 00:06:34,150 ми не збираємося говорити. 103 00:06:34,150 --> 00:06:35,630 А ось звук. 104 00:06:35,630 --> 00:06:38,940 А тут ще купа інших речі, які SDL може зробити для вас. 105 00:06:38,940 --> 00:06:43,830 >> Але сьогодні ми збираємося зосередитися на ініціалізації тут, 106 00:06:43,830 --> 00:06:48,332 відображення зображень у відео розділ, і обробку подій введення. 107 00:06:48,332 --> 00:06:50,290 Так ось головні розділи документації 108 00:06:50,290 --> 00:06:53,050 що ви повинні турбуватися про. 109 00:06:53,050 --> 00:06:57,170 Просто для задоволення, якщо перейти тут і натисніть на API по імені, 110 00:06:57,170 --> 00:07:04,350 ми можемо побачити список всіх окрема річ в SDL бібліотеці. 111 00:07:04,350 --> 00:07:11,330 Таким чином, всі ці функції, перерахування, структури, божевільне кількість матеріалу, 112 00:07:11,330 --> 00:07:12,820 алфавітний порядок. 113 00:07:12,820 --> 00:07:14,580 Чи не І ясно, що до тих пір, Ви знаєте, що ви робите, 114 00:07:14,580 --> 00:07:19,100 це не буде занадто корисним, який є, чому ми робимо API за категоріями. 115 00:07:19,100 --> 00:07:20,810 >> Отже, давайте почнемо. 116 00:07:20,810 --> 00:07:25,680 Сподіваюся, ви вже завантажили код розподілу. 117 00:07:25,680 --> 00:07:30,070 І так, що ви можете зробити, це, право тут, в CS50 приладу, 118 00:07:30,070 --> 00:07:31,150 просто відкрийте термінал. 119 00:07:31,150 --> 00:07:33,750 120 00:07:33,750 --> 00:07:34,440 Ось і ми. 121 00:07:34,440 --> 00:07:40,740 Так що я вже скачав Код розподілу за допомогою .zip 122 00:07:40,740 --> 00:07:41,690 спосіб. 123 00:07:41,690 --> 00:07:43,140 І я розстебнув його. 124 00:07:43,140 --> 00:07:46,120 Так от в SDL майстра семінару. 125 00:07:46,120 --> 00:07:49,750 Так що я збираюся йти в цьому каталозі. 126 00:07:49,750 --> 00:07:55,310 І те, що ми бачимо тут що у нас є сім C файли. 127 00:07:55,310 --> 00:07:58,070 І це буде код ми збираємося бути дивлячись на сьогоднішній день. 128 00:07:58,070 --> 00:08:00,040 У нас є Makefile. 129 00:08:00,040 --> 00:08:06,950 І у нас є каталог ресурсів, який просто має зображення 130 00:08:06,950 --> 00:08:09,070 що ви будете бачити досить скоро. 131 00:08:09,070 --> 00:08:16,060 >> Так давайте відкриємо ці файли за допомогою G-Edit редактора. 132 00:08:16,060 --> 00:08:22,000 Тому я хочу, щоб відкрити всі файли, які Почнемо з привіт і закінчуються на .c. 133 00:08:22,000 --> 00:08:23,380 Ось і ми. 134 00:08:23,380 --> 00:08:28,180 Так що ця крихітна вікно, таким чином, ми збираюся спробувати зробити що більше. 135 00:08:28,180 --> 00:08:28,900 Ні, він пішов. 136 00:08:28,900 --> 00:08:32,836 137 00:08:32,836 --> 00:08:34,570 >> Добре. 138 00:08:34,570 --> 00:08:37,959 Так от саме перше Файл ми збираємося дивитися. 139 00:08:37,959 --> 00:08:39,000 Це називається hello1_sdl.c. 140 00:08:39,000 --> 00:08:41,890 141 00:08:41,890 --> 00:08:47,980 І все це робить ініціалізацію SDL Бібліотека, так що ми можемо почати використовувати його. 142 00:08:47,980 --> 00:08:51,550 Як би Ви знаєте, щоб прийти з цим кодом самі? 143 00:08:51,550 --> 00:08:53,850 Ну, якщо ми подивимося більш в документації 144 00:08:53,850 --> 00:08:58,040 і ми йдемо в ініціалізації і закрили розділ, 145 00:08:58,040 --> 00:09:02,230 він збирається розповісти нам про те, як ініціалізувати SDL. 146 00:09:02,230 --> 00:09:06,630 Так, безумовно, читати це іншим разом. 147 00:09:06,630 --> 00:09:09,230 Це відбувається, щоб сказати вам все про те, що тут відбувається. 148 00:09:09,230 --> 00:09:14,360 Але головне утруднення в тому, що ми повинні викликати цю функцію SDL У Цьому 149 00:09:14,360 --> 00:09:18,910 і передати його, які речі ми хочемо, щоб бібліотека для ініціалізації. 150 00:09:18,910 --> 00:09:23,620 Таким чином, в нашому випадку, ми просто ініціалізувати відео зараз, 151 00:09:23,620 --> 00:09:26,690 так що ми можемо почати показ зображень. 152 00:09:26,690 --> 00:09:32,370 >> Тут, ви можете побачити, якщо клікаємо на SDL в ньому, ми 153 00:09:32,370 --> 00:09:36,160 може отримати ще більше інформації, у тому числі, що повертається. 154 00:09:36,160 --> 00:09:39,050 Таким чином, ми бачимо, що це returnes нулю на успіх. 155 00:09:39,050 --> 00:09:43,320 Таким чином, в нашому коді, ми збираємося побачити, якщо вона не повернеться до нуля, 156 00:09:43,320 --> 00:09:47,020 і якщо він не повертає нулю, так що це не було успішним, 157 00:09:47,020 --> 00:09:50,650 тоді ми йдемо до друку просто помилка при використанні цього іншу функцію, 158 00:09:50,650 --> 00:09:56,260 SDL помилок Get, який повертає рядок описуючи помилка, що виникала. 159 00:09:56,260 --> 00:09:58,510 Ми збираємося, щоб роздрукувати що помилки, а потім ми просто 160 00:09:58,510 --> 00:10:02,270 збирається вийти з програми з кодом помилки. 161 00:10:02,270 --> 00:10:06,470 >> Тоді інша справа, що ми повинні зробити це до виходу з програми, 162 00:10:06,470 --> 00:10:10,830 якщо ми успішно инициализирован SDL, нам просто потрібно назвати його SDL вийти. 163 00:10:10,830 --> 00:10:15,750 І, що збирається звертатися очищення всі внутрішні ресурси SDL для нас. 164 00:10:15,750 --> 00:10:21,240 Таким чином, документація there-- знову, тут ми знаходимося в ініціалізації 165 00:10:21,240 --> 00:10:23,640 і закрили розділ документації. 166 00:10:23,640 --> 00:10:26,680 Ви можете просто натисніть на Функція тут, SDL кинути, 167 00:10:26,680 --> 00:10:28,700 і ви можете прочитати все про те, що, як добре. 168 00:10:28,700 --> 00:10:31,400 І багато хто з цих функцій сторінки документації 169 00:10:31,400 --> 00:10:35,630 є приклад коду, так що це дуже хороший ресурс. 170 00:10:35,630 --> 00:10:39,610 Безумовно витратити якийсь час читати частини цієї вікі 171 00:10:39,610 --> 00:10:42,520 якщо ви збираєтеся зробити це для проекту. 172 00:10:42,520 --> 00:10:43,760 >> Добре. 173 00:10:43,760 --> 00:10:46,590 Так ось вся наша програма. 174 00:10:46,590 --> 00:10:53,935 Що ми можемо зробити зараз, я is-- збирається відкрити Makefile тут, 175 00:10:53,935 --> 00:10:56,150 так що я збираюся взяти подивитися на, як це працює. 176 00:10:56,150 --> 00:10:59,500 І це дуже простий Makefile, схоже на те, що ви бачили раніше. 177 00:10:59,500 --> 00:11:04,010 Одним з основних відмінностей є те, що тут, у цьому 178 00:11:04,010 --> 00:11:07,870 буде вставити результат бігу Ця команда, ви вже 179 00:11:07,870 --> 00:11:10,850 встановлений, якщо ви встановили SDL. 180 00:11:10,850 --> 00:11:13,230 І це команда який буде генерувати 181 00:11:13,230 --> 00:11:16,710 деякі додаткові прапори для компілятора. 182 00:11:16,710 --> 00:11:22,050 >> Крім того, ми даємо його всі звичайні команди, а також 183 00:11:22,050 --> 00:11:23,430 ці дві команди. 184 00:11:23,430 --> 00:11:30,270 Так що -lsdl2-зображення ручки пов'язуючи в бібліотеці SDL зображення. 185 00:11:30,270 --> 00:11:36,200 І насправді -lm обробляє зв'язування в стандартній математичної бібліотеки C. 186 00:11:36,200 --> 00:11:40,630 Таким чином, ми не знадобиться тих, для всіх наших файлів на Сі, 187 00:11:40,630 --> 00:11:43,900 але ми просто покласти їх у так що ми можемо використовувати ту ж Makefile для всього 188 00:11:43,900 --> 00:11:44,816 без змін. 189 00:11:44,816 --> 00:11:46,970 190 00:11:46,970 --> 00:11:50,080 >> Сюди в джерелах, це де ви б 191 00:11:50,080 --> 00:11:53,680 помістити файли, які ви збираєтеся компілювати для вашого проекту. 192 00:11:53,680 --> 00:11:57,570 Але так як кожен з моєї C файли сюди має основну функцію, 193 00:11:57,570 --> 00:12:00,000 це буде заплутатися якщо покласти їх у. 194 00:12:00,000 --> 00:12:06,930 Так що я збираюся просто сказати, зараз, hello1_sdl.c, 195 00:12:06,930 --> 00:12:11,150 який є одним ми просто дивилися. 196 00:12:11,150 --> 00:12:18,740 Так що, якщо я повертаюся протягом тут, я можу дійсно роблять. 197 00:12:18,740 --> 00:12:22,160 І що він зробив це просто складений, що перший файл. 198 00:12:22,160 --> 00:12:28,780 І тоді ми можемо ввести ./game, бо це виконуваний файл він справив. 199 00:12:28,780 --> 00:12:31,660 І все це зробив для друку ініціалізація успішно. 200 00:12:31,660 --> 00:12:33,300 Таким чином, ми зробили щось правильне. 201 00:12:33,300 --> 00:12:36,200 Але це було нудно, тому що ми не бачимо вікно, 202 00:12:36,200 --> 00:12:37,900 нічого не рухалось навколо. 203 00:12:37,900 --> 00:12:41,030 >> Так здорово, ми отримали SDL инициализируются. 204 00:12:41,030 --> 00:12:43,520 Тепер, давайте перейдемо до чогось трохи більш цікавим. 205 00:12:43,520 --> 00:12:54,700 Так от у нас є hello2_window.c, і це буде трохи більше 206 00:12:54,700 --> 00:13:00,010 комплекс С програма, ініціалізує SDL, як і раніше, 207 00:13:00,010 --> 00:13:04,250 тільки тепер ми також збираємося для ініціалізації SDL таймер. 208 00:13:04,250 --> 00:13:07,720 І це буде, щоб повідомити доступ до внутрішньої таймер 209 00:13:07,720 --> 00:13:10,550 і використовувати функції, пов'язані часу. 210 00:13:10,550 --> 00:13:11,920 >> А потім подивимося сюди. 211 00:13:11,920 --> 00:13:16,840 Те, що ми робимо, ми повинні цей покажчик до SDL вікно структури, яка 212 00:13:16,840 --> 00:13:21,160 буде створюватися цей заклик функції, SDL створити вікно. 213 00:13:21,160 --> 00:13:25,380 Тепер, це займає багато аргументів, так що давайте дивитися на документацію. 214 00:13:25,380 --> 00:13:27,930 Отже, ще раз, я збираюся API за категоріями, я 215 00:13:27,930 --> 00:13:33,820 знижується у відео тут, і перший розділ, показуючи управління вікнами. 216 00:13:33,820 --> 00:13:36,470 Таким чином, це секція має тонна речей у ньому, 217 00:13:36,470 --> 00:13:39,970 але якщо ви дивитеся через ці функції, ви будете 218 00:13:39,970 --> 00:13:43,620 бачити, що ймовірно, один ми потрібен, називається SDL створити вікно, 219 00:13:43,620 --> 00:13:46,600 який, трапляється, на самому верху. 220 00:13:46,600 --> 00:13:49,080 >> І тому це документація для цієї функції. 221 00:13:49,080 --> 00:13:53,710 Вікно матиме заголовок, Х і Y позиції на екрані, 222 00:13:53,710 --> 00:13:56,960 це матиме ширину, висоту, а потім він збирається прийняти деякі прапори. 223 00:13:56,960 --> 00:14:01,220 Тепер ми насправді не хвилює будь-який з цих прапорів зараз 224 00:14:01,220 --> 00:14:04,560 але якщо ви хочете зробити щось як зробити вікно на весь екран, 225 00:14:04,560 --> 00:14:07,920 Ви могли б поглянути на це. 226 00:14:07,920 --> 00:14:13,190 В даний час, ми тільки збираємося використовувати ці спеціальні значення, 227 00:14:13,190 --> 00:14:18,775 SDL вікно плюс центру для х і у в порядку 228 00:14:18,775 --> 00:14:21,800 просто створити вікно в центрі нашого екрану. 229 00:14:21,800 --> 00:14:24,370 >> Так ось, що це робить. 230 00:14:24,370 --> 00:14:27,960 А якщо вікно трапляється NULL, означаючи, що це помилка, 231 00:14:27,960 --> 00:14:32,570 Потім ми знову збираємося просто роздрукувати, використовуючи SDL помилку помилку отримаєте. 232 00:14:32,570 --> 00:14:36,570 А потім, тому що ми ініціалізації SDL, нам потрібно, щоб закрити його. 233 00:14:36,570 --> 00:14:40,900 Так ми називаємо SDL, перш ніж кинути Повертаючи одну для основної. 234 00:14:40,900 --> 00:14:42,905 >> Отже, ми маємо вікно відкрити, сподіваюся. 235 00:14:42,905 --> 00:14:44,613 І що ми збираємося зробити, ми збираємося 236 00:14:44,613 --> 00:14:50,340 зателефонувати SDL для 5000 мілісекунд, що те ж саме, як п'ять секунд. 237 00:14:50,340 --> 00:14:55,640 І коли ми зробили з цим, він збирається знищити вікно, 238 00:14:55,640 --> 00:14:59,470 прибирати бібліотека SDL, і вийти з програми. 239 00:14:59,470 --> 00:15:05,240 Так що давайте йти вперед і дати, що постріл. 240 00:15:05,240 --> 00:15:08,660 >> Так що тепер замість зміни Makefile, кожен раз, 241 00:15:08,660 --> 00:15:12,180 Я можу просто зробити, і Потім в командному рядку, 242 00:15:12,180 --> 00:15:16,090 кажуть джерела дорівнює, а потім файл ми компіляції. 243 00:15:16,090 --> 00:15:17,090 Так що це hello2_window.c. 244 00:15:17,090 --> 00:15:21,390 245 00:15:21,390 --> 00:15:21,890 Фантастичний. 246 00:15:21,890 --> 00:15:22,970 Немає erros. 247 00:15:22,970 --> 00:15:26,085 Тепер, якщо ми запустимо наш виконуваний файл, ми бачимо це вікно. 248 00:15:26,085 --> 00:15:27,960 Тепер є декілька Проблеми з вікном. 249 00:15:27,960 --> 00:15:32,820 Ми можемо перемістити його навколо, але вона має На цьому тлі небажаної всередині нього. 250 00:15:32,820 --> 00:15:34,660 Таким чином, ми не тягне що-небудь, і так це 251 00:15:34,660 --> 00:15:38,210 тільки повний сміття, яке це досить багато, що ми очікуємо. 252 00:15:38,210 --> 00:15:41,010 >> Крім того, ми не можемо закрити вікно. 253 00:15:41,010 --> 00:15:44,780 Я натисканні цієї X в кут і нічого, що відбувається. 254 00:15:44,780 --> 00:15:47,840 Таким чином, ми побачимо, як виправити що в небагато. 255 00:15:47,840 --> 00:15:51,750 Так що давайте виправити частину, де Вікно сповнена сміття в першу чергу. 256 00:15:51,750 --> 00:16:00,850 Так що, якщо ми йдемо до hello3_image.c, те, що ми бачимо в тому, що ми додали кілька 257 00:16:00,850 --> 00:16:03,360 більше речей тут. 258 00:16:03,360 --> 00:16:08,740 Ми додали цей новий заголовок подати, щоб отримати функції таймера. 259 00:16:08,740 --> 00:16:11,490 Я думаю, що ми зробили це в останній Один з них, теж, і я не згадувати. 260 00:16:11,490 --> 00:16:13,550 Але тепер, бо ми роботи із зображеннями, 261 00:16:13,550 --> 00:16:18,720 ми повинні включати SDL Файл заголовка зображення, а також. 262 00:16:18,720 --> 00:16:22,087 Так що це те ж саме, перш, ініціалізація SDL тут, 263 00:16:22,087 --> 00:16:23,420 Те ж саме справу зі створенням вікна. 264 00:16:23,420 --> 00:16:25,380 Ми бачили, що до цих пір. 265 00:16:25,380 --> 00:16:29,870 >> Тепер нам потрібно створити щось під назвою рендерер, який начебто йде разом 266 00:16:29,870 --> 00:16:30,800 з вікном. 267 00:16:30,800 --> 00:16:33,860 Але це свого роду абстрактний об'єкт, що це 268 00:16:33,860 --> 00:16:37,370 відповідальний робити всі ці малюнок операцій до вікна. 269 00:16:37,370 --> 00:16:41,580 І це насправді відповідає на програми, завантаженої 270 00:16:41,580 --> 00:16:47,880 в графічному обладнанні у вашій комп'ютер або телефон, або що завгодно. 271 00:16:47,880 --> 00:16:51,005 Таким чином, прапори, які ми хочемо передати it-- і ви можете дивитися на документацію 272 00:16:51,005 --> 00:16:56,160 щоб отримати більш детальну інформацію here-- збираєтеся щоб бути SDL винести прискорюється, що 273 00:16:56,160 --> 00:16:58,550 означає, що він буде за допомогою графічного обладнання 274 00:16:58,550 --> 00:17:01,490 і не тільки емулювати в програмному забезпеченні. 275 00:17:01,490 --> 00:17:07,390 >> І ми збираємося використовувати SDL рендеринга PRESENTVSYNC. 276 00:17:07,390 --> 00:17:12,280 VSYNC це річ, яка просто робить Ваші графіки виглядають краще і запобігає 277 00:17:12,280 --> 00:17:14,970 це те, що називається екраном терор, де половина 278 00:17:14,970 --> 00:17:17,720 одного кадру і половина наступного рамка втягнутися в той же час 279 00:17:17,720 --> 00:17:20,056 і це виглядає жахливо. 280 00:17:20,056 --> 00:17:23,130 Але, знову ж, ви можете йти читати про те, що за своїм розсудом. 281 00:17:23,130 --> 00:17:24,319 >> Отже, ми маємо деякі прапори тут. 282 00:17:24,319 --> 00:17:27,810 І так ми тільки збираємося називати ця функція SDL створити візуалізації. 283 00:17:27,810 --> 00:17:31,340 Ми збираємося дати йому вікно пов'язати з цієї візуалізації. 284 00:17:31,340 --> 00:17:34,520 Негативний одним означає, що ми не хвилює, що Графічний драйвер ми збираємося використовувати. 285 00:17:34,520 --> 00:17:36,603 Так що треба дуже багато завжди негативний, 286 00:17:36,603 --> 00:17:39,010 якщо ви не знаєте про графічних драйверів. 287 00:17:39,010 --> 00:17:41,650 І тоді ми тільки збираємося передати їй наші прапори. 288 00:17:41,650 --> 00:17:47,240 Так що, якщо повертається NULL, то ми в друк помилку, як зазвичай, 289 00:17:47,240 --> 00:17:49,550 але тоді ми також збираємося знищити вікно 290 00:17:49,550 --> 00:17:54,970 прибирати ці ресурси, перш ніж називаючи SDL кинути і повернутися. 291 00:17:54,970 --> 00:17:58,110 >> Тепер, цікава частина тут те, де ми завантажуємо наш імідж 292 00:17:58,110 --> 00:18:00,870 Використовуючи цю функцію IMG_load. 293 00:18:00,870 --> 00:18:04,050 Це єдина функція ми збираємося використовувати з бібліотеки SDL зображення. 294 00:18:04,050 --> 00:18:05,480 Це єдиний, хто нам потрібен. 295 00:18:05,480 --> 00:18:12,950 Це функція, яка сприймає рядок це шлях будь-якого ресурсу зображення. 296 00:18:12,950 --> 00:18:18,024 І це може бути .png, А GIF, растрові, будь-який з цих речей. 297 00:18:18,024 --> 00:18:19,690 І ось чому ця функція так добре. 298 00:18:19,690 --> 00:18:22,560 Він може обробляти майже будь-який формат. 299 00:18:22,560 --> 00:18:27,240 Вантажі його в пам'ять і зберігає його як річ називається SDL поверхню. 300 00:18:27,240 --> 00:18:34,660 >> Тепер SDL поверхню лише структура яка представляє дані зображення в пам'яті. 301 00:18:34,660 --> 00:18:38,054 Таким чином, ви можете прочитати більше про що в документації два. 302 00:18:38,054 --> 00:18:40,720 І якщо це помилки, то ми збираюся зробити все це десь 303 00:18:40,720 --> 00:18:44,480 ми друкуємо помилку, закрити ресурси, а потім вийти з програми. 304 00:18:44,480 --> 00:18:48,970 Тепер найцікавіше, до ми можемо зробити цей образ до вікна, 305 00:18:48,970 --> 00:18:51,390 ми повинні насправді зробити це текстура. 306 00:18:51,390 --> 00:18:54,460 Тепер текстура відповідає до даних зображення, завантажених 307 00:18:54,460 --> 00:18:57,820 в пам'ять апаратної графічної з відділу. 308 00:18:57,820 --> 00:19:00,720 >> Таким чином, поверхня в основний пам'яті, регулярне пам'яті 309 00:19:00,720 --> 00:19:05,550 що ми використали всі семестр, і текстура в цій окремій відеопам'яті 310 00:19:05,550 --> 00:19:09,410 пам'яті, елементи управління графічної карти. 311 00:19:09,410 --> 00:19:13,170 Так ми називаємо цю функцію SDL_CreateTextureFromSurface. 312 00:19:13,170 --> 00:19:17,104 Ми даємо йому нашу візуалізації і наш поверхню. 313 00:19:17,104 --> 00:19:19,020 І тоді ми насправді зроблено з поверхнею, 314 00:19:19,020 --> 00:19:20,311 так ми тільки збираємося, щоб звільнити його. 315 00:19:20,311 --> 00:19:22,210 Ми не потрібен. 316 00:19:22,210 --> 00:19:26,650 А потім, так що якщо цей заклик помилками і повернувся порожнім, 317 00:19:26,650 --> 00:19:29,630 то ми збираємося зробити весь Помилка звітності саме. 318 00:19:29,630 --> 00:19:30,920 >> Добре. 319 00:19:30,920 --> 00:19:34,810 Тут ми отримуємо до деяких фактичні функції рендеринга. 320 00:19:34,810 --> 00:19:37,730 Так називаючи SDL_RenderClear і передачі його 321 00:19:37,730 --> 00:19:42,550 рендер, пов'язані з нашим вікном просто робить вікно темніє. 322 00:19:42,550 --> 00:19:47,650 Так він знімає, що сміття, який ми бачили в наше вікно, перш ніж вона і робить чорний. 323 00:19:47,650 --> 00:19:50,750 А потім ми збираємося зателефонувати SDL_RenderCopy, 324 00:19:50,750 --> 00:19:53,010 дати йому наш візуалізації, нашу текстуру. 325 00:19:53,010 --> 00:19:55,800 І ми будемо говорити про те, що ці поля знаходяться в небагато. 326 00:19:55,800 --> 00:19:57,830 Але що відбувається, щоб прийняти дані текстури 327 00:19:57,830 --> 00:20:03,100 і скопіювати його на наш Вікно для отрисовки зображення. 328 00:20:03,100 --> 00:20:07,020 Так після того як ми зробили цю копію даних на нашому вікні, 329 00:20:07,020 --> 00:20:11,180 ми повинні зробити це додаткова функція називається SDL_RenderPresent. 330 00:20:11,180 --> 00:20:15,360 >> І це цікаво бо це стає 331 00:20:15,360 --> 00:20:18,770 в темі під назвою подвійний буферизації. 332 00:20:18,770 --> 00:20:24,380 Так подвійний буферизації є метод, який робить ваші графіки виглядають набагато краще. 333 00:20:24,380 --> 00:20:28,240 Знову ж, це запобігає розриву екрану Я говорив раніше, де 334 00:20:28,240 --> 00:20:29,590 у вас є два буфера. 335 00:20:29,590 --> 00:20:32,260 Там це знову буфера в пам'ять і передній буфер. 336 00:20:32,260 --> 00:20:36,410 Передня буфер буквально що на екрані в даний момент. 337 00:20:36,410 --> 00:20:42,070 Таким чином, ми робимо все це намалювати варіації, як SDL надати копію або SDL_RenderClear 338 00:20:42,070 --> 00:20:43,080 у вторинний буфер. 339 00:20:43,080 --> 00:20:44,800 Так вони змінюють речі У заднього буфера. 340 00:20:44,800 --> 00:20:48,970 Тут ми могли б малювати цей зелений квадрат, щоб буфера. 341 00:20:48,970 --> 00:20:52,300 >> Отже, коли ми зробили робити наші роблять операції, які 342 00:20:52,300 --> 00:20:55,700 може зайняти дуже довго Час, що ми збираємося зробити 343 00:20:55,700 --> 00:20:57,860 це перемкнути буфери. 344 00:20:57,860 --> 00:21:00,720 Так що буквально бере передній буфер і назад буфер 345 00:21:00,720 --> 00:21:02,990 і перемикає їх, так що, миттєво, 346 00:21:02,990 --> 00:21:06,630 за одну операцію замість може бути, сотні або тисячі, 347 00:21:06,630 --> 00:21:10,910 всі наші знову опиняється об'єкти на екрані. 348 00:21:10,910 --> 00:21:13,160 І це заважає речі як оновлювати екран 349 00:21:13,160 --> 00:21:16,710 коли ми тільки половина звертається наших об'єктів в кадрі. 350 00:21:16,710 --> 00:21:21,280 Так ось чому ми повинні викликати SDL_RenderPresent, а також 351 00:21:21,280 --> 00:21:23,320 а SDL_RenderCopy. 352 00:21:23,320 --> 00:21:25,749 >> Знову ж таки, ми тільки збираємося чекати протягом п'яти секунд. 353 00:21:25,749 --> 00:21:27,540 Тоді ми йдемо до очистити наші ресурси. 354 00:21:27,540 --> 00:21:29,540 У нас є досить кілька більш цього разу. 355 00:21:29,540 --> 00:21:31,750 І тоді ми тільки збираємося для виходу з програми. 356 00:21:31,750 --> 00:21:35,350 Так давайте зробимо це. 357 00:21:35,350 --> 00:21:41,880 Я збираюся ввести марку, а потім джерела дорівнює hello-- це тепер 3image.c. 358 00:21:41,880 --> 00:21:49,632 359 00:21:49,632 --> 00:21:52,240 Гаразд, не складений без помилок. 360 00:21:52,240 --> 00:21:57,210 І ви можете подивитися тут Я тепер витягується моє зображення, Привіт, CS50! 361 00:21:57,210 --> 00:22:00,560 в нашому вікні, яке зникає через п'ять секунд. 362 00:22:00,560 --> 00:22:02,090 >> Тепер, це все ще є проблеми, чи не так? 363 00:22:02,090 --> 00:22:05,750 Це не хороший додаток, тому що, коли я намагаюся закрити вікно, 364 00:22:05,750 --> 00:22:06,500 нічого не відбувається. 365 00:22:06,500 --> 00:22:09,540 Це х як і раніше не відповідає. 366 00:22:09,540 --> 00:22:17,420 Отже, давайте поглянемо на наступний файл, hello4animation. 367 00:22:17,420 --> 00:22:21,850 Так що це файл що збирається ввести 368 00:22:21,850 --> 00:22:25,124 переміщення і рух до нашого зображення. 369 00:22:25,124 --> 00:22:27,040 Так що ми збираємося зробити Те ж саме, як і колись, 370 00:22:27,040 --> 00:22:30,190 ініціювати SDL, створити вікна, створити візуалізації, 371 00:22:30,190 --> 00:22:33,030 завантажити зображення в пам'яті, створити текстуру. 372 00:22:33,030 --> 00:22:35,090 Ми бачили все це раніше. 373 00:22:35,090 --> 00:22:36,770 Тепер, ось це нове. 374 00:22:36,770 --> 00:22:42,305 Ми збираємося, щоб мати структуру, звану SDL прямокутник, який є просто прямокутник. 375 00:22:42,305 --> 00:22:49,950 Якщо ми йдемо сюди, ми можемо зробити пошук для SDL прямокутника, 376 00:22:49,950 --> 00:22:54,040 і ви можете бачити, що це Дуже проста структура. 377 00:22:54,040 --> 00:22:56,760 Він має х, а у для положення, і 378 00:22:56,760 --> 00:23:02,080 має ширину і висоту для розмір прямокутника. 379 00:23:02,080 --> 00:23:07,785 >> Отже, що ми збираємося зробити, це ми буде визначати цей SDL прямокутника адресата, 380 00:23:07,785 --> 00:23:09,480 для призначення. 381 00:23:09,480 --> 00:23:14,130 І це місце, на екрані, де 382 00:23:14,130 --> 00:23:16,005 ми збираємося бути малюнок наш образ, прямо так 383 00:23:16,005 --> 00:23:17,880 якщо ми збираємося бути переміщення зображення навколо, 384 00:23:17,880 --> 00:23:20,300 то призначення, де ми збираємося залучити зображення 385 00:23:20,300 --> 00:23:22,620 повинні бути в русі. 386 00:23:22,620 --> 00:23:24,910 Отже, ми збираємося назвати це Функція SDL_QueryTexture. 387 00:23:24,910 --> 00:23:27,550 388 00:23:27,550 --> 00:23:33,500 І зауважте, я передаю адреса з dest.w, що ширина, 389 00:23:33,500 --> 00:23:36,950 і dest.h, що висота. 390 00:23:36,950 --> 00:23:40,425 І так буде SDL_QueryTexture зберігати в цих областях ширина 391 00:23:40,425 --> 00:23:41,675 а висота нашої текстури. 392 00:23:41,675 --> 00:23:44,680 393 00:23:44,680 --> 00:23:47,030 >> І тоді те, що я збираюся зробити, я збираюся 394 00:23:47,030 --> 00:23:55,580 встановити dest.x бути вікно ширина мінус dest.w, що 395 00:23:55,580 --> 00:23:59,000 ширина спрайту, ділиться на 2. 396 00:23:59,000 --> 00:24:03,860 І це буде налаштувати його так, що образ ідеально по центру 397 00:24:03,860 --> 00:24:06,780 в нашому вікні, все в порядку? 398 00:24:06,780 --> 00:24:08,652 Так що тепер у мене є позиція у. 399 00:24:08,652 --> 00:24:10,360 І це буде бути змінної, яка 400 00:24:10,360 --> 00:24:16,390 змінюється, тому що ми збираємося, щоб бути переміщення зображення у напрямку у. 401 00:24:16,390 --> 00:24:19,050 І тепер у нас є щось називається цикл анімації. 402 00:24:19,050 --> 00:24:21,180 >> Так як же анімація працює? 403 00:24:21,180 --> 00:24:27,630 Ну, людське око може виявити 12 різних зображення в кожну секунду, добре? 404 00:24:27,630 --> 00:24:33,060 Так що, якщо ви блимати 12 зображень карт на мене в секунду, я бачив кожен з цих образів 405 00:24:33,060 --> 00:24:35,950 а своїм власним окремого зображення. 406 00:24:35,950 --> 00:24:39,690 Тепер, якщо ви блимати більш зображення у мене в секунду, 407 00:24:39,690 --> 00:24:42,140 то моє око почне щоб розмити їх разом 408 00:24:42,140 --> 00:24:46,920 і я б сприймати його як рух, замість одного окремого зображення. 409 00:24:46,920 --> 00:24:51,930 Так, наприклад, кіно і телебачення, вони блимають зображення у вас 24 рази 410 00:24:51,930 --> 00:24:52,570 секунда. 411 00:24:52,570 --> 00:24:55,110 Так от 24 кадрів в секунду. 412 00:24:55,110 --> 00:25:00,136 Екрани комп'ютера, з іншого боку, часто при 60 кадрах в секунду. 413 00:25:00,136 --> 00:25:01,260 Це їх швидкість оновлення. 414 00:25:01,260 --> 00:25:04,650 Ось як часто вони оновити зображення на екрані. 415 00:25:04,650 --> 00:25:08,960 Таким чином, наша мета буде 60 кадрів в секунду для наших ігор. 416 00:25:08,960 --> 00:25:11,770 417 00:25:11,770 --> 00:25:13,710 >> Отже, давайте подивимося, що в коді. 418 00:25:13,710 --> 00:25:19,064 Таким чином, для кожного кадру, ми в першу чергу збирається очистити вікно. 419 00:25:19,064 --> 00:25:20,230 Це загальна картина. 420 00:25:20,230 --> 00:25:22,450 Ви завжди очистити Вікно кожен кадр, а потім 421 00:25:22,450 --> 00:25:25,210 робити все на кресленні операції, а потім врешті-решт, 422 00:25:25,210 --> 00:25:29,610 у RenderPresent, щоб показати все в кадрі. 423 00:25:29,610 --> 00:25:33,910 І тоді ви будете є очікування в кінці 424 00:25:33,910 --> 00:25:36,340 не чекати до наступного рама повинна розпочатися. 425 00:25:36,340 --> 00:25:38,650 >> Так що, якщо я роблю багато Комплекс обчислення тут 426 00:25:38,650 --> 00:25:43,100 що було потрібно більше 16 мілісекунд, було б неможливо для мене 427 00:25:43,100 --> 00:25:46,890 щоб отримати, що частота кадрів 60, що Я хотів, тому що кожен кадр 428 00:25:46,890 --> 00:25:48,750 занадто довго, щоб обчислити. 429 00:25:48,750 --> 00:25:52,340 Крім того, ми дійсно робимо Сортувати мізерної кількості роботи 430 00:25:52,340 --> 00:25:54,820 тут, тому що є тільки Єдине, що ми малюємо. 431 00:25:54,820 --> 00:25:59,390 Так що я просто почекати 1/60 по-друге, що довжина 432 00:25:59,390 --> 00:26:01,520 рами між кадрами. 433 00:26:01,520 --> 00:26:05,610 Так що я начебто прикидаючись робити вся моя робота займає нульовий час. 434 00:26:05,610 --> 00:26:09,050 Але в реальній грі, ви повинні відняти 435 00:26:09,050 --> 00:26:13,760 кількість часу, який треба було, щоб зробити вся ця робота з Вашого часу відпочинку. 436 00:26:13,760 --> 00:26:16,970 >> Так чи інакше, що я насправді робить в цьому циклі? 437 00:26:16,970 --> 00:26:19,070 Очистити вікно. 438 00:26:19,070 --> 00:26:27,470 Я встановив dest.y, який є INT, щоб моя фактична позиція у кинутий у міжнар. 439 00:26:27,470 --> 00:26:32,070 Тепер я хочу, плавати дозвіл для моєї позиції у в моїй грі, 440 00:26:32,070 --> 00:26:34,150 але тоді насправді намалювати його на екрані, 441 00:26:34,150 --> 00:26:39,070 він повинен Інтс, тому що це в одиницях пікселів, так це те, що приведення в. 442 00:26:39,070 --> 00:26:41,745 Я збираюся намалювати зображення. 443 00:26:41,745 --> 00:26:45,180 Так що це вихідний прямокутник. 444 00:26:45,180 --> 00:26:47,060 І це прямокутник призначення. 445 00:26:47,060 --> 00:26:50,310 Так я пройшов нуль для джерело прямокутник 446 00:26:50,310 --> 00:26:53,426 сказати, що я хочу звернути всю свою текстуру. 447 00:26:53,426 --> 00:26:55,300 Але якщо у вас багато текстури у вашій грі 448 00:26:55,300 --> 00:26:59,120 і всі вони в один великий карти текстури який був завантажений в SDL в тільки один 449 00:26:59,120 --> 00:27:02,850 текстури, ви могли б використовувати вихідний прямокутник 450 00:27:02,850 --> 00:27:06,750 вибрати один з невеликих текстур, один з невеликих спрайтів, 451 00:27:06,750 --> 00:27:09,450 з цього великої мапі текстури. 452 00:27:09,450 --> 00:27:14,740 >> Отже, ще раз, я передаю мій рендер, мій текстура, і в даний час призначення. 453 00:27:14,740 --> 00:27:18,320 Це буде десь в Вікно це буде звернено. 454 00:27:18,320 --> 00:27:21,390 А потім, тому що я малюю то, мені потрібен рух, 455 00:27:21,390 --> 00:27:25,150 Я збираюся бути оновленню Положення спрайт в кожному кадрі. 456 00:27:25,150 --> 00:27:30,190 Так що в мене це постійне назвою сувій швидкості в блоки пікселів в секунду. 457 00:27:30,190 --> 00:27:34,320 Тепер, кожен раз, коли ми робимо рух, кадр тільки 1/60 секунди. 458 00:27:34,320 --> 00:27:36,740 Так що я збираюся розділити, що на 60. 459 00:27:36,740 --> 00:27:42,350 А потім, давайте подивимося, я віднімання, що з позиції у. 460 00:27:42,350 --> 00:27:44,470 Чому я віднімання? 461 00:27:44,470 --> 00:27:46,169 Ми повернемося до цього в секунду. 462 00:27:46,169 --> 00:27:48,460 Тоді я очистити свої ресурси і програма закінчиться. 463 00:27:48,460 --> 00:27:49,830 >> Так давайте зробимо це. 464 00:27:49,830 --> 00:27:52,450 465 00:27:52,450 --> 00:28:03,570 Так що давайте йти в макіяж SRCS = hello4 animation.c, все в порядку? 466 00:28:03,570 --> 00:28:05,720 Игра. 467 00:28:05,720 --> 00:28:06,770 Ось так. 468 00:28:06,770 --> 00:28:12,690 Так він у мене прокрутки вгору по вікно, яке є досить охайно. 469 00:28:12,690 --> 00:28:17,110 Але тримайтеся, я був віднімання від положення у кожного разу. 470 00:28:17,110 --> 00:28:18,910 Що там відбувається? 471 00:28:18,910 --> 00:28:24,010 Ну, виходить, що в SDL, і Справді, в більшості комп'ютерної графіки, 472 00:28:24,010 --> 00:28:28,890 походження для системи координат є верхній лівій частині вікна. 473 00:28:28,890 --> 00:28:34,960 >> Таким чином, позитивний напрямок йде х по вашому вікні праворуч. 474 00:28:34,960 --> 00:28:38,110 І позитивний у напрямок насправді йде вниз. 475 00:28:38,110 --> 00:28:40,470 Отже, ще раз, в походженні в верхній лівий вікна, 476 00:28:40,470 --> 00:28:46,190 позитивний напрямок у вниз, і позитивний х вправо. 477 00:28:46,190 --> 00:28:48,770 Тому, коли я відняти з позиція у, це 478 00:28:48,770 --> 00:28:52,640 збирається зробити це перейти на негативі у напрям, який становить вікні. 479 00:28:52,640 --> 00:28:55,500 Так ось те, що там відбувається. 480 00:28:55,500 --> 00:28:56,510 Прохолодний. 481 00:28:56,510 --> 00:28:59,240 >> Давайте подивимося на наступний файл. 482 00:28:59,240 --> 00:29:05,700 Ось частина з показати, де ми, нарешті, 483 00:29:05,700 --> 00:29:08,920 отримати цю X в кутку вікна що, як передбачається, щоб закрити вікно 484 00:29:08,920 --> 00:29:10,660 працювати. 485 00:29:10,660 --> 00:29:12,800 Так що ж відбувається? 486 00:29:12,800 --> 00:29:17,520 Ми ініціалізіруем SDL, створити вікно, створити візуалізації, завантажте зображення, 487 00:29:17,520 --> 00:29:19,770 створити текстуру як ми бачили раніше. 488 00:29:19,770 --> 00:29:26,850 У нас же прямокутник призначення як і колись, той самий виклик, щоб запросити текстуру. 489 00:29:26,850 --> 00:29:29,780 Але цього разу, ми тоді розділимо ширину 490 00:29:29,780 --> 00:29:33,110 і висота нашого призначення за 4. 491 00:29:33,110 --> 00:29:36,430 Це має тільки ефект масштабування наш образ вниз, коли 492 00:29:36,430 --> 00:29:39,884 ми показуємо його у вікні на чотири. 493 00:29:39,884 --> 00:29:40,800 Так що це досить охайно. 494 00:29:40,800 --> 00:29:42,770 Ми можемо просто масштабувати просто так. 495 00:29:42,770 --> 00:29:45,970 Ми збираємося почати спрайт в центрі екрану. 496 00:29:45,970 --> 00:29:49,410 І тепер у нас є х і швидкість у і вони обидва збираються почати з нуля. 497 00:29:49,410 --> 00:29:53,740 498 00:29:53,740 --> 00:29:55,880 >> Це неправильний файл. 499 00:29:55,880 --> 00:29:56,380 Мені дуже шкода. 500 00:29:56,380 --> 00:29:57,960 Так що все це правда. 501 00:29:57,960 --> 00:30:00,170 Це все ще в цьому файлі. 502 00:30:00,170 --> 00:30:03,210 У нас є поділ на 4, і все. 503 00:30:03,210 --> 00:30:07,830 Так от у нас є х і у позиції для центру вікна. 504 00:30:07,830 --> 00:30:12,480 І ми даємо йому початкову швидкість цієї постійною швидкістю, яка 505 00:30:12,480 --> 00:30:15,180 Я вважаю, це 300 пікселів в секунду. 506 00:30:15,180 --> 00:30:19,850 Тепер у нас є це INT може так само добре, бути логічне називається рядом просив. 507 00:30:19,850 --> 00:30:23,970 І замість того, Ведення нескінченний цикл по таймеру тут, 508 00:30:23,970 --> 00:30:29,180 ми збираємося анімувати, як Поки близько не просив. 509 00:30:29,180 --> 00:30:30,960 >> Так як ми обробляємо події? 510 00:30:30,960 --> 00:30:35,600 Ну, SDL черзі до подій в буквальне черзі за лаштунками. 511 00:30:35,600 --> 00:30:38,860 І тоді кожен кадр, ми можемо з черги подій 512 00:30:38,860 --> 00:30:43,900 від цієї черги, використовуючи цей виклик SDL_PullEvent. 513 00:30:43,900 --> 00:30:46,730 І знову, виразно йти читати про це в документації. 514 00:30:46,730 --> 00:30:50,450 Там дуже багато більше деталей і багато більше функцій ви можете використовувати в цьому. 515 00:30:50,450 --> 00:30:54,750 Ми передаємо їй адреса цієї речі, SDL_Event 516 00:30:54,750 --> 00:30:56,990 що ми маємо тут в стеку. 517 00:30:56,990 --> 00:30:58,840 >> Тепер, що є SDL_event? 518 00:30:58,840 --> 00:31:02,356 Тому що SDL, якщо ми подивимося в в documentation-- давайте 519 00:31:02,356 --> 00:31:07,580 см, API за категоріями, вхід Події, обробка подій, 520 00:31:07,580 --> 00:31:15,150 ми можемо подивитися на кількість різних подій тут 521 00:31:15,150 --> 00:31:18,600 і ми бачимо, що є в цілому т з них. 522 00:31:18,600 --> 00:31:22,150 Так що це SDL_Event річ? 523 00:31:22,150 --> 00:31:28,190 524 00:31:28,190 --> 00:31:31,107 SDL_Event є об'єднанням. 525 00:31:31,107 --> 00:31:31,940 Нічого собі, що таке об'єднання? 526 00:31:31,940 --> 00:31:33,910 Ви ймовірно ніколи не чув, що раніше. 527 00:31:33,910 --> 00:31:35,610 І це нормально. 528 00:31:35,610 --> 00:31:39,420 >> Союз ніби як на структуру, за винятком структури 529 00:31:39,420 --> 00:31:41,960 має місце для всіх його поля і пам'яті, 530 00:31:41,960 --> 00:31:45,060 в той час як союз тільки має достатньо місця, щоб відповідати найбільшим 531 00:31:45,060 --> 00:31:49,660 один з його полів, що означає його може зберігати тільки один з його полів 532 00:31:49,660 --> 00:31:52,830 в той час, який вид має сенс для подій, вірно? 533 00:31:52,830 --> 00:31:55,810 Ми можемо мати клавіатуру подія або захід вікно, 534 00:31:55,810 --> 00:31:59,750 але одна подія не може бути й Захід клавіатура і вікно подій, 535 00:31:59,750 --> 00:32:05,450 так що було б нерозумно мати простір для і тих, хто всередині нашого союзу подій. 536 00:32:05,450 --> 00:32:07,770 Так що, якщо ви хочете, щоб створити свій власний союз, 537 00:32:07,770 --> 00:32:10,020 це виглядає точно так само, як створення на структуру, 538 00:32:10,020 --> 00:32:14,140 крім того, що ми використовуємо ключове слово союзу замість слова структури. 539 00:32:14,140 --> 00:32:17,490 І пам'ятайте, для всіх з речі всередині вашого союзу, 540 00:32:17,490 --> 00:32:22,020 фактична величина, об'єднання може мати тільки один з цих значень 541 00:32:22,020 --> 00:32:24,780 зараз. 542 00:32:24,780 --> 00:32:29,940 >> Так як ми можемо сказати, що це за події ми просто виштовхується з цієї черги? 543 00:32:29,940 --> 00:32:33,370 Ну, ми можемо перевірити Event.type. 544 00:32:33,370 --> 00:32:35,792 І якщо це одно щоб SDL_Quit, ми знаємо, 545 00:32:35,792 --> 00:32:37,500 це подія, яка був створений, коли ми 546 00:32:37,500 --> 00:32:39,510 вдарив, що X в кутку вікна. 547 00:32:39,510 --> 00:32:44,270 І ми можемо встановити поруч просив дорівнює 1. 548 00:32:44,270 --> 00:32:47,230 В іншому це просто деякі анімації що ви бачили раніше. 549 00:32:47,230 --> 00:32:52,802 Так що давайте йти вперед і зробити це і побачити, наскільки добре вона працює. 550 00:32:52,802 --> 00:32:55,135 Так що я збираюся ввести марку і Потім SRCS = hello5_events.c. 551 00:32:55,135 --> 00:33:03,760 552 00:33:03,760 --> 00:33:04,770 Там ми йдемо. 553 00:33:04,770 --> 00:33:05,780 Ігри. 554 00:33:05,780 --> 00:33:08,920 >> Тепер ми можемо бачити, що це було дійсно скоротили в чотири рази. 555 00:33:08,920 --> 00:33:10,360 І тепер це підстрибуючи. 556 00:33:10,360 --> 00:33:14,630 У мене є виявлення зіткнення відбувається з бічних сторін вікна 557 00:33:14,630 --> 00:33:16,840 що ми можемо поглянути на. 558 00:33:16,840 --> 00:33:21,190 І те, що відбувається, коли я йду, щоб закрити його? 559 00:33:21,190 --> 00:33:22,120 Він закриває. 560 00:33:22,120 --> 00:33:22,740 Фантастичний. 561 00:33:22,740 --> 00:33:24,290 Ми отримали цю подію. 562 00:33:24,290 --> 00:33:26,630 І ми впоралися. 563 00:33:26,630 --> 00:33:30,730 >> Отже, давайте подивимося назад на код. 564 00:33:30,730 --> 00:33:33,020 Отже, як же я його підстрибуючи, як, що? 565 00:33:33,020 --> 00:33:37,200 Пам'ятаєте, я встановити обидва х і у спочатку швидкостей. 566 00:33:37,200 --> 00:33:39,260 А швидкість є позитивним постійна, так що 567 00:33:39,260 --> 00:33:42,680 збирався зробити це, починаючи з йде вниз і вправо. 568 00:33:42,680 --> 00:33:45,680 569 00:33:45,680 --> 00:33:50,310 >> Тепер, кожен кадр, в додаток до обробки будь-які події, які могли статися, 570 00:33:50,310 --> 00:33:57,520 Я збираюся виявити чи мій спрайт намагається вийти з вікна. 571 00:33:57,520 --> 00:34:03,610 Таким чином, ми можемо зробити це, просто перевірка x_pos з 0, y_pos 0, а потім 572 00:34:03,610 --> 00:34:07,370 також x_pos і y_pos з ширина і висота вікна вікно. 573 00:34:07,370 --> 00:34:11,010 Зверніть увагу, я віднімається ширина спрайту. 574 00:34:11,010 --> 00:34:14,090 І це тому, що, якщо я не зробив відняти ширину спрайту, 575 00:34:14,090 --> 00:34:17,760 це тільки перевірити, що походження спрайту 576 00:34:17,760 --> 00:34:19,690 не виходити за межі вікна. 577 00:34:19,690 --> 00:34:21,480 Але ми хочемо, цільні ширина спрайту 578 00:34:21,480 --> 00:34:24,030 щоб завжди бути у вікні і вся висота спрайту 579 00:34:24,030 --> 00:34:25,321 щоб завжди бути у вікні. 580 00:34:25,321 --> 00:34:27,429 Так ось те, що віднімання для. 581 00:34:27,429 --> 00:34:30,080 Багато геометрії тут можна корисно звернути його 582 00:34:30,080 --> 00:34:33,929 на папері з координатою Система подивитися, що відбувається. 583 00:34:33,929 --> 00:34:38,090 >> Так що, якщо я стикаються, я просто просто скинути позицію 584 00:34:38,090 --> 00:34:41,400 так, що вона не буде з екрана. 585 00:34:41,400 --> 00:34:47,179 І я збираюся, якщо він відскакує на одній з бічних стінок, 586 00:34:47,179 --> 00:34:51,469 Я збираюся заперечувати х швидкість, так що 587 00:34:51,469 --> 00:34:53,210 починається підстрибуючи в іншому напрямку. 588 00:34:53,210 --> 00:34:56,210 І точно так само, якщо вона потрапляє верхньої або нижньої, 589 00:34:56,210 --> 00:34:59,820 Я збираюся встановити швидкість у одно негативною швидкості у, 590 00:34:59,820 --> 00:35:01,690 так що воно повернеться. 591 00:35:01,690 --> 00:35:03,860 Так що це просто, як ми отримали це тут. 592 00:35:03,860 --> 00:35:07,560 >> І оновлення позиції так само, як ми бачили раніше, 593 00:35:07,560 --> 00:35:12,510 розділити на 60, тому що ми тільки обробка 1/60 секунди. 594 00:35:12,510 --> 00:35:15,750 А потім рендеринга, точно так само, як і раніше. 595 00:35:15,750 --> 00:35:19,810 І так, що все, що відбувається на цьому файлі. 596 00:35:19,810 --> 00:35:22,490 Так от, як ми робимо події. 597 00:35:22,490 --> 00:35:29,260 Головне, щоб забрати тут ця функція SDL_PullEvent. 598 00:35:29,260 --> 00:35:33,020 І ви повинні, безумовно, читати Документація більше про SDL_Event 599 00:35:33,020 --> 00:35:38,630 об'єднання, тому що цей тип даних є дуже, дуже важливо, тому що ми використовуємо його 600 00:35:38,630 --> 00:35:40,690 для всіх видів заходів. 601 00:35:40,690 --> 00:35:46,539 >> Наприклад, ми використовуємо його для клавіатури Події, які це те, що цей файл для. 602 00:35:46,539 --> 00:35:47,330 Отже, що ж ми маємо? 603 00:35:47,330 --> 00:35:50,180 У нас є те ж саме, як і колись, ініціалізації SDL, створити вікно, 604 00:35:50,180 --> 00:35:55,260 створити візуалізації, завантажити зображення в пам'ять, створити текстуру. 605 00:35:55,260 --> 00:36:00,530 Знову ж таки, ми збираємося Тобто цей Dest прямокутник, 606 00:36:00,530 --> 00:36:04,890 ми збираємося масштабувати зображення на чотири, зробити його трохи менше. 607 00:36:04,890 --> 00:36:08,000 Тепер, ми збираємося, щоб почати спрайт в центрі екрану. 608 00:36:08,000 --> 00:36:12,090 Але цього разу, ми збираємося встановити Початкові х і у швидкості до нуля, 609 00:36:12,090 --> 00:36:15,140 бо клавіатура контролюватиме їх. 610 00:36:15,140 --> 00:36:18,900 І, крім того, ми збираємося відслідковувати цих змінних 611 00:36:18,900 --> 00:36:20,450 вгору, вниз, вліво і вправо. 612 00:36:20,450 --> 00:36:23,090 І що буде тримати трек ми маю 613 00:36:23,090 --> 00:36:27,370 натисканні кнопок клавіатури, що відповідають вгору, вниз, вліво, 614 00:36:27,370 --> 00:36:28,460 і правильно. 615 00:36:28,460 --> 00:36:32,440 >> Тепер, це свого роду фантазії тому що ми можемо використовувати W, A, S, 616 00:36:32,440 --> 00:36:35,480 D тут, або клавіш зі стрілками фактичні. 617 00:36:35,480 --> 00:36:38,590 Ми побачимо, що всього за секунду. 618 00:36:38,590 --> 00:36:41,140 Отже, ми збираємося, щоб обробити подія, як і раніше. 619 00:36:41,140 --> 00:36:42,530 Тягнемо подія. 620 00:36:42,530 --> 00:36:45,840 Але тепер ми збираємося перейти від типу події. 621 00:36:45,840 --> 00:36:47,710 Якщо це SDL_Quit, ми збирається встановити поруч 622 00:36:47,710 --> 00:36:49,990 прохання одного, як раніше. 623 00:36:49,990 --> 00:36:52,315 Це обробляє х в кут вікна, 624 00:36:52,315 --> 00:36:55,050 так що наше вікно дійсно закривається. 625 00:36:55,050 --> 00:37:00,110 >> В іншому випадку, якщо ми отримаємо SDL клавішу натиснутою подія, яка означає, що ми натиснули на клавішу, 626 00:37:00,110 --> 00:37:04,470 те, що ми збираємося зробити, це ми збирається перейти на цю річ тут, 627 00:37:04,470 --> 00:37:11,370 який означає: так event.key означає ставитися наш союз подій, 628 00:37:11,370 --> 00:37:15,490 піти і отримати ключ Структура подія в ньому. 629 00:37:15,490 --> 00:37:18,810 Так що виходить, що це Союз є ключовою структурою подія. 630 00:37:18,810 --> 00:37:22,820 А потім перейти до ключа Структура заходу його поле 631 00:37:22,820 --> 00:37:26,140 називається символ клавіші, а потім скан. 632 00:37:26,140 --> 00:37:29,480 І знову, виразно читав документація про це. 633 00:37:29,480 --> 00:37:31,220 Ключове слово входи досить цікаво. 634 00:37:31,220 --> 00:37:34,020 Ви можете отримати коди сканування або ключові коди. 635 00:37:34,020 --> 00:37:38,590 І це трохи тонкі, але документація досить добре. 636 00:37:38,590 --> 00:37:43,380 >> Так що, якщо ми бачимо, що код для сканування наша натисніть клавішу бути Вт або вгору, 637 00:37:43,380 --> 00:37:45,450 ми збираємося створити, рівне 1. 638 00:37:45,450 --> 00:37:47,240 І тоді ми вирватися з цієї перемикача. 639 00:37:47,240 --> 00:37:52,980 Якщо це або вліво, ми встановлюємо зліва 1, ET далі, і так далі, для вниз і вправо. 640 00:37:52,980 --> 00:37:57,080 Тепер, в цій зовнішньої перемикач, якщо ми бачимо ключ до події, 641 00:37:57,080 --> 00:38:00,730 це означає, що ми випустили ключ ні, і ми більше не натискаючи її. 642 00:38:00,730 --> 00:38:05,380 Так що я збираюся сказати, до дорівнює 0, лівий дорівнює 0, 0 вниз дорівнює, право 643 00:38:05,380 --> 00:38:08,260 дорівнює 0, і так далі. 644 00:38:08,260 --> 00:38:12,070 >> І зверніть увагу, у нас є в кожному з них два випадки виправити поруч один з одним 645 00:38:12,070 --> 00:38:14,490 без окремого коду в першому випадку, який 646 00:38:14,490 --> 00:38:18,180 означає, що будь то При S або прямо тут, 647 00:38:18,180 --> 00:38:20,520 він збирається виконати цей код. 648 00:38:20,520 --> 00:38:22,090 Так що це досить зручно. 649 00:38:22,090 --> 00:38:24,830 Це охороняє нас від необхідності робити більше умови і IFS і речі 650 00:38:24,830 --> 00:38:26,980 так. 651 00:38:26,980 --> 00:38:29,420 >> Отже, ми збираємося, щоб визначення швидкості. 652 00:38:29,420 --> 00:38:31,020 Ми встановлюємо швидкість в 0. 653 00:38:31,020 --> 00:38:33,910 Тоді при натисканні на і не працює, то ми 654 00:38:33,910 --> 00:38:37,450 встановити у швидкість для негативного швидкості. 655 00:38:37,450 --> 00:38:42,930 Запам'ятати негативним, тому що негативне напрямок у вгору. 656 00:38:42,930 --> 00:38:45,540 І позитивний у напрямок вниз. 657 00:38:45,540 --> 00:38:47,510 Якщо натиснута і не вгору, тоді ми 658 00:38:47,510 --> 00:38:53,860 збирається встановити його на позитивній швидкості, що означає йти вниз по екрану. 659 00:38:53,860 --> 00:38:55,460 Те ж саме з лівого і правого. 660 00:38:55,460 --> 00:38:58,200 >> А потім ми збираємося оновити позиції так само, як раніше. 661 00:38:58,200 --> 00:39:00,740 Ми збираємося зробити зіткнення Виявлення з оцінками, 662 00:39:00,740 --> 00:39:04,290 але ми не збираємося, щоб скинути Швидкість, оскільки швидкість всього 663 00:39:04,290 --> 00:39:06,780 управляється клавіатурою. 664 00:39:06,780 --> 00:39:11,230 Але ми збираємося скинути позиції, щоб тримати його у вікні. 665 00:39:11,230 --> 00:39:14,400 І ми збираємося, щоб встановити позиції в структури 666 00:39:14,400 --> 00:39:17,400 а потім зробити все надання речі від до. 667 00:39:17,400 --> 00:39:20,750 Отже, давайте подивимося, що він робить. 668 00:39:20,750 --> 00:39:25,460 Так що SRCS-- давайте подивимося, це hello6_keyboard.c. 669 00:39:25,460 --> 00:39:38,140 670 00:39:38,140 --> 00:39:38,820 >> О ні. 671 00:39:38,820 --> 00:39:40,150 Таким чином, ми отримали деякі попередження тут. 672 00:39:40,150 --> 00:39:43,840 І це просто говорить ми не перевірити для кожного можливого виду 673 00:39:43,840 --> 00:39:45,610 події. 674 00:39:45,610 --> 00:39:49,470 Це нормально, тому що є 236 з них, або так. 675 00:39:49,470 --> 00:39:51,760 Так що я збираюся ігнорувати ці попередження. 676 00:39:51,760 --> 00:39:53,530 Він як і раніше складений добре. 677 00:39:53,530 --> 00:39:56,100 Так що я збираюся грати в цю гру. 678 00:39:56,100 --> 00:39:57,590 Це не рухається. 679 00:39:57,590 --> 00:40:04,150 Але тепер, коли я пюре на моїй клавіатурі, Я можу зробити якийсь рух WASD тут, 680 00:40:04,150 --> 00:40:06,870 Я також використовувати мої клавіш зі стрілками. 681 00:40:06,870 --> 00:40:10,070 І зауважте, навіть якщо я натискання правої прямо зараз, 682 00:40:10,070 --> 00:40:13,804 це не виходячи з вікна, бо я скинути його на кожному кадрі. 683 00:40:13,804 --> 00:40:14,720 Так що це досить охайно. 684 00:40:14,720 --> 00:40:19,420 Ви можете собі уявити, рухаючись навколо Маріо з деякі клавіші зі стрілками або щось подібне. 685 00:40:19,420 --> 00:40:22,880 І так, Х робить роботу. 686 00:40:22,880 --> 00:40:26,900 >> Так кінцевий файл ми збираємося дивитись, hellow7_mouse. 687 00:40:26,900 --> 00:40:29,600 Це про отримання введення миші. 688 00:40:29,600 --> 00:40:34,790 Таким чином, у цьому, ми імпортувати математичну заголовок, 689 00:40:34,790 --> 00:40:38,100 тому що ми збираємося, щоб мати трохи математики тут. 690 00:40:38,100 --> 00:40:45,260 Все та ж стара, ті ж старі речі, призначення, те ж саме старе, бачив, що раніше. 691 00:40:45,260 --> 00:40:46,910 Ну, це цікаво. 692 00:40:46,910 --> 00:40:51,730 Так ми повернулися тільки перевірка для SDL кинути подія. 693 00:40:51,730 --> 00:40:52,460 Чому так? 694 00:40:52,460 --> 00:40:55,110 Таким чином, ви можете отримати введення миші з подіями. 695 00:40:55,110 --> 00:40:57,670 Наприклад, коли миша переміщується, Ви отримуєте подія для цього. 696 00:40:57,670 --> 00:41:00,520 При натисканні кнопки миші, Ви можете отримати подія для цього. 697 00:41:00,520 --> 00:41:05,760 >> Але є ще один, дещо простіше можливо, API для отримання введення миші. 698 00:41:05,760 --> 00:41:09,500 І це просто SDL стан Get миші. 699 00:41:09,500 --> 00:41:14,370 Так у мене є Int для х і у для позиції курсора. 700 00:41:14,370 --> 00:41:18,910 Я передати його SDL_GetMouseState, яка встановлює їх. 701 00:41:18,910 --> 00:41:22,200 І це положення в систему координат вікна. 702 00:41:22,200 --> 00:41:25,520 Таким чином, якщо маса в лівому верхньому кутку вікна, що б 0, 0. 703 00:41:25,520 --> 00:41:28,040 704 00:41:28,040 --> 00:41:33,380 >> Тепер, що я збираюся зробити, це я збираюся щоб зробити трохи векторної математики. 705 00:41:33,380 --> 00:41:36,910 Б'юся об заклад, ви думали, що не буде Видно, що в CS50, але тут це. 706 00:41:36,910 --> 00:41:40,720 Я збираюся зробити деякі вектор математика, щоб отримати вектор 707 00:41:40,720 --> 00:41:43,840 від зображення на курсор. 708 00:41:43,840 --> 00:41:53,280 І так чому я повинен це віднімання тут? 709 00:41:53,280 --> 00:42:01,350 Ну, якщо я просто використав Dest .-- так Мені потрібно, щоб перевести миші х 710 00:42:01,350 --> 00:42:05,166 і у на половину ширини і висота зображення, 711 00:42:05,166 --> 00:42:08,040 тому що я хочу центрі зображення, яке буде йти до миші, 712 00:42:08,040 --> 00:42:10,160 не походження образу. 713 00:42:10,160 --> 00:42:15,650 >> Так що це просто, щоб переконатися, що я говорю про центр картинки тут. 714 00:42:15,650 --> 00:42:19,510 Тоді ми отримаємо трикутник х і у, що різниця від мети 715 00:42:19,510 --> 00:42:23,430 з фактичним становищем зображення. 716 00:42:23,430 --> 00:42:25,690 І тоді ми можемо отримати відстань тут, що 717 00:42:25,690 --> 00:42:29,140 буде Піфагора Теорема, корінь квадратний з х 718 00:42:29,140 --> 00:42:32,720 раз х плюс у раз у. 719 00:42:32,720 --> 00:42:38,400 >> Тепер, щоб запобігти тремтіння, і я можу показати Ви що це робить, якщо я не роблю цього, 720 00:42:38,400 --> 00:42:45,830 якщо відстань між курсором і центр зображення менше, ніж п'ять, 721 00:42:45,830 --> 00:42:48,730 Я просто не збираюся, щоб перемістити зображення. 722 00:42:48,730 --> 00:42:52,900 В іншому випадку, ми встановлюємо швидкість. 723 00:42:52,900 --> 00:42:55,960 І ми встановіть його так, що швидкість завжди буде постійною. 724 00:42:55,960 --> 00:42:58,770 І кінцевий результат всього це математика, що зображення 725 00:42:58,770 --> 00:43:01,660 буде рухатися в напрямку курсору. 726 00:43:01,660 --> 00:43:08,470 >> Тепер, виходить, що SDL_GetMouseState, 727 00:43:08,470 --> 00:43:14,490 на додаток до встановивши х і у аргументи тут, 728 00:43:14,490 --> 00:43:21,340 він також повертає Int, що відповідає в змозі кнопок миші. 729 00:43:21,340 --> 00:43:24,600 Таким чином, ми не читаємо, що безпосередньо, але ми можемо 730 00:43:24,600 --> 00:43:29,090 використовувати ці макроси, один побітовое оператор, не страшно, 731 00:43:29,090 --> 00:43:30,650 тільки побітовое і. 732 00:43:30,650 --> 00:43:38,320 Тому ми говоримо, кнопки, яка є результатом нашої SDL_GetMouseState, якщо 733 00:43:38,320 --> 00:43:43,990 і побітовое і цей макрос тут, SDL_BUTTON_LEFT. 734 00:43:43,990 --> 00:43:47,680 >> Так що це буде просто вирішити в растровому зображенні, що відповідає 735 00:43:47,680 --> 00:43:51,090 в лівою кнопкою миші натиснута. 736 00:43:51,090 --> 00:43:55,470 І тому, якщо побітовое і відбувається, і це 737 00:43:55,470 --> 00:43:59,340 не дорівнює нулю, що означає, залишили була натиснута кнопка, 738 00:43:59,340 --> 00:44:04,320 то ми насправді відбувається, щоб звести нанівець і х і у швидкості, 739 00:44:04,320 --> 00:44:06,700 який буде просто зробити зображення втечу. 740 00:44:06,700 --> 00:44:07,980 Оновлення позиції. 741 00:44:07,980 --> 00:44:10,920 Зіткнення виявлень, бачив його всі колись, рендеринга, все в порядку. 742 00:44:10,920 --> 00:44:11,510 Давайте зробимо це. 743 00:44:11,510 --> 00:44:14,200 744 00:44:14,200 --> 00:44:16,050 Таким чином, ви отримали зробити SRCS = hello7_mouse.c. 745 00:44:16,050 --> 00:44:21,720 746 00:44:21,720 --> 00:44:22,220 Відмінно. 747 00:44:22,220 --> 00:44:23,490 Немає помилок. 748 00:44:23,490 --> 00:44:24,900 І гра. 749 00:44:24,900 --> 00:44:26,440 >> Так от у мене є миша. 750 00:44:26,440 --> 00:44:29,000 І образ дійсно чеканка миша. 751 00:44:29,000 --> 00:44:33,140 Тепер, у грі ви робите, може бути, це як ворожого чеканка 752 00:44:33,140 --> 00:44:35,240 ваш маленький символ або що завгодно. 753 00:44:35,240 --> 00:44:37,440 Але тут у нас є чеканка зображення мишею. 754 00:44:37,440 --> 00:44:41,000 І коли я натисніть, миша починається карбування зображення 755 00:44:41,000 --> 00:44:42,860 і зображення тікаючи від миші. 756 00:44:42,860 --> 00:44:43,810 Так що це досить прохолодно. 757 00:44:43,810 --> 00:44:47,770 І зауважте знову, є ще виявлення зіткнення тут. 758 00:44:47,770 --> 00:44:53,930 >> Так що це фінал трохи демо я створив тут. 759 00:44:53,930 --> 00:44:58,870 І давайте поглянемо на ще одну річ. 760 00:44:58,870 --> 00:45:02,970 Отже, повернемося сюди, я згадав цей тремтіння. 761 00:45:02,970 --> 00:45:05,000 Добре. 762 00:45:05,000 --> 00:45:12,890 Так що, якщо відстань менше, ніж п'ять пікселів, Я сидів х і у швидкість до нуля. 763 00:45:12,890 --> 00:45:15,960 Що станеться, якщо ми позбутися цього? 764 00:45:15,960 --> 00:45:19,070 Так що я збираюся зробити це просто. 765 00:45:19,070 --> 00:45:23,820 766 00:45:23,820 --> 00:45:30,150 Будь ласка, вибачте цю страхітливу стиль, але ми закоментувавши правильний код. 767 00:45:30,150 --> 00:45:38,080 Так що я збираюся врятувати і зробити Та ж команда з перш ніж зробити це. 768 00:45:38,080 --> 00:45:38,785 >> Добре. 769 00:45:38,785 --> 00:45:39,660 А тепер що відбувається? 770 00:45:39,660 --> 00:45:43,260 771 00:45:43,260 --> 00:45:43,760 Добре. 772 00:45:43,760 --> 00:45:45,801 Ми як і раніше слідуючи миші, як і раніше, 773 00:45:45,801 --> 00:45:49,310 але коли ми добираємося до миші, ми отримали це грубе тремтіння. 774 00:45:49,310 --> 00:45:50,320 Що там відбувається? 775 00:45:50,320 --> 00:45:52,600 Ну, в нашому векторі математика, пам'ятаю, ми були 776 00:45:52,600 --> 00:45:57,540 приймаючи відстань між курсор і центр зображення? 777 00:45:57,540 --> 00:46:00,710 Ну, як те, що підходить 0, ми починаємо отримувати 778 00:46:00,710 --> 00:46:06,280 як такого роду поведінка божевільного де зображення є свого роду 779 00:46:06,280 --> 00:46:08,910 як коливається навколо курсора. 780 00:46:08,910 --> 00:46:12,000 І це створює цей тремтіння. 781 00:46:12,000 --> 00:46:13,020 І це дійсно негарно. 782 00:46:13,020 --> 00:46:15,103 І ви, ймовірно, не хочете, щоб ваші ігри робить, що 783 00:46:15,103 --> 00:46:17,350 якщо це не якийсь особливий ефект. 784 00:46:17,350 --> 00:46:21,960 >> Так ось чому у нас є тільки в цьому довільне 785 00:46:21,960 --> 00:46:27,150 відрізати п'яти пікселів, де ми говоримо, якщо це протягом п'яти пікселів, ми добре. 786 00:46:27,150 --> 00:46:29,560 Нам не потрібно, щоб перемістити зображення більше. 787 00:46:29,560 --> 00:46:32,260 Так ось те, що там відбувається. 788 00:46:32,260 --> 00:46:37,390 789 00:46:37,390 --> 00:46:40,870 >> Так що це досить багато його. 790 00:46:40,870 --> 00:46:44,390 Тепер ви знаєте, як створити вікно, завантажити зображення, 791 00:46:44,390 --> 00:46:49,330 намалювати зображення у вікні, отримати введення з клавіатури, миші отримати введення, 792 00:46:49,330 --> 00:46:52,190 є купа інших вхід, що ви не 793 00:46:52,190 --> 00:46:56,070 знаєте, як отримати, якщо ви просто провести Кілька хвилин, дивлячись на документації. 794 00:46:56,070 --> 00:46:59,670 Таким чином, ви насправді мають досить кілька інструментів у вашому розпорядженні тепер 795 00:46:59,670 --> 00:47:01,650 написати повноцінну гру. 796 00:47:01,650 --> 00:47:05,030 >> Тепер, кожна гра необхідний аудіо, але звук документація 797 00:47:05,030 --> 00:47:06,460 також досить добре. 798 00:47:06,460 --> 00:47:09,200 І я готовий посперечатися, що якщо Ви розумієте, всі речі, 799 00:47:09,200 --> 00:47:14,560 ми говорили про сьогодні з зображення і поверхні, 800 00:47:14,560 --> 00:47:18,370 вікна, і все те, з'ясувати аудіо API НЕ 801 00:47:18,370 --> 00:47:21,170 буде, що погано. 802 00:47:21,170 --> 00:47:27,420 Так що я з нетерпінням чекаю зустрічі що ви створюєте з SDL. 803 00:47:27,420 --> 00:47:31,595