THOMAS Lively: Allt í lagi. Halló allir. Ég er Thomas Lively. Þetta námskeið er að fara að vera skrifa 2D leiki í C með SDL. Þannig að ég veit að þú ert allt spyrja, já, ég virkilega langar að spila leiki og gera leiki, en hvað er þetta SDL fyrirtæki? Svo er SDL C bókasafn. Það stendur fyrir Simple DirectMedia Layer. Og það er yfir vettvang, leikur þróun bókasafn. Það virkar á Windows, Mac, Linux, jafnvel iOS og Android. Það sér hluti eins og aðgang að hljómflutnings-kerfi fyrir tölvuna, lyklaborðið, og mús, stýripinna, ef þeir eru í viðhengi. Á farsíma, það er jafnvel hægt að gera snerta inntak og allt það. Og auðvitað, annast það grafík, teikna hluti á skjáinn. Svo það er mjög mikið notað, jafnvel þótt þú getur ekki hafa heyrt um það áður. Það er byggt inn, til dæmis, Valve er uppspretta vél, sem knýr leiki eins Portal og Team Fortress 2. Það er einnig í mjög miklum fjölda af indie leikjum sem koma út, svo ég er spennt að sjá hvað þú allt verður að gera með það. Málþingið markmið eru að fá þér sett fram til að vera að þróa með SDL. Við erum að fara að læra hvernig á að búa til leik glugga. Við erum að fara að búa til sprites, sem eru myndirnar í leiknum sem getur fært um. Við erum að fara að læra hvernig á að og lifandi sprites, svo færa þá í kring, gera þá breyst með tímanum. Og við erum að fara að læra hvernig á að handtaka lyklaborð og mús inntak frá the tölva. Það sem við munum ekki vera að tala um er í dag 3D grafík, því það er mjög flókið efni sem við höfum ekki tíma fyrir. Við munum ekki læra hvernig á að spila hljóð á leikjum okkar. Og við munum ekki vera að byggja fyrir allt annað en Linux. Nú hellir eru að vonandi, í lok málstofunnar, þú munt vera ánægð með sem SDL skjöl, þannig að þú munt vera fær um að fara að reikna út hvernig á að spila hljóð fyrir þig. Einnig að byggja fyrir Mac eða PC ætti að vinna nákvæmlega það sama og að byggja upp fyrir Linux, en skipulag er að fara að vera svolítið öðruvísi. Svo þú ættir að vera fær um að reikna út hvernig á að gera þetta í lok námskeiðsins í dag. Svo fyrir að setja upp, við erum að fara að nota a raunverulegur vél. Við viljum nota CS50 IDE, því við erum bara að fara að vera að skrifa í C En þar sem IDE er ekki vafra, við getur ekki stofnað nýja glugga eða sýna Grafíkin í henni. Þannig að við þurfum a raunverulegur vél. Svo þú getur fylgja leiðbeiningunum hér á manual.CS50.net/appliance/15~~pobj að setja opinbera CS50 tæki, sem er bara Linux raunverulegur vél. Og þá þegar þú ert að allur setja up-- það gæti tekið smá tíma, vegna þess að mjög stór download-- þú ert að fara að keyra í VM sudo líklegur-fá endurnýja. Og það er í raun að fara að uppfæra alla hugbúnaður pakka á raunverulegur vél. Eftir það, þú ert að fara að keyra sudo líklegur til-fá setja í embætti, libsdl2-2.0-0, libsdl2-dbg, libsdl2-dev og auki libsdl2-image-2,0-0, libsdl2-image-dbg, og libsdl2-image-dev. Svo hvað þýðir það að gera? Sem eingöngu setur kemba upplýsingar, skjöl, hausum, og forrit fyrir tveimur bókasöfnum. Venjulegur gamall, SDL 2,0, og annar bókasafn kallað SDL Image, sem við erum að fara að vera með að hlaða myndum inn í leik okkar. Svo þegar þú ert sem einnig sem, bara þegar það spyr, þú skrifar bara já, ýta á Enter að setja þau pakka, og þá ættir þú að vera gott að fara. Svo til að fá dreifingu kóða, þú can-- ó kæri, þetta er ekki uppfærð. Nema þú hafa a GitHub account-- ef þú ert með GitHub reikning, þú getur gert þetta Git klón stjórn á endurhverfum og það mun sækja Git endurhverfum með öllum kóða í það, þannig að þú munt hafa kóðann. Ef þú ert ekki með GitHub reikningur, hvað þú ættir að gera er að slá wgithttps: //github.com/tlively/sdl seminar-- og hér er það different-- /archive/master.zip. Svo aftur, það er nákvæmlega sama URL, nema það er að fara að vera tlively / SDL_seminar / master.zip og þú ert að nota wgit að sækja það. Og þá getur þú bara renna niður að skjalasafn og þá munt þú hafa allt kóðinn. Svo hryggur óður í þessi. Og þá fyrir mun einnig vera farfuglaheimili á Vefsíðan CS50 Málstofa í nokkra daga. Allt í lagi. Svo hvernig gera við að byrja skrifa eigin leik okkar? Jæja, það fyrsta sem við erum að fara til að vilja gera er að horfa á SDL gögnum. Svo hér er VM. Og hér er vefsíðan. Ég hef siglt að lifa libsdl.org. Það sem ég ætla að gera hér er að fara yfir til skenkur, undir skjöl, og smelltu á wiki. Þetta mun koma mér til wiki sem hefur mest af gögnum fyrir SDL. Yfir á the skenkur hér, við erum að fara að smella API frá flokki, því er að fara að gefa okkur gott afdráttarlaus útsýni af öllu API fyrir SDL. Svo til dæmis höfum við grunn frumstilling og leggja niður, alla konar stjórnsýslu efni til að nota SDL, og þá höfum við hluti fyrir sýna það á skjánum. Það er video. Inntak viðburðir, það er að fá inntak frá lyklaborðinu, fá inntak frá the mús, og á stýripinnann ef þú hefur það jafnvel. Það er afl viðbrögð fyrir hluti eins og leikur stýringar, sem við erum ekki að fara að tala um. Og hér er hljóð. Og þá er það fullt af öðrum efni sem SDL getur gert fyrir þig. En í dag erum við að fara að einblína á frumstilling hér, sýna myndir í myndbandinu kafla, og meðhöndlun inntak atburðum. Svo þetta eru helstu hlutar gögnum sem þú ættir að vera að hafa áhyggjur af. Bara til gamans, ef við förum yfir hér og smelltu á API með nafni, getum við séð lista af hverjum einn hlutur í SDL bókasafn. Svo öll þessi störf, upptalning, mannvirki, brjálaður magn af efni, stafrófsröð. Og greinilega, þar þú veist að þú ert að gera, þetta er ekki að fara að vera of hjálpsamur, sem er hvers vegna við gerum API eftir flokki. Svo skulum við hefjast handa. Vonandi þú hefur nú þegar sótt dreifingu kóða. Og svo það sem þú getur gert er, ekki satt hér í CS50 tæki, einfaldlega að opna flugstöðina. Hér við fara. Þannig að ég hef nú þegar sótt er dreifingu kóðann með Zip aðferð. Og ég hef unzipped það. Svo hér er það í SDL málstofa skipstjóra. Þannig að ég ætla að fara inn í þessi skrá. Og það sem við sjáum hér er sem við höfum sjö C skrár. Og þetta er að fara að kóða við erum að fara að horfa á í dag. Við höfum makefile. Og við höfum auðlindir skrá, sem einfaldlega hefur mynd sem þú verður að sjá fljótlega. Svo skulum opna þessar skrár með G-Edit ritstjóri. Svo ég vil að opna allar skrár sem byrja með Hello og enda með .C. Hér við fara. Svo er það örlítið glugga, þannig að við erum ætla að reyna að gera það stærri. Nei, fór það í burtu. Allt í lagi. Svo hér er fyrsta skrá við erum að fara að horfa á. Það heitir hello1_sdl.c. Og allt þetta gerir er frumstilla SDL Bókasafn svo að við getum byrjað að nota það. Hvernig myndir þú vita að koma upp með þennan kóða sjálfur? Jæja, ef við lítum yfir á gögnum og við förum inn í frumstilling og leggja niður kafla, það er að fara að segja okkur öll um hvernig á að frumstilla SDL. Svo ákveðið að lesa þetta seinna. Það er að fara að segja þér allt um hvað er að gerast hér. En helsta crux málið er að við þurfum að kalla þessa aðgerð SDL í það og gefa það hvers konar málefni við viljum að bókasafn til að frumstilla. Svo í okkar tilfelli erum við bara að fara frumstillt vídeó fyrir nú, svo að við getum byrjað að birta myndir. Hérna getur þú séð hvort við smellur á SDL í það, við er hægt að fá enn meiri upplýsingar, þ.mt skilagildi. Þannig að við sjáum hér að það returnes núll á árangri. Svo í númerið okkar, við erum að fara að sjá hvort það er ekki aftur núll, og ef það er ekki aftur núll, svo það var ekki vel, þá erum við að fara að einfaldlega prenta Villa með þetta önnur aðgerð, SDL fá villa, sem skilar streng lýsa villu sem átti sér stað. Við erum að fara að prenta það villa og þá erum við bara að fara að loka forritinu með villa merkjamál. Þá annar hlutur sem við þurfum að gera er að, áður program hættir, ef við frumstilla tókst SDL, við þurfum bara að kalla það SDL hætta. Og það er að fara að takast að hreinsa upp öll innri auðlinda SDL er fyrir okkur. Svo gögn there-- aftur, hér erum við í frumstilling og leggja niður kafla af gögnum. Þú getur bara smellt á virka hér, SDL hætta, og þú getur lesið allt um það eins og heilbrigður. Og mikið af þessum virka skjöl síður hafa dæmi kóða, þannig að þetta er mjög gott úrræði. Ákveðið að eyða smá tíma lesa hluta af þessum wiki ef þú ert að fara að gera þetta verkefni. Allt í lagi. Svo er það allt kerfið okkar. Það sem við getum gert núna is-- ég að fara að opna makefile hér, þannig að ég ætla að taka líta á hvernig það virkar. Og það er mjög einfalt makefile, svipað því sem þú hefur séð áður. Einn af the aðalæð mismunur er að, hér, þetta er að fara að setja niðurstöðu gangi þessi skipun, sem þú hefur nú þegar setja ef þú hefur sett SDL. Og þetta er a stjórn það er að fara að búa til nokkur auka fánar fyrir þýðanda. Í samlagning til þessi, erum við að gefa það öllum venjulegum skipanir, eins og heilbrigður eins þessir tveir skipanir. Svo -lsdl2-mynd handföng tengja í SDL mynd bókasafn. Og -lm annast raun tengja í stöðluðu C stærðfræði bókasafn. Þannig að við erum ekki að fara að þurfa þá fyrir alla C skrám okkar, en við setjum bara þá í svo að við getum nota sama makefile fyrir allt án breytinga. Hérna í heimildum, þetta er þar sem þú vilt setja þær skrár sem þú varst að fara að safna saman fyrir verkefnið þitt. En síðan hver og einn af C minn skrá hér hefur meginhlutverk, það er að fara að fá rugla ef við setjum þá alla í. Þannig að ég ætla bara að segja, nú, hello1_sdl.c, sem er eitt sem við horfði bara á. Svo ef ég fer aftur yfir hér, get ég ekki gera. Og hvað það gerði það bara saman þessi fyrstu skrána. Og þá getum við slegið ./game, því það er executable það framleitt. Og allt það gerði var letur frumstilling vel. Svo við gerðum eitthvað rétt. En það var voða leiðinlegt, vegna þess að við ekki sjá glugga, ekkert var að fara um. Svo mikill, fengum við SDL forsniðin. Nú, við skulum fara í eitthvað aðeins meira áhugavert. Svo hér höfum við hello2_window.c og þetta er að fara að vera örlítið meira flókið C forrit sem initializes SDL bara eins og áður, nema nú erum við að líka að fara að frumstilla SDL teljarann. Og þetta er að fara að láta okkur aðgang að innri teljara og nota virka varðandi tíma. Og þá skulum líta niður hér. Það sem við gerum er að við höfum þessa músina til SDL glugga strúktúr, sem er að fara að vera búin með þetta símtal að aðgerðinni SDL búa glugga. Nú, þetta tekur mikið af rökum, þannig að við skulum fara að líta á gögnum. Svo aftur, ég ætla að API frá flokki, ég er fara niður í vídeó hér, og fyrsta kafla, sýna glugga stjórnun. Svo hefur þessi kafli tonn af efni í henni, en ef þú lítur í gegnum þessar aðgerðir, þú munt sjá að líklega sá sem við vilt heitir SDL búa glugga, sem gerist að vera rétt fyrir ofan. Og svo er þetta skjöl fyrir þessa aðgerð. Glugginn er að fara að hafa titil, x og y stöðu á skjánum, það er að fara að hafa breidd, hæð, og þá er að fara að taka nokkrar fánar. Nú, eigum við í raun ekki sama um eitthvað af þessum fánar núna, en ef þú vildir gera eitthvað eins gera a fullur skjár gluggi, þú gætir tekið að líta á það. Fyrir nú, við erum bara að fara að nota þessar sérstöku gildi, SDL glugga auk miðju fyrir x og y í því skyni bara búa til glugga í miðju á skjánum okkar. Svo er það sem það er að gera. Og ef glugginn verður að vera null, sem þýðir að það er villa, þá aftur við erum bara að fara að prenta villa með SDL fá villa. Og þá vegna þess að við frumstilla SDL, þurfum við nú að loka henni. Svo við köllum SDL hætta áður aftur einn fyrir helstu. Þannig að við höfum þessi gluggi opnast vonandi. Og hvað við erum að fara að gera er að við erum að fara að hringja SDL fyrir 5.000 millisekúndur, sem er það sama og fimm sekúndur. Og þegar við erum búin með það, það er að fara að eyða um gluggann, hreinsa upp SDL bókasafn, og loka forritinu. Svo skulum fara á undan og gefa það skot. Svo nú í stað þess að breyta sem makefile hvert skipti, Ég get einfaldlega ekki gert, og þá á the stjórn lína, segja heimildir jafngildir og þá skrá við erum að setja saman. Svo það er hello2_window.c. Fantastic. Engar Erros. Nú, ef við hlaupa executable okkar, við sjáum þennan glugga. Nú eru nokkrar vandamál með glugga. Við getum fært það í kring, en það hefur Þessi bakgrunnur skran inni af því. Þannig að við höfum ekki dregið nokkuð, og svo er það bara fullt af rusli, sem er ansi mikið það sem við búast. Ennfremur getum við ekki loka glugganum. Ég er að ýta á þennan X í horn og ekkert er að gerast. Þannig að við munum sjá hvernig á að festa að í smá. Svo skulum festa hluta þar sem gluggi er full af rusli fyrst. Þannig að ef við förum yfir til hello3_image.c, hvað getum við séð er að við höfum bætt við nokkrum fleiri hlutir hér. Við höfum bætt við þessa nýju haus skrá til að fá myndatöku virka. Ég held að við gerðum það í síðasta einn, of, og ég vissi ekki að nefna það. En nú vegna þess að við erum að vinna með myndir, við þurfum að fela SDL ímynd haus skrá eins og heilbrigður. Svo er það sama og áður, að virkja SDL hér, sami samningur við að búa til glugga. Við höfum séð að áður en nú. Nú þurfum við að búa til eitthvað sem heitir a renderer, sem eins konar fer eftir með glugga. En það er eins konar ágrip hlutur sem er í umsjá gera allt þetta teikna starfsemi að glugganum. Og það svari í raun til forrit hlaðinn í vélbúnað í þinn tölvu eða síma eða hvað sem er. Svo fánar við viljum fara it-- og þú getur að líta á gögnum til að fá meiri upplýsingar here-- eru að fara að SDL Render hraða, sem þýðir það er að fara að vera nota grafík vél og ekki bara líkja í hugbúnaði. Og við erum að fara að nota SDL teiknarans PRESENTVSYNC. VSync er hlutur sem einfaldlega gerir grafík líta betur út og kemur í veg fyrir þetta hlutur sem kallast skjár hryðjuverkum, þar sem helmingur af einum ramma og helmingi næsta ramma fá dregin á sama tíma og það lítur hræðilegt. En aftur, þú getur farið að lesa um það á eigin spýtur. Þannig að við höfum nokkrar fánar hér. Og svo erum við bara að fara að hringja í þessi aðgerð SDL búa teiknarans. Við erum að fara að gefa það um gluggann til að tengja við það teiknarans. Neikvæð einn þýðir að við ekki sama hvað grafík bílstjóri við erum að fara að nota. Svo það ætti nánast alltaf neikvæð einn, nema þú veist um grafík bílstjóri. Og þá erum við bara að fara Til að standast það fánar okkar. Þannig að ef það skilar null, þá erum við að fara að prenta villa eins og venjulega, en svo við erum líka að fara að eyðileggja glugga til að hreinsa upp þessar auðlindir fyrir starf SDL hætta og koma aftur. Nú er áhugaverður hluti hér er þar sem við hlaða ímynd okkar nota þessa aðgerð IMG_load. Þetta er eina virka við erum að fara að nota frá SDL mynd bókasafn. Það er sú eina sem við þurfum. Það er aðgerð sem tekur band sem er leið hvaða mynd auðlind. Og það getur verið PNG, GIF, punktamynd, eitthvað af þessum hlutum. Og það er hvers vegna þessi aðgerð er svo gaman. Það ræður nánast hvaða sniði. Það hleðst inn í minni og geymir hana sem hlutur kallast SDL yfirborð. Nú er SDL yfirborð bara strúktúr sem táknar mynd gögn í minni. Svo þú getur lesið meira um að í gögnum tveimur. Og ef þetta Villa, þá erum við að fara að gera allt hlutur þar við að prenta villa, loka okkar auðlindir, og þá hætta forritið. Nú er áhugaverður hlutur, áður er hægt að teikna þessa mynd í gluggann, þurfum við að gera það áferð. Nú á áferð samsvarar að ímynd gögn hlaðinn í minni grafískri vélbúnaði er. Svo er yfirborð í helstu minni, venjulegur minni sem við höfum verið að nota alla önn, og áferð er í þessu sérstaka VRAM minni að grafík kortið stjórna. Svo við köllum þessa aðgerð SDL_CreateTextureFromSurface. Við gefa það teiknarans okkar og yfirborð okkar. Og þá erum við í raun gert við yfirborðið, þannig að við erum bara að fara að losa það. Við þurfum því ekki lengur. Og þá svo ef þetta símtal errored og aftur null, þá erum við að fara að gera í heild villa skýrsla hlutur aftur. Allt í lagi. Hér fáum við inn í sumir Raunveruleg flutningur virka. Svo að kalla SDL_RenderClear og liggur það sem renderer tengist gluggann okkar einfaldlega gerir glugga svartir. Svo það fjarlægir sem skran sem við sáum í glugga okkar áður og gerir það svart. Og þá erum við að fara að hringja SDL_RenderCopy, gefa það teiknarans okkar, áferð okkar. Og við munum tala um það Þessir reitir eru í bita. En það er að fara að taka áferð gögn og afrita hana á okkar glugga til að draga myndina. Svo eftir að við höfum gert þetta eintak gögn á gluggann okkar, við verðum að gera þetta auka virkni kallað SDL_RenderPresent. Og þetta er áhugavert vegna þess að þetta gerist inn efni sem kallast tvöfaldur höggdeyfir. Svo er tvöfaldur höggdeyfir tækni sem gerir grafík líta mikið betur. Aftur í veg fyrir það að skjár ofsafenginn Ég var að tala um áðan, þar þú þarft bæði biðminnin. Það er aftur biðminni í minni og að framan biðminni. Framan biðminni er bókstaflega hvað er á skjánum þínum í augnablikinu. Svo við gerum allt þetta draga afbrigði, eins SDL gera afrit eða SDL_RenderClear til baka biðminni. Svo þeir breyta hlutum í bak biðminni. Hér gætum við að teikna þetta græna veldi að aftan biðminni. Svo þá þegar við erum búin að gera Gjaldið starfsemi okkar, sem gæti tekið mjög langan tími, hvað við erum að fara að gera er að skipta um dúa. Svo það bókstaflega bara tekur framan biðminni og aftur biðminni og skiptir þá, svo að, samstundis, í einni aðgerð, í stað þess að kannski hundruð eða þúsundir, öll nýlega veitt okkar hlutir eru á skjánum. Og þetta kemur í veg fyrir það eins og skjár hressandi þegar við höfum aðeins dregið helming af hlutum okkar fyrir rammann. Svo er það hvers vegna við þurfum að hringja SDL_RenderPresent, svo og eins SDL_RenderCopy. Aftur, við erum bara að fara að bíða í fimm sekúndur. Þá erum við að fara að hreinsa upp auðlindir okkar. Við höfum alveg nokkrum fleiri að þessu sinni. Og þá erum við bara að fara að loka forritinu. Svo skulum gera það. Ég ætla að slá make, og þá heimildir jafngildir hello-- þetta er nú 3image.c. Allt í lagi, sem unnin engar villur. Og þú getur séð hér að ég hef nú dregin út myndina mína, Hello, CS50! að glugganum okkar, sem hverfur eftir fimm sekúndur. Nú, þetta er enn vandamál, ekki satt? Þetta er ekki gott forrit, vegna þess að þegar ég reyni að loka glugganum, ekkert gerist. Á því að X er enn ekki móttækilegur. Svo skulum taka a líta á the næstu skrá, hello4animation. Þannig að þetta er skrá það er að fara að kynna áhrifamikill og hreyfing til að ímynd okkar. Þannig að við erum að fara að gera sama og áður, hefja SDL, búa til glugga, búa til teiknarans, hlaða mynd inn minni, búa til áferð. Við höfum séð allt sem áður. Nú, þetta er nýtt. Við erum að fara að hafa a uppbygging kallast An SDL RECT, sem er bara rétthyrningur. Ef við förum yfir hér, við getum gera a leita að SDL RECT, og þú getur séð það er mjög einfalt skipulag. Það hefur sem X, A sem Y er í stöðu, og það hefur breidd og hæð fyrir stærð rétthyrningur. Svo það sem við erum að fara að gera er að við erum að fara að skilgreina þessa SDL rangur DEST, fyrir áfangastað. Og þetta er staðurinn á skjánum þar við erum að fara að vera að teikna ímynd okkar, rétt svo ef við erum að fara að vera færa myndina í kring, þá á áfangastað þar við erum að fara að draga myndina þarf að vera að flytja í kring. Þannig að við erum að fara að kalla þetta virka SDL_QueryTexture. Og eftir ég ætla að hleypa address um dest.w, sem er breidd, og dest.h, sem er hæð. Og svo SDL_QueryTexture er að fara að geyma í þeim fræðum breidd og hæð áferð okkar. Og þá hvað ég ætla að gera er að ég ætla að setja dest.x að vera glugga breidd mínus dest.w, sem er breidd Sprite, deilt með 2. Og þetta er að fara að setja það upp þannig að myndin er fullkomlega miðju í glugganum okkar, allt í lagi? Svo nú hef ég y stöðu. Og þetta er að fara að vera breytu sem er breyta, vegna þess að við erum að fara að vera færa myndina í y átt. Og nú höfum við eitthvað kallað fjör lykkja. Svo hvernig hjartarskinn fjör vinna? Jæja, mönnum auga getur greint 12 greinilegur myndir í hverri sekúndu, allt í lagi? Svo ef þú blikka 12 mynd spil á mig í annað, ég sá hver af þeim myndum sem eigin greinilegur einstaka ímynd sína. Nú, ef þú blikka meira myndir á mig í annað, þá auga mitt myndi byrja að þoka þeim saman og ég myndi skynja það sem hreyfingu, í stað þess að einn greinilegur mynd. Svo, til dæmis, kvikmyndir og sjónvarp, þeir blikka myndir á þig 24 sinnum annað. Svo er það 24 rammar á sekúndu. Computer skjár, á hinn bóginn, oft eru á 60 römmum á sekúndu. Það er hressa hraði þeirra. Það er hversu oft þeir endurnýja myndin á skjánum. Svo miða okkar er að fara að vera 60 rammar á sekúndu leikjum okkar. Svo skulum sjá að í kóðanum. Svo fyrir hvern ramma, við erum fyrst að fara að hreinsa glugga. Þetta er almenna mynstur. Þú hreinsa alltaf glugga hverjum ramma, og þá gera allt teikningu þína rekstur, og þá á endanum, ekki RenderPresent að sýna allt í rammanum. Og þá þú ert að fara að hafa bíða í lok að bíða þangað til næsta ramma ætti að byrja. Þannig að ef ég var að gera a einhver fjöldi af flókið útreikningur hér sem tók meira en 16 millisekúndur, það væri ómögulegt fyrir mig að fá þessi ndu af 60 sem Ég vildi, því að hver rammi er taka of langan tíma að reikna. Ennfremur erum við í raun að gera konar hverfandi magn af vinna hér, vegna þess að það er bara eitt sem við erum að teikna. Svo er bara að bíða bara 1/60 af a Annað, sem er lengd af ramma á milli ramma. Þannig að ég er svona að þykjast gera öll vinna mín tekur núll tíma. En í alvöru leik, þú vilt að draga þann tíma sem það tók að gera allt þetta verk frá hvíldartíma þínum. Svo engu að síður, það er ég reyndar gera í þessari lykkju? Ég hreinsa glugga. Ég stilla dest.y, sem er int til Raunveruleg Y staða mín kastað int. Nú, ég vil fljóta upplausn fyrir y stöðu mína í leikinn minn, en þá að raun draga það á skjánum, það þarf ints, því það er í einingum dílar, svo það er það sem kastað er fyrir. Ég ætla að draga myndina. Svo er þetta uppspretta rétthyrningur. Og þetta er áfangastaður rétthyrningur. Svo ég fór null til uppspretta rétthyrningur að segja að ég vil vekja heilt áferð mína. En ef þú hefðir fullt af áferð í leiknum og þeir eru allir í einu stóru áferðarmynd sem var hlaðið inn SDL og bara einn áferð, þú gætir nota uppspretta rétthyrningur að velja einn af smærri áferð, einn af smærri sprites, út af því að stór áferð kortinu. Svo aftur, ég er liggur minn láta, minn áferð, og nú áfangastað. Þetta er að fara að vera þar í glugga það er að fara að vera dregin. Og þá, vegna þess að ég hreyfingar eitthvað, ég þarf hreyfingu, Ég ætla að vera að uppfæra í Sprite stöðu á hverjum ramma. Þannig að ég hef þetta fastann bókrollu hraða í einingar punktar á sekúndu. Nú, í hvert sinn sem við gerum hreyfingu, ramma er aðeins 1/60 úr sekúndu. Þannig að ég ætla að deila því með 60. Og þá, við skulum sjá, ég er draga að frá y stöðu. Hvers vegna er ég að draga? Við munum fá til að í sekúndu. Svo þá ég hreinsa upp auðlindir mín og the program er lokið. Svo skulum gera það. Svo skulum við fara inn í gera SRCS = hello4 animation.c, allt í lagi? Game. Þar sem þú ferð. Þannig að ég hef það að fletta upp glugga, sem er sniðugt. En bíddu, ég var að draga frá y stöðu í hvert skipti. Hvað er að gerast þarna? Jæja, það kemur í ljós að í SDL og í raun í flestum tölvugrafík, uppruna fyrir hnitakerfi er efst til vinstri í glugganum. Svo fer jákvæð x átt yfir gluggann til hægri. Og jákvæð Y átt reyndar fer niður. Svo aftur, í uppruna er efst til vinstri gluggann, jákvæð Y átt er niður, og jákvæð x er til hægri. Svo þegar ég draga frá y stöðu, það er að fara að gera það fara á neikvæð Y átt, sem er upp glugga. Svo er það sem er að gerast þar. Cool. Við skulum líta á næstu skrá. Hér er hluti af sýna hvar við loksins fá að X í horninu á glugganum sem er ætlað að loka glugganum að vinna. Svo hvað er að gerast? Við frumstilla SDL, búa til glugga, búa til teiknarans, opna myndina, búa til áferð eins og við höfum séð áður. Við höfum á sama áfangastað rétthyrningur eins og áður, sama símtal fyrirspurn áferð. En í þetta skiptið, við erum þá fara að skipta breidd og hæð áfangastað okkar um 4. Þessi eini hefur áhrif stigstærð ímynd okkar niður þegar við birtum það í glugganum með fjórum. Svo er það sniðugt. Við getum bara hækka bara svona. Við erum að fara að byrja á Sprite í miðju skjásins. Og nú höfum við x og y hraða og þeir eru bæði að fara að byrja á núlli. Þetta er rangt skrá. Fyrirgefðu. Svo er það allt satt. Það er allt enn í þessari skrá. Við höfum deilt með 4 og allt. Svo hér höfum við x og y stöðu okkar fyrir miðju í glugganum. Og við að gefa það upphaflega hraða af þessum föstu hraða, sem Ég trúi er 300 punktar á sekúndu. Nú höfum við á þessu INT gæti alveg eins vera Boolean heitir nálægt óskað. Og í stað þess að gera að óendanlegur lykkja á myndatöku hér, við erum að fara að vera hreyfingar sem lengi sem nálægt er ekki óskað. Svo hvernig gera við vinna atburði? Jæja, SDL biðraðir upp atburði í bókstaflega biðröð á bak við tjöldin. Og þá hver rammi, við getum dequeue viðburði frá því biðröð með þetta kalla SDL_PullEvent. Og aftur, ákveðið að fara að lesa um þetta í gögnum. There 'a einhver fjöldi fleiri smáatriði og mikið fleiri aðgerðir sem þú getur notað með þetta. Við gefa það í netfang þessi orð, SDL_Event sem við höfum hér á mánudaginn. Nú, hvað er SDL_event? Vegna SDL, ef við lítum á að documentation-- skulum sjá, API frá flokki, inntak viðburðir, atburður meðhöndlun, getum við litið á fjölda af mismunandi viðburðir hér og við getum séð að það er a heild tonn af þeim. Svo er það þetta SDL_Event hlutur? SDL_Event er í stéttarfélagi. Vá, hvað er verkalýðsfélag? Þú hefur sennilega aldrei heyrt um það áður. Og það er allt í lagi. A sambandið er góður af eins og a struct, nema strúktúr hefur pláss fyrir alla sviðum þess og minni, en stéttarfélags hefur aðeins nóg pláss til að passa stærsta einn af viðfangsefnum hennar, sem þýðir það getur aðeins geymt eitt af viðfangsefnum hennar í einu, sem eins konar vit til að finna viðburði, ekki satt? Við getum haft lyklaborð atburður eða glugga atburður, en eitt atriði er ekki hægt verið bæði hljómborð atburður og glugga atburður, svo það væri kjánalegt að hafa pláss fyrir bæði af þeim inni atburður stéttarfélagi okkar. Svo ef þú vildir búa til eigin stéttarfélagi þínu, það lítur nákvæmlega sama og að búa til strúktúr, nema að við notum stéttarfélags leitarorð í stað þess að struct leitarorð. Og mundu, að allt í það inni stéttarfélagi, í raun breyta sem er verkalýðsfélag getur aðeins haft einn af þeim gildum í einu. Og hvernig getum við sagt hvers konar atburði við laust bara burt af þessum biðröð? Jæja, við getum prófað að event.type. Og ef það er jafn að SDL_Quit, við vitum það er atburður sem var búin þegar við högg að X í horninu á glugganum. Og við getum sett nálægt biðja jafnt og 1. Restin er bara fjör sem þú hefur séð áður. Svo skulum við fara á undan og gera þetta og sjá hversu vel það virkar. Þannig að ég ætla að slá gera og þá SRCS = hello5_events.c. Það sem við förum. Leikir. Nú getum við séð að það var örugglega reiknast niður um fjóra. Og nú er það skoppar um. Ég hef fengið árekstur uppgötvun fara á með hliðum gluggans að við getum kíkja á. Og hvað gerist þegar ég fer að loka henni? Það lokar. Fantastic. Við fengum að atburði. Og við meðhöndla það. Svo skulum líta aftur á kóðann. Svo hvernig var ég það skoppar um svona? Man ég setti bæði x og Y upphaflega að hraða. Og hraði er jákvætt stöðug, svo er það að fara að fá það að byrja út fara niður og til hægri. Nú, hvert ramma, til viðbótar við meðhöndlun allir atburðir sem kunna að hafa átt sér stað, Ég ætla að greina hvort Sprite minn er að reyna að fara út um gluggann. Þannig að við getum gert það bara með því að haka x_pos með 0, y_pos 0, og þá einnig x_pos og y_pos með glugga breidd og gluggi hæð. Eftir ég hef dregið breidd Sprite. Og þetta er vegna þess að ef ég gerði það ekki draga breidd Sprite, það vildi bara athuga hvort uppruna Sprite ekki fara út um gluggann. En við viljum allt Breidd Sprite alltaf að vera inni í glugganum og alla hæð Sprite alltaf að vera inni í glugganum. Svo er það sem Frádráttur er fyrir. A einhver fjöldi af rúmfræði hér getur verið gagnlegt að draga það út á pappír með því að samræma kerfi til að sjá hvað er að gerast. Svo ef ég rekast, ég bara einfaldlega endurstilla stöðu þannig að það er ekki að fara út af skjánum. Og ég ætla að, ef það skoppar á einn af veggjum, Ég ætla að hrekja á X hraða þannig að það byrjar skoppandi í hina áttina. Og sömuleiðis, ef það smellir efst eða neðst, Ég ætla að setja y hraða jafn neikvæða y hraða, þannig að það verður hopp aftur. Svo er það bara hvernig við fengum það hér. Og uppfærslu stöður bara eins og við höfum séð áður, skipta um 60, vegna þess að við erum Aðeins meðhöndlun 1/60 úr sekúndu. Og þá flutningur, nákvæmlega það sama og áður. Og svo er það allt sem var að fara á þessa skrá. Svo er það hvernig við gerum atburði. The aðalæð hlutur til að taka í burtu hér er þetta SDL_PullEvent virka. Og þú ættir örugglega að lesa Skjölin meira um SDL_Event stéttarfélags, því þessi gögn tegund er mjög, mjög mikilvægt, vegna þess að við notum það fyrir alls konar viðburði. Til dæmis, við notum það fyrir lyklaborð viðburðir, sem er það sem þessi skrá er til. Svo hvað höfum við? Við höfum sama og áður, frumstilla SDL, búa til glugga, búa til teiknarans, opna myndina í minni, búa til áferð. Aftur, við erum að fara að hafa þessa DEST rétthyrningur, við erum að fara að skala myndina með fjórum, gera það aðeins minni. Nú erum við að fara að byrja Sprite í miðjum skjánum. En í þetta skiptið, við erum að fara að setja á fyrstu x og y er hraði á núll, vegna þess að lyklaborðið er að fara að stjórna þeim. Og ennfremur, við erum að fara að halda utan um þessar breytur upp, niður, til vinstri og hægri. Og það er að fara að halda utan um hvort við höfum ýtt hljómborð hnappur sem samsvara upp, niður, til vinstri, og rétt. Nú, þetta er góður af fínum vegna þess að við getum notað W, A, S, D hér, eða í raun örvatakkana. Við munum sjá að í aðeins annað. Þannig að við erum að fara að vinna atburður eins og áður. Við draga atburði. En nú erum við að fara að kveikja á tegund viðburðar. Ef það er SDL_Quit, við erum fara að setja nálægt beðnir um að einn, rétt eins og áður. Sem annast x í hornið á glugganum, svo að glugga okkar í raun lokar. Annars, ef við fáum að SDL lyklinum niður atburður, sem þýðir að við ýtt á takka, þá hvað við erum að fara að gera er að við erum að fara að skipta á þessum hlutur hér, sem means-- svo event.key þýðir meðhöndla atburður stéttarfélags okkar, fara og fá lykilinn atburður uppbyggingu í það. Svo kemur í ljós að þetta sambandið er lykillinn atburður uppbyggingu. Og þá fara á takka uppbyggingu atburður 'hennar reitur kallað keysym og þá scancode. Og aftur, ákveðið að lesa gögn um þetta. Leitarorð inntak alveg áhugavert. Þú getur fengið skanna kóða eða lykill merkjamál. Og það er lítið lúmskur, en gögn er alveg góður. Þannig að ef við sjáum að grannskoða póstnúmer fyrir Ýttu okkar vera W eða allt, við erum að fara að setja upp jöfn 1. Og þá erum við að brjótast út úr þeirri rofi. Ef það er A eða vinstri, sett við fórum í 1, et cetera, et cetera, fyrir niður og til hægri. Nú, í þessum ytri rofa, ef við sjáum lykil upp atburði, sem þýðir að við höfum gefið út á takka og við erum ekki lengur styðja það. Þannig að ég ætla að segja upp jafngildir 0, vinstri jafngildir 0, niður jafngildir 0, rétt jafngildir 0, et cetera. Og eftir að við höfum í öllum þessum tvö tilfelli setja við hliðina á hvor aðra án sérstakri kóða í fyrsta málið, sem þýðir að hvort sem það er An S eða niður hérna, það er að fara að framkvæma þennan kóða. Svo er það nokkuð vel. Það kemur í veg okkur þurfa að gera meira skilyrði og IFS og hlutir svona. Þannig að við erum að fara að að ákvarða hraða. Við setjum hraða 0. Þá ef upp er ýtt og ekki niður, þá erum við stilla y hraða neikvætt hraða. Mundu neikvæð, vegna þess að neikvæð Y átt er upp. Og jákvæð Y átt er niður. Ef niður er ýtt og ekki upp, þá erum við fara að setja það að jákvæð hraða, sem þýðir að fara niður skjáinn. Sama með vinstri og hægri. Og þá erum við að fara að uppfæra stöður eins og áður. Við erum að fara að gera árekstur uppgötvun með mörk, en við erum ekki að fara að endurstilla hraða, vegna þess að hraða er bara stjórnað af lyklaborðinu. En við erum að fara að endurstilla stöður til að halda henni í glugganum. Og við erum að fara að stilla stöður í strúktúr og þá gera allir flutningur efni frá áður. Svo skulum sjá hvað það gerir. Svo gera SRCS-- skulum sjá, þetta er hello6_keyboard.c. Ó nei. Svo erum við með nokkur viðvaranir hér. Og það er einfaldlega að segja við gerðum ekki stöðva fyrir hvert einasta mögulega tagi atburður. Það er allt í lagi, vegna þess að það er 236 þeirra eða svo. Þannig að ég ætla að hunsa þessi varnaðarorð. Það er samt saman í lagi. Þannig að ég ætla að fara að spila leikinn. Það er ekki að flytja. En nú, þegar ég blanda á lyklaborðinu mínu, Ég get gert nokkrar WASD hreyfingu hér, Ég nota arrow takkana mína eins og heilbrigður. Og eftir því, jafnvel þótt ég ýta hægri núna, það er ekki að fara út um gluggann, vegna þess að ég endurstilla það á hverjum ramma. Svo er það sniðugt. Þú getur ímyndað þér að flytja í kring Mario með sumir örvatakkana eða eitthvað svoleiðis. Og já, X virkar. Svo endanlega skrá við erum að fara að líta á, hellow7_mouse. Þetta er um að fá mús inntak. Svo í þessu einn, við flytja stærðfræði haus, vegna þess að við erum að fara að hafa smá stærðfræði hér. Sama gamla, sama gamla efni, áfangastað, sama gamla, séð það áður. Jæja, þetta er áhugavert. Þannig að við erum aftur að aðeins að skoða fyrir SDL hætta atburð. Afhverju er það? Svo er hægt að fá mús inntak frá atburðum. Eins og þegar músin flutt, þú færð atburð fyrir það. Þegar mús hnappur er þrýsta, þú getur fengið atburð fyrir það. En það er annað, örlítið einfaldara kannski, API til að fá mús inntak. Og það er einfaldlega SDL fá músina ástand. Þannig að ég hef int fyrir x og Y fyrir bendil. Ég gefa það til SDL_GetMouseState, sem setur þetta. Og þetta er staða í hnitakerfi í glugganum. Svo ef massi er í efst í vinstra um gluggann, sem myndi 0, 0. Nú, það sem ég ætla að gera er að ég ætla að gera smá vektor stærðfræði. Ég veðja að þú hélst að þú myndir ekki sjá að í CS50, en hér er það. Ég ætla að gera nokkrar vektor stærðfræði til að fá vektor frá myndinni til bendilinn. Og svo hvers vegna þarf ég þetta frádráttur hér? Jæja, ef ég nota bara DEST .-- svo Ég þarf að þýða mús x og y um helming breidd og að hæð myndarinnar, vegna þess að ég vil miðju Myndin sem á að fara í átt að músinni, ekki uppruna myndarinnar. Svo er það bara að gera að ég er að tala um miðja mynd hér. Þá fáum við delta x og y, sem er munurinn á miða við raunverulegan stöðu myndarinnar. Og þá getum við fá fjarlægð hér, sem er að fara að vera Pythagorean setningin, kvaðratrót x sinnum x plús y sinnum y. Nú til að koma í veg Flökt, og ég get sýnt þú hvað þetta er ef ég geri þetta ekki, ef fjarlægðin milli bendilinn og myndin Center er minna en fimm, Ég ætla bara ekki að fara að færa myndina. Annars höfum við sett hraða. Og við setjum það svo að hraða mun alltaf vera stöðug. Og hreinn af öllu þetta stærðfræði er að myndinni er að fara að færa til bendilinn. Nú kemur í ljós að SDL_GetMouseState, auk þess að setja á x og y rök hér, það skilar líka int sem svarar við stöðu mús hnappur. Þannig að við getum ekki lesið það beint, en við getum nota þessar Fjölvi, einn Bita rekstraraðila, ekki það skelfilegur, bara Bita og. Svo við segjum hnappa, sem er afleiðing af SDL_GetMouseState okkar, ef það og Bita og þetta þjóðhagsleg hér SDL_BUTTON_LEFT. Þannig að þetta er að fara að einfaldlega leysa til bitmap sem svarar til vinstri músarhnappi að þrýsta. Og svo ef Bita og á sér stað og það er ekki núll, sem þýðir að vinstri hnappinn ýtt, þá erum við í raun að fara að hrekja bæði x og y er hraði, sem mun bara gera myndina Runaway. Uppfæra stöðu. Árekstrar mælst, séð það allt áður, flutningur, allt í lagi. Við skulum gera það. Svo þú fékkst að SRCS = hello7_mouse.c. Great. Engar villur. Og leikur. Svo hér er ég með músina mína. Og myndin er örugglega elta músina mína. Nú, í leik sem þú gerir, kannski þetta er eins og óvinurinn elta litla staf eða hvað. En hér höfum við mynd elta músina. Og þegar ég smelli, músin byrjar að elta myndina og myndin er hlaupandi í burtu frá mús. Svo er það laglegur kaldur. Og takið eftir aftur, það er enn árekstur uppgötvun hér. Svo er að endanleg lítið kynningu sem ég hef sett upp hér. Og við skulum taka a líta á eitt í viðbót. Svo aftur hingað, ég nefndi þetta Flökt. Allt í lagi. Svo ef fjarlægðin er minni en fimm punktar, Ég var að setja x og y hraða á núll. Hvað gerist ef við losna við það? Þannig að ég ætla bara að gera þetta. Afsakaðu þessa Ingibjörg H. Sveinbjörnsdóttir Skelfilegar stíl, en við athugasemd út rétt númer. Þannig að ég ætla að fara að spara það og gera Sama stjórn frá áður til að gera það. Allt í lagi. Og nú hvað gerist? Good. Við erum enn að fylgja mús bara eins og áður, en þegar við komum á mús, við höfum fengið þessa brúttó Flökt. Hvað er að gerast þarna? Jæja, í vektor okkar stærðfræði, man við vorum taka fjarlægð milli bendilinn og miðju myndarinnar? Jæja, eins og það nálgast 0, við byrjum að fá eins þessa tegund af brjálaður hegðun þar sem myndin er eins konar eins sveiflandi um bendilinn. Og það er að búa til þessa Flökt. Og það er virkilega ljót. Og þú sennilega ekki vilt leikjum að gera það, nema það er einhvers konar sérstakt gildi. Svo er það hvers vegna við höfum bara þetta handahófskennt skera burt af fimm punkta, þar sem við segjum ef það er innan fimm punkta, við erum góð. Við þurfum ekki að færa myndina lengur. Svo er það sem er að gerast þar. Svo er það ansi mikið það. Þú veist nú hvernig á að búa til glugga, hlaða mynd, draga mynd í gluggann, fá hljómborð inntak, fá mús inntak, það er fullt af öðrum inntak sem þú myndir ekki vita hvernig á að fá ef þú eyðir bara Nokkrum mínútum að skoða skjöl. Svo þú ert í raun alveg Nokkrar verkfæri til ráðstöfunar til nú að skrifa fullt viðvaningur leik. Nú, hver leikur nauðsyn sumir hljóð, en hljóð gögn er líka mjög gott. Og ég er tilbúin að veðja að ef þú skiljir allt það við ræddum um í dag með myndir og yfirborð, gluggar og allt, þá vangaveltur út hljóð API er ekki að fara að vera svo slæmt. Svo ég hlakka til að sjá Hvað sem þú býrð með SDL.