Томас ОЖИВЛЕННАЯ: Ладно. Всем привет. Я Томас Лайвли. Этот семинар будет писать 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 изображения, которые мы собираемся использовать загружать файлы изображений в нашей игре. Поэтому, как только у вас есть, что также что, как раз когда он просит, Вы просто наберите да, нажмите Ввод установить эти пакеты, а затем вы должны быть хорошо идти. Таким образом, чтобы получить код распределения, вы 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.