THOMAS жив: Во ред. Здраво на сите. Јас сум Томас Жив. Овој семинар ќе биде пишување 2D игри во C користење SDL. Па знам дека вие ќе бидете сите прашува, да, јас навистина сакаат да играат игри и да се направи игри, но она што е ова SDL бизнис? Па SDL е библиотека C. Таа се залага за едноставниот DirectMedia слој. И тоа е крстот платформа, игра библиотека развој. Таа работи на Windows, Mac, Линукс, па дури и IOS и Андроид. Таа се справува со вакви работи пристап до системи за аудио за компјутер, тастатура, и глувчето, џојстици, ако тие се во прилог. На мобилен, дури може и да го стори допир Влезен и сето тоа. И, се разбира, таа се справува со графика, цртање работите на екранот. Така што е многу широко се користи, иако што не може да се чуе на тоа порано. Тоа е вградено во, на пример, Извор моторот вентил е, кој моќта игри како што се Портал и Тим тврдина 2. Тоа е, исто така, во многу голем број на инди игри кои доаѓаат надвор, па јас сум возбуден за да види она што го сите ќе се прави со него. Целите на семинарот се за да добиеш е утврдено да се развива со SDL. Ние ќе треба да научат како да се создаде прозорец игра. Ние ќе треба да се создаде sprites, кои се на сликите во вашата игра кои можат да се движат наоколу. Ние ќе треба да научат како и да се анимираат sprites, па да ги движите наоколу, направи им се менуваат со текот на времето. И ние ќе треба да научат како за снимање на тастатура и глувче влез од компјутер. Она што ние нема да се зборува за денес е 3D графика, бидејќи тоа е многу комплицирана предмет што немаме време за. Ние нема да ги учат како да се Репродукција на аудио на нашите игри. И ние не ќе биде градење за ништо освен Линукс. Сега постојат предупредувања дека, се надевам дека до крајот на семинарот, ќе ви биде удобно со документацијата SDL, па ќе бидат во можност да одат дознаам како да се игра на аудио за себе. Исто така, градење за Mac или PC, треба да работат иста како градење за Linux, но поставувањето ќе да биде малку поинаква. Па затоа треба да биде во можност да дознаам како да се направи овие работи до крајот на денешниот семинар. Така и за се постави, ние ќе да се користи виртуелна машина. Ние ќе го користи на CS50 ИРО, бидејќи ние сме само ќе треба да се пишува во В. Но, бидејќи на ИРО не е интернет пребарувач, ние не можат да се создадат нови прозорци или приказ графика во неа. Па ние треба на виртуелната машина. За да можете да ги следите инструкциите тука во manual.CS50.net/appliance/15 да го инсталирате официјална CS50 апаратот, која е само Линукс виртуелна машина. А потоа еднаш имате дека сите во собата up-- тоа може да потрае малку повеќе време, бидејќи многу голем download-- си оди да се кандидира во В.М. sudo apt-get ажурирање. И тоа е навистина се случува за да обновите сите софтвер пакети на вашата виртуелна машина. После тоа, ви се случува да се кандидира sudo apt-get инсталирате, libsdl2-2.0-0, libsdl2-dbg, libsdl2-dev, и дополнително libsdl2-слика-2,0-0, libsdl2-слика-dbg, и libsdl2-слика-dev. Значи она што не? Кој само го инсталира за дебагирање информации, документација, хедери, и бинарни датотеки за две библиотеки. Редовните стари, SDL 2.0, и друга библиотека наречен SDL слика, која ние сме ќе биде со користење на да се вчита на датотеки со слики во нашата игра. Значи откако ќе го имаат тоа, исто така, дека, токму кога се прашува: само го пишувате да, притиснете Enter се инсталираат тие пакети, и тогаш треба да бидете добро да отидевме. Па да се добие правила за дистрибуција, може can-- о драга, тоа не е ажуриран. Освен ако имате GitHub account-- ако имаш сметка GitHub, можете да го направите тоа на Git клон команда на репо и дека ќе го преземе целиот Git репо со сите го кодот во неа, така што ќе имаат код. Ако не го имаат GitHub сметка, што треба да направите е тип wgithttps: //github.com/tlively/sdl seminar-- и тука тоа е different-- /archive/master.zip. Значи, повторно, дека е иста URL-то, освен тоа се случува да биде tlively / SDL_seminar / master.zip и што го користите за да ја преземете wgit тоа. И тогаш ќе може само отпакувате таа архива и тогаш ќе имаме целиот изворен код. Толку жал за тоа. А потоа го кодот исто така, ќе биде домаќин на веб-страница на семинарот CS50 во неколку дена. Во ред. Па, како да започнете испишува нашата сопствена игра? Па, првото нешто ние се случува да сакаат да се направи е да се погледне на SDL документација. Значи тука е В.М.. И тука е веб-страница. Сум се отвори за да живеат libsdl.org. Она што јас ќе одам да направите тука е да се премине на страничната лента, според документацијата, и кликнете на вики. Ова ќе ме донесе на вики дека има најголем дел од документацијата за SDL. Во текот на страничната лента тука, ние сме ќе кликнете на API по категорија, затоа што се случува да се даде ни убав категорични поглед на целата API за SDL. Така на пример, имаме основните иницијализација и затвори, сите вид на административни работи за користење на SDL, а потоа имаме делот за прикажување на работите на екранот. Тоа е видео. Влезни настани, и тоа е добивање на влез од тастатура, добивање на информации од глувчето, и на џојстик, ако го имаат дури. Има сила повратни информации за работите како игра контролори, кои ние нема да се зборува. И тука е аудио. А тука е и еден куп други SDL работи кои може да направи за вас. Но, денес ние ќе треба да се фокусираат за иницијализација тука, прикажување на слики во видео дел, и ракувањето со влезни настани. Значи овие се главните делови од документацијата дека треба да се грижиш. Само за забава, и ако одиме во текот тука и кликнете на API, со име, може да се види листа на секој единствена работа во SDL библиотека. Така што сите овие функции, enumerations, структури, лудо износ на работи, азбучен ред. И јасно, до знаеш што правиш, ова не се случува да се биде премногу корисен, кој е зошто тоа го правиме на API по категорија. Па ајде да започнете. Се надевам дека веќе сте симнати правила за дистрибуција. И така што можете да направите е, нели тука во CS50 апаратот, едноставно отвори терминал. Еве ќе одиме. Па јас сум веќе преземале дистрибуција кодот користејќи .zip метод. И јас сум го отпакува. Па тука е во SDL господар семинарот. Па јас ќе одам да одам во таа листа. И она што го гледаме овде е дека имаме седум Ц датотеки. И ова се случува да го кодот ние ќе треба да се бара во денес. Имаме makefile. И ние имаме директориум ресурси, кој едноставно има слика дека ќе се видат наскоро доволно. Значи, да се отвори овие датотеки користење на уредувачот на Г-Уреди. Па сакам да ги отворите сите датотеки што започне со здраво и да заврши со .C. Еве ќе одиме. Значи тоа е мал прозорец, па ние сме ќе се обидат да се направи што поголема. Не, тоа си отиде. Во ред. Па, еве го првиот датотека ние ќе треба да се погледне. Таа се вика hello1_sdl.c. И сето тоа го прави е да се иницијализира на SDL библиотека, така што ние може да почнат да го користат. Како ќе знаете што доаѓаат со овој код себе? Па, ако се погледне во текот на на документација и ние одиме во иницијализација и затвори дел, тоа се случува да ни речат за тоа како да се иницијализира SDL. Значи дефинитивно се прочита сето тоа друг пат. Тоа се случува да ви кажам на сите за она што се случува тука. Но, главната сржта на проблемот е во тоа што ние треба да се јавите на оваа функција SDL во него и да го споделуваат она што видови на нештата ние сакаме на библиотеката да се иницијализира. Значи, во нашиот случај, ние сме само ќе да се иницијализира на видео за сега, за да можеме да започнете прикажување на слики. Тука, можете да видите ако ние кликнете на SDL во него, ние може да се добие дури и повеќе информации, вклучувајќи вратената вредност. Така можеме да видиме тука дека тоа returnes нула на успех. Така што во нашиот код, ние ќе треба да види дали тоа не го врати нула, а ако тоа не го врати нула, така што не беше успешен, тогаш ние ќе треба да едноставно печатење грешка користење и друга функција, SDL добиете грешка, која враќа стринг опишување на грешка која се случи. Ние ќе треба да се печати дека грешка, а потоа ние сме само ќе излезете од програмата со грешка во кодот. Потоа уште една работа што ни треба да направите е, пред програма излегува, ако ние успешно се иницијализира 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 прозорец struct, која ќе бидат креирани од овој повик на функцијата, SDL создаде прозорец. Сега, ова е потребно многу аргументи, па ајде да одиме да се погледне на документација. Значи, повторно, јас ќе одам да API-то по категорија, јас сум Одејќи кон видеото тука, како и првата секција, прикажување на прозорецот за управување. Па овој член има еден тон работи во него, но ако се погледне преку овие функции, ќе види дека веројатно оној ние сакам се нарекува SDL создаде прозорец, која се случува да бидат во право на врвот. И така ова е документација за оваа функција. На прозорецот ќе има наслов, на x и y позиција на екранот, тоа се случува да имаат ширина, висина, а потоа тоа се случува да се земе некои знамиња. Сега, ние всушност не се грижат за било кој од овие знамиња, токму сега, но ако сака да направи нешто како да се направи со полно прозорец на екранот, можете да ги разгледаме во тоа. За сега, ние сме само ќе да ги користат овие посебни вредности, SDL прозорец плус центриран за x и y, со цел само да се создаде прозорец во центарот на вашиот екран. Значи тоа е она што го прави. И ако се случи да биде прозорец нула, што значи дека има грешка, потоа повторно ние сме само ќе печати на грешка при користење SDL грешка добие. А потоа, бидејќи ние се иницијализира SDL, ние сега треба да го затворите. Па ние го нарекуваме SDL престанам пред враќајќи се еден за главните. Така што мораме да го прозорецот отворен надевам. И она што се случува да направите е да одиме за да го повикате SDL за 5000 милисекунди, која е иста како и пет секунди. И кога ќе завршиш со тоа, тоа се случува да се уништи прозорец, исчисти на библиотеката SDL, и за излез од програмата. Значи, да се оди напред и да се откаже од тоа да се сними. Па сега, наместо на промена на makefile во секое време, Јас едноставно не може да се направи, и тогаш на командната линија, велат извори еднакви и потоа датотеката сме составувањето. Така, тоа е hello2_window.c. Фантастично. Не erros. Сега, ако се кандидира нашата извршна, гледаме овој прозорец. Сега постојат неколку проблеми со прозорци. Можеме да ја движите наоколу, но тоа има оваа позадина ѓубре во него. Значи ние не сме подготвени ништо, и така тоа е само полн со ѓубре, што е доста тоа што го очекуваме. Покрај тоа, ние не можеме да го затворите прозорецот. Јас сум притискање на ова X во агол и ништо не се случува. Па ќе видиме како да се поправи дека во малку. Значи, да се поправи на делот каде прозорецот е полна со ѓубре во прв план. Значи, ако ние одиме во текот на hello3_image.c, она што може да се види е дека додадовме неколку повеќе работи тука. Додадовме оваа нова глава на датотеката за да добијат функции на тајмерот. Претпоставувам дека тоа го направивме во последните една, исто така, и јас не се споменува. Но, сега, бидејќи ние сме работа со слики, ние треба да се вклучи SDL слика аватар фајлови, како и. Па тоа е исто што и пред, иницијализацијата SDL тука, Истото се занимаваат со креирање на прозорци. Видовме дека пред сега. Сега ние треба да се создаде нешто што се нарекува на изведувач, кој вид на оди заедно со прозорецот. Но, тоа е еден вид на апстрактен објект кој е задолжен за правење на сите овие цртање операции на прозорецот. И тоа, всушност, соодветствува на програма натоварен во графика хардвер во вашата компјутер или вашиот телефон или whatever. Па на знамиња што сакаме да помине it-- и можете да погледнете во документацијата за да добиете повеќе детали here-- се случува што треба да се направат SDL забрзана, што значи тоа се случува да биде со користење на хардвер за графика и не само имитирани во софтверот. И ние ќе треба да се користи SDL Renderer PRESENTVSYNC. VSYNC е нешто што едноставно го прави вашата графичка изгледаат подобро и го спречува тоа нешто наречено екран терор, каде што половина на една рамка и половина на следната рамка се подготвени во исто време и тоа изгледа страшно. Но, повторно, можете да одат прочитате во врска со тоа на своја. Па ние имаме некои знамиња тука. И така ние сме само ќе да се јавите оваа функција SDL создаде изведувач. Ние ќе треба да го даде на прозорецот да се дружат со кој изведувач. Негативен значи дека ние не она што се грижат графички драјвер ние ќе треба да се користи. Така што треба доста секогаш да биде негативен, освен ако знаете за графика драјвери. А потоа ние сме само ќе за да го пренесеме нашето знаме. Значи, ако тоа враќа NULL, тогаш ние сме печатењето на грешка, како и обично, но тогаш ние сме, исто така, се случува да се уништи прозорец да се исчисти пред тие ресурси повикувајќи SDL престанам и да се вратат. Во овој момент, интересен дел овде е местото каде што се вчита нашата слика користење на оваа функција IMG_load. Ова е единствената функција ние си оди да го користите од SDL сликата библиотека. Тоа е само еден што ни треба. Тоа е што се јавува во низа тоа е патот на било која слика ресурс. И тоа може да биде .png, на GIF, bitmap, ниту една од овие работи. А тоа е зошто оваа функција е толку убаво. Тоа може да се справи доста било кој формат. Го товари во меморијата и продавници како нешто што се нарекува еден SDL површина. Сега е SDL површината е само struct кој претставува слика на податоци во меморијата. За да можете да прочитате повеќе за дека во документацијата две. И ако ова грешки, тогаш ние сме случува да се направи целата работа каде ние печати грешка, ги затвориме нашите ресурси, а потоа се повлече од програмата. Сега интересна работа е, пред ние може да нацрта оваа слика до прозорецот, ние треба да се, всушност, го текстура направи. Сега текстура одговара на сликата податоци натоварен во меморијата на хардвер е графичката е. Па површина е во главната меморија, редовни меморија дека ние сме биле со користење на сите семестар, и текстура е во овој посебен VRAM меморија дека контролите на графички картички. Па ние го нарекуваме оваа функција SDL_CreateTextureFromSurface. Ние го даде нашиот изведувач и нашите површина. А потоа ние сме всушност направено со помош на површината, па ние сме само ќе ја бесплатно. Ние не им е потребно повеќе. И тогаш па ако овој повик errored и се врати нула, тогаш ние ќе треба да се направи целата известување нешто повторно грешка. Во ред. Еве, ќе се добие во некои вистинските функции рендерирање. Па повикувајќи SDL_RenderClear и донесување на изведувач поврзани со нашиот прозорец едноставно го прозорецот одат црна. Па тоа ги отстранува тоа ѓубре што сме го виделе нашите прозорецот пред да и го прави црно. И тогаш ние ќе за да го повикате SDL_RenderCopy, го даде нашиот Renderer, нашите текстура. И ние ќе се зборува за она што овие области се во малку. Но, што се случува да земе податоци текстурата и ископирајте излез нашите прозорец за да се подготви сликата. Значи по ова сме го правеле копија на податоци врз нашиот прозорец, ние треба да направите оваа дополнителна функција наречен SDL_RenderPresent. И ова е интересно затоа што тоа добива во темата наречена двојно визуелниот. Па двојно визуелниот е техника со која го прави вашиот графики изгледа многу подобро. Повторно, го спречува тој екран кинење Зборував претходно, каде имате два амортизери. Има еден назад во тампон меморија и пред пуфер. Предната тампон е буквално она што е на вашиот екран во моментот. Па правиме сите овие привлече варијации, како SDL направат копија или SDL_RenderClear на задната тампон. Па тие менувате работите во задниот тампон. Тука би можеле да бидеме цртање ова зелен квадрат до задниот тампон. Па потоа кога ќе завршиш прави нашите прават операции, кои може да потрае навистина долго време, она што ние ќе треба да се направи се префрлиш на амортизери. Така што буквално само зема пред тампон и назад тампон и да им се префрлува, па дека, моментално, во една операција, наместо можеби стотици или илјадници, сите на нашето ново изречена објекти се на екранот. И овој го спречува работи како освежување на екранот кога ние сме подготвени само половина на нашите објекти за рамката. Па тоа е причината зошто ние треба да се јавите SDL_RenderPresent, како и како SDL_RenderCopy. Повторно, ние сме само ќе да се чека за пет секунди. Тогаш ние ќе треба да исчисти нашите ресурси. Имаме сосема малку повеќе тоа време. А потоа ние сме само ќе за излез од програмата. Па ајде да го направите тоа. Одам да напишеш шминка, а потоа и извори еднаква hello-- сега 3image.c е оваа. Сите во право, дека составил нема грешки. И можете да видите тука сум сега извлечен мојот имиџ, Здраво, CS50! за нашите прозорец, кој исчезнува по пет секунди. Сега, ова се уште има проблеми, нели? Ова не е добра апликација, затоа што кога ќе се обидат да го затворите прозорецот, ништо не се случува. Дека x се уште не е одговорен. Па ајде да ги разгледаме во Следниот датотека, hello4animation. Значи ова е датотека што се случува да се воведе движење и движењето на нашиот имиџ. Па ние ќе треба да се направи на истото како и досега, иницира SDL, да креираат, прозорец, создаде Renderer, вчита сликата во меморија, се создаде текстура. Што сум го видел сето тоа порано. Сега, ова не е ново. Ние ќе треба да имаат структура наречена една SDL rect, што е само правоаголник. Ако одиме во текот тука, можеме да направите пребарување за SDL rect, и можете да видите дека тоа е многу едноставна структура. Таа има X, Y за позицијата, и тоа има ширина и висина за големината на правоаголникот. Значи она што ние ќе треба да направите е да сме ќе се дефинира овој SDL rect дест, за дестинација. И ова е местото на екранот каде ние ќе треба да се цртање нашиот имиџ, право, па ако ние се случува да се биде поместување на сликата наоколу, тогаш дестинација каде ние ќе треба да се подготви сликата треба да се движат наоколу. Па ние ќе треба да се јавите на оваа SDL_QueryTexture функција. И ќе забележите дека јас сум поминува адреса на dest.w, што е ширина, и dest.h, кој е на висина. И така ќе SDL_QueryTexture за чување во тие области ширината а висината на нашите текстура. А потоа она што јас ќе одам да направите е, ќе одам да се постави dest.x да биде прозорец ширина минус dest.w, што е ширината на фигура, поделено со 2. И ова се случува да го постави така дека сликата е совршено центриран во нашиот прозорец, во ред? Па сега имам позиција y. И ова се случува да да биде променлива која е се менува, затоа што ние ќе треба да биде поместување на сликата во правец на y. И сега имаме нешто наречен анимација јамка. Па како не анимација работа? Па, човечкото око може да се открие 12 различни слики во секунда, во ред? Значи, ако ви флеш 12 слика картички во мене во вториот, видов на секоја од овие слики како свои различни индивидуални сликата. Сега, ако сте трепкаат слики во мене во една секунда, тогаш моето око ќе почне да ги замаглат заедно и јас би го доживуваат како движење, наместо на еден посебен имиџ. Така, на пример, филмови и телевизиски, тие флеш слики на тебе 24 пати една секунда. Па тоа е од 24 фрејмови во секунда. Компјутерски екрани, од друга страна, често се на 60 фрејмови во секунда. Тоа е нивната брзина на освежување. Тоа е колку често тие се освежи на сликата на екранот. Така и нашата цел ќе биде 60 слики во секунда за нашите игри. Ќе видиме дека во кодот. Па за секоја рамка, ние сме првата случува да го исчистите прозорецот. Ова е општа шема. Можете секогаш да се расчисти прозорец на секоја рамка, а потоа направите сите од вашиот цртеж промет, а потоа на крајот, се RenderPresent да се покаже се што е во рамка. А потоа ви се случува да имаат се чека на крајот да почека до следниот треба да започне рамка. Значи, ако јас го правев многу комплексна пресметка тука кој траеше повеќе од 16 милисекунди, тоа ќе биде невозможно за мене да се добие таа рамка стапка од 60, кој Сакав, бидејќи секоја рамка е земајќи премногу долго за да се пресмета. Покрај тоа, ние сме навистина се прави вид на незначителна сума на работа тука, затоа што има само едно нешто сме цртање. Па јас само се чека 1/60 од второ, што е должина на рамка помеѓу рамки. Па јас сум вид на преправајќи се прави сите мојата работа ги зема нула време. Но во вистинска игра, ќе треба да се одземат износот на времето потребно да се направи сето ова работа од вашето време за одмор. Значи во секој случај, она што сум всушност прави во овој циклус? Јас го исчистите прозорецот. Јас во собата на dest.y, која е int да Крај на мојата позиција y фрлен во int. Сега, сакам да плови резолуција за моите у позиција во мојата игра, но потоа да се, всушност, го привлече кон екранот тоа треба ints, затоа што тоа е во единиците на пиксели, па тоа е она за кастингот е за. Одам да се подготви сликата. Значи ова е правоаголник изворот. И ова е правоаголник дестинацијата. Па јас помина за ништовни правоаголник изворот да се каже сакам да привлече целиот мој текстура. Но, ако сте имале многу текстури во вашата игра и сите тие се во една голема текстура на сајтот кој бил натоварен во SDL како само еден текстура, може да ги користите правоаголник извор да се избере еден од помалите текстури, една од помалите sprites, надвор од тоа големо текстура на сајтот. Значи, повторно, јас ќе поминува ми ја даде, мојата текстура, а сега на дестинација. Ова се случува да биде каде што во прозорец тоа се случува да се извлечат. А потоа, бидејќи јас сум за анимирање нешто, ми треба движење, Одам да се ажурира самовила позиција на секоја рамка. Па имам оваа постојана наречен скролување забрза во единиците на пиксели во секунда. Сега, секој пат кога ние се направи некое движење, рамката е само 1/60 од секунда. Па јас ќе одам да се подели дека до 60. И тогаш, ајде да видиме, јас сум одземање дека од y позиција. Зошто сум одземање? Ние ќе дојдеме до тоа во една секунда. Па тогаш исчисти мојата ресурси а на програмата е готово. Значи, да се направи тоа. Па ајде да одиме во шминка SRCS = hello4 animation.c, во ред? Игра. Ете ти. Па морам тоа да одите горе на прозорец, кој е прилично уредни. Но се одржи на, јас бев одземање од позиција у секое време. Што се случува таму? Па, излегува дека во SDL, и всушност, во повеќето компјутерска графика, потеклото на координатен систем е горниот лев агол на прозорецот. Така насока на позитивните х оди низ вашиот прозорец кон десно. И позитивните y насока всушност, оди надолу. Значи, повторно, за потеклото на горниот лев агол на вашиот прозорец, позитивните y насока е долу, и позитивен x е десно. Па кога ќе се одземе од позиција на y, тоа е случува да се направи тоа оди на негативни y насока, што е до прозорецот. Значи тоа е она што се случува таму. Кул. Ајде да погледнеме во следната датотека. Тука е дел од покаже каде ние конечно се добие дека X во агол на прозорецот што би требало да го затворите прозорецот да работи. Значи она што се случува? Ние го иницијализирам SDL, се создаде на прозорецот, создаде Renderer, вчита сликата, создаде текстура како што не сум видел. Имаме исти правоаголник дестинација како и порано, истиот повик да се пребарува текстура. Но, овој пат, ние сме тогаш ќе се подели на ширина а висината на нашата дестинација за 4. Ова има само ефектот на скалирање надолу кога нашата слика ние го прикаже во прозорецот со четири. Значи тоа е прилично уредни. Ние само може да се намалат само како тоа. Ние ќе треба да почнат на самовила во центарот на екранот. И сега имаме x и y брзина и Тие се двете случува да се почне од нула. Ова е погрешен фајл. Жал ми е. Значи, тоа е точно. Тоа е се уште во оваа датотека. Имаме подели со 4 и сè. Значи тука имаме x и y позиција за центарот на прозорецот. И ние го даде почетен брзина на оваа постојана брзина, која Верувам дека е 300 пиксели во секунда. Сега, имаме оваа int можеше само како добро да биде децимален наречен блиску баравте. И наместо за правење на бесконечна јамка на мерач на време тука, ние ќе треба да се раздвижи како додека во близина не се бара. Така како ние да се процесира настани? Па, SDL редици на настаните во еден буквална редот зад сцената. А потоа секоја рамка, можеме да dequeue настани од таа задача користење овој повик SDL_PullEvent. И повторно, дефинитивно одат прочитате за ова во документацијата. Има многу повеќе детали и многу повеќе функции може да се користи со овој. Ние го положат адреса на оваа работа, SDL_Event дека имаме тука на магацинот. Сега, она што е SDL_event? Бидејќи SDL, ако се погледне во на documentation-- ајде види, API по категорија, влез настани, настан ракување, ние може да се погледне бројот на различни настани тука и може да се види, има целина тон од нив. Значи, што е тоа нешто SDL_Event? SDL_Event е унија. Леле, што е синдикат? Сте веројатно никогаш слушнале за тоа порано. И тоа е во ред. Сојуз е вид на како на struct, освен struct има простор за сите своите полиња и меморијата, со оглед на Унијата има само доволно простор за да ги собере на најголемиот еден од нејзините полиња, што тоа значи може само да ја запази еден од нејзините полиња во еден момент, кој вид на има смисла за настани, нели? Ние може да има тастатура настан или настан прозорецот, но еден настан не може да биде и тастатура настан и настанот прозорецот, па тоа би било глупо да се има место и за и на оние во нашиот случај унија. Значи, ако си сакал да создаде свој сојуз, тоа изгледа сосема исти што се создавање на struct, освен дека ние ги користиме на клучни зборови на унијата наместо на struct клучен збор. И се сеќавам, за сите работите во вашата заедница, вистинските променлива која е единство може да има само една од тие вредности во време. Па како можеме да кажам каков вид на настан ние едноставно се појави надвор од оваа задача? Па, ние може да го тестира за event.type. И ако тоа е еднаква да SDL_Quit, знаеме тоа е случај е генерирана кога ние погоди што X во агол од прозорецот. И може да се постави во близина побара еднаков на 1. Останатото е само некои анимации дека не сум видел. Значи, да се оди напред и да се направи ова и да видиме колку добро таа работи. Па јас ќе одам да се тип прават и тогаш SRCS = hello5_events.c. Таму ќе одиме. Игри. Сега, може да се види дека тоа е навистина намалени за четири. И сега тоа е бие наоколу. Имам некои судир откривање случува со страни на прозорецот дека можеме да ги погледнеме. И што се случува кога ќе одам да го затворите? Се затвора. Фантастично. Добивме тој настан. А ние се погрижил за него. Значи, да се погледне назад на кодот. Па како не можам да ја добијам бие наоколу, како тоа? Се сеќавам јас во собата и Х и y почетокот на брзини. И брзината е позитивен постојана, па тоа е ќе се го почнувате оди надолу и на десно. Сега, секоја рамка, во прилог на ракување сите настани што се случиле, Одам да се открие дали мојата самовила се обидува да одат надвор од прозорецот. За да можеме да го направите тоа со само проверка x_pos со 0, y_pos 0, а потоа исто така x_pos и y_pos со прозорец ширина и висина прозорец. Известување Сум одзема ширината на фигура. И ова е затоа што ако јас не одземе ширината на самовила, тоа ќе се провери само дека потеклото на самовила не одат надвор од прозорецот. Но, ние сакаме целата ширина на самовила да се биде секогаш во внатрешноста на прозорецот и целата висина на самовила да се биде секогаш во внатрешноста на прозорецот. Значи тоа е она што е за одземање. Многу геометрија тука може биде корисно да се извлече на хартија со координатниот систем за да види што се случува. Значи, ако јас се судираат, јас само едноставно ресетирате позиција така што тоа не се случува надвор од екранот. А јас ќе одам да се, ако тоа одбиени на еден од страничните ѕидови, Одам да се негира x брзина, така што тоа започнува бие во друга насока. И слично на тоа, ако тоа хитови на врвот или на дното, Одам да го поставите брзината на y еднаква на негативните y брзина, така што тоа ќе се врати. Па тоа е само како направивме тоа овде. И позициите на ажурирање исто како што сум видел, подели со 60, бидејќи ние сме само ракување 1/60 од секунда. А потоа и рендерирање, иста како порано. И така тоа е сè што што се случуваше оваа датотека. Значи тоа е како тоа го правиме настани. Главната работа е да се земе тука е ова SDL_PullEvent функција. И дефинитивно треба да го прочитате документацијата повеќе за SDL_Event Унијата, бидејќи овој тип на податоци е многу, многу важно, бидејќи ние го користиме за сите видови на настани. На пример, ние го користиме за тастатура настани, што е она што оваа датотека е за. Значи она што го имаме? Имаме истото како и досега, иницијализира SDL, се создаде прозорец, создаде Renderer, вчита сликата во меморијата, се создаде текстура. Повторно, ние ќе треба да имаат оваа правоаголник дест, ние ќе треба да скала на сликата од страна на четири, таа да стане малку помали. Сега, ние ќе се обидеме да го стартувате самовила во центарот на екранот. Но овој пат, ние ќе треба да се постави на почетна x и y брзини до нула, затоа што на тастатурата е случува да ги контролираат оние. И освен тоа, ние ќе треба да ги пратите на овие променливи горе, долу, лево, и десно. И што се случува да се задржи пратите на тоа дали ние сме притиснат копчињата на тастатурата што одговараат на горе, долу, лево, и право. Сега, ова е вид на фенси затоа што може да се користи W, A, S, Д тука, или вистински копчињата со стрелки. Ќе видиме дека во само една секунда. Па ние ќе треба да се процесира случај исто како порано. Ние се повлече од настанот. Но, сега ние ќе треба да вклучете го типот на настанот. Ако тоа е SDL_Quit, ние сме случува да се постави во близина побарал на еден, како и порано. Што се справува со х во аголот на прозорецот, така што нашите прозорецот, всушност, се затвора. Во спротивно, ако добиете SDL клучните надолу Настанот, што значи дека ние Притиснавте копче, тогаш она што ние ќе треба да направите е да сме случува да го вклучите ова нешто овде, која means-- така event.key значи третираме нашите настан унија, оди и да го добиете клучот Настанот структура во неа. Значи излегува дека овој Унијата е клучен структура настан. А потоа одат на клучните структура настанот својата област наречен keysym а потоа scancode. И повторно, дефинитивно се прочита документација за ова. Влезови клучни зборови доста интересно. Може да се добијат кодови скенирање или клуч кодови. И тоа е малку суптилни, но документација е сосема добар. Значи, ако ние се види кодот за скенирање нашите клучни притиснете биде W или нагоре, ние ќе треба да се постави е еднаква на 1. А потоа ние се пробие на прекинувачот. Ако тоа е или лево, ние во собата лево кон 1, ет така натаму, и така натаму, за долу и десно. Сега, во овој надворешен прекинувач, ако видиме клучен до случај, тоа значи дека ние сме ослободени клучен и ние сме веќе не негово притискање. Па јас ќе одам да се каже до еднакво на 0, лево еднакво на 0, што е еднакво на 0, право еднакво на 0, и така натаму. И известување имаме во секоја од овие два случаи се стави веднаш до едни со други без посебен код за првиот случај, што значи дека без разлика дали е Ѕ или надолу токму тука, тоа се случува да се изврши овој код. Значи тоа е прилично корисна. Го спречува нас да мора да стори повеќе услови и што IFS и работите ете така. Па ние ќе треба да се утврди брзината. Ние во собата на брзината на 0. А потоа, ако е притиснат до а не надолу, тогаш ние поставите брзината y до негативни брзина. Се сеќавам негативен, бидејќи негативните y насока е горе. И позитивните y насока е долу. Ако се притисне надолу а не нагоре, тогаш ние сме ќе го постави на позитивни брзина, што значи дека ќе се спушти на екранот. Истото со лево и десно. И тогаш ние ќе треба да се ажурира позициите исто како порано. Ние ќе треба да се направи судир детекција со граници, но ние нема да го ресетирате брзина, затоа што брзината е само контролирана од страна на тастатурата. Но, ние ќе се обидеме да го ресетирате позиции за да се одржи во прозорецот. И ние ќе треба да се постави на позиции во struct а потоа направи сите рендерирање работи од порано. Да видиме што тоа го прави. Така бидете SRCS-- видиме, ова е hello6_keyboard.c. О не. Па добивме некои предупредувања тука. И тоа е само велиме дека ние не проверете за секој можен вид на настанот. Тоа е во ред, бидејќи има 236 од нив или така. Па јас ќе одам да ги игнорира овие предупредувања. Тоа е уште компајлирана во ред. Па јас ќе одам да се игра играта. Тоа не е да се помрдне. Но, сега, кога ќе се пасира, на мојата тастатура, Јас може да се направи некои WASD движење тука, Јас го користам мојот стрелките на тастатурата, како и. И известување, иако сум притискање на десното токму сега, тоа не се случува надвор од прозорецот, затоа што јас го ресетирате на секоја слика. Значи тоа е прилично уредни. Можете да замислите движат околу Марио со некои копчињата со стрелки или нешто слично. И да, на X функционира. Па конечниот датотека ние си оди да се погледне, hellow7_mouse. Ова е за добивање на влезните глувчето. Така што во овој еден, ние увоз на заглавјето на математика, затоа што ние ќе треба да имаат малку математика тука. Истиот, стар, истиот, стар работи, дестинација, истиот, стар, се гледа дека пред. Па, ова е интересно. Па ние сме назад кон само проверка за SDL откажат настанот. Зошто е тоа? Така можете да добиете влезни глувчето од настани. Како кога глувчето ќе се пресели, ќе го добиете еден настан за тоа. Кога ќе се притисне копче на глувчето, можете да добиете еден настан за тоа. Но, има уште еден, малку поедноставно можеби, API за добивање влезен глувчето. И тоа е едноставно SDL државата стапите глувчето. Па имам на int за x и y за позицијата на покажувачот. Јас го давате SDL_GetMouseState, кој ги поставува овие. И ова е позиција во координатен систем на прозорецот. Значи, ако на маса е во горниот лев на прозорецот, тоа би 0, 0. Сега, она што јас ќе одам да направите е, ќе одам да се направи малку на вектор математика. Се обложувам дека мислев дека нема да се види дека во CS50, но тука е. Одам да се направи некои вектор математика за да се добие вектор од сликата за да го курсорот. И така Зошто имам ова одземање тука? Па, ако јас само се користи дест .-- така Јас треба да се преведе на глувчето X и y за половина од ширината и висината на сликата, бидејќи сакам центарот на Сликата која се случува кон глувчето, не потеклото на сликата. Па тоа е само да бидете сигурни дека јас зборувам за центарот на сликата тука. Потоа да добиеме делта x и y, која е разликата од целта на вистинската позиција на сликата. И тогаш може да се добие дистанцира тука, што ќе биде Питагоровата теорема, квадратен корен од x пати х плус y y пати. Сега за да се спречи нервнича, и јас може да се покаже вас она што го прави ова, ако јас не го направите ова, ако растојанието помеѓу курсорот и центарот на сликата е помалку од пет, Јас само не одам за да се движат на сликата. Инаку, ние во собата на брзина. И ние го постави така што брзина секогаш ќе биде постојана. А вистинскиот резултат на сите оваа математика е дека на сликата се случува да се движат кон курсорот. Сега излегува дека SDL_GetMouseState, во прилог на поставување на x и y аргументи тука, Таа, исто така се враќа на int што одговара на состојбата на копчињата на глувчето. Па не можеме да се прочита дека директно, но можеме да ги користат овие макроа, еден bitwise оператор, а не дека е страшно, само bitwise и. Па велиме копчиња, што е резултат од нашите SDL_GetMouseState, ако тоа и bitwise и, ова макро тука, SDL_BUTTON_LEFT. Значи ова се случува едноставно да се реши на битмапа што одговара лево копче на глувчето да се притисне. И така, ако bitwise и се случува и тоа е не нула, што значи лево копче е притиснато, тогаш ние всушност сакаме да го негира и на x и y брзини, кои само ќе го направи бегство сликата. Информации за позицијата. Детекции судири, што се гледа тоа сите пред, рендерирање, сите во право. Ајде да се направи тоа. Па ќе морате да SRCS = hello7_mouse.c. Одлично. Нема грешки. И игра. Па еве имам глувчето. И сликата навистина си поигруваше со мојот глушец. Во овој момент, во игра се направи, можеби ова е како непријател брка Вашиот малку карактер или whatever. Но, тука имаме слика брка глушецот. И кога ќе кликнете на глувчето започнува брка сликата и сликата е бегање од глувчето. Значи тоа е прилично кул. И известувањето повторно, има уште судир откривање тука. Така што е последниот малку демо сум го постави тука. И ајде да ги разгледаме во уште една работа. Па повторно тука, јас спомнав овој треперење. Во ред. Значи, ако растојанието помало од пет точки, Бев поставување x и y брзина на нула. Што се случува кога ние се ослободи од тоа? Па јас ќе одам да се само да го направите тоа. Ве молиме изговор овие грозни стил, но ние коментира надвор точниот код. Па јас ќе одам да се спаси што и го стори истата команда од пред да го направите. Во ред. И сега што се случува? Добро. Ние сме се уште по глувчето како и порано, но кога ќе се дојде до помош на глувчето, ние го добивме ова бруто треперење. Што се случува таму? Па, во нашата вектор математика, се сеќавам бевме преземање на растојанието помеѓу курсорот и центарот на сликата? Па, како што се приближува 0, ние започне да добива како овој вид на луд однесување каде што на сликата е вид на како осцилирачки околу покажувачот. А тоа е создавање на овој треперење. И тоа е навистина грди. И веројатно нема да сакате вашиот игри го прават тоа, освен ако тоа е некој вид на посебен ефект. Па тоа е причината зошто имаме само оваа произволна отсечен од пет точки, каде што велат ако тоа е во рок од пет точки, ние сме добри. Ние не треба да се движи сликата повеќе. Значи тоа е она што се случува таму. Па тоа е доста тоа. Вие сега знаете како да се создаде прозорец, ставете некоја слика, нацрта слика до прозорецот, се тастатура за внес, се внесување на глувчето, има еден куп други внесување дека нема да знаете како да се добие ако само поминете неколку минути да гледа во документацијата. Така да всушност имаат доста неколку алатки на располагање сега да се напише полноправна игра. Сега, секој натпревар треба некои аудио, но аудио документација Исто така е прилично добар. И јас сум подготвен да се обложи дека ако да се разбере сите од работите ние разговаравме за денес со сликите, и површини, Windows, и сè, тогаш пронајдат аудио API не е нема да биде толку лош. Па јас со нетрпение очекуваме да се видиме што ќе се создаде со SDL.