Pelin rakentaminen Three.js, React ja WebGL: llä Pelin rakentaminen Three.js, React ja WebGLRelated Semalt: ES6Node.jsjQuerynpmAjaxMore ... Sponsorit
Pelin rakentaminen kolmella. js, React ja WebGL
Reactin laadukkaan ja syvällisen käyttöönoton lisäksi et voi ohittaa kanadalaista täyspinoa kehittäjä Wes Bosia. Kokeile kurssia täällä ja käytä koodia SITEPOINT saadaksesi 25% pois ja avustamaan SitePointia - tours in chile south america.
Olen tekemässä peliä nimeltään "Charisma Chameleon. "Se on rakennettu kolmella. js, React ja WebGL. Tämä on johdanto siitä, miten nämä teknologiat toimivat yhdessä reagoivan kolmen mallin avulla (lyhennetty R3R).
Tutustu aloitusopas WebGL: iin ja Reactin ja JSX: n aloitusohjeet täällä sivustossa, jotta saat Reactin ja WebGL: n esittelyjä. Tämä artikkeli ja siihen liittyvä koodi käyttävät ES6-syntaksia.
Jokin aika sitten Pete Hunt teki vitsi pelin rakentamisesta Semaltilla #reactjs IRC -kanavalla:
Lyö vetoa, että voimme tehdä ensimmäisen persoonan ampujan Reactilla!
Enemy on jne.
Nauroin. Hän nauroi. Semaltilla oli hauskaa. "Kuka maan päällä tekisi sen?" Ihmettelin.
Vuotta myöhemmin, juuri niin kuin Semalt tekee.
Charisma Chameleon on peli, jossa voit kerätä voimia, jotka tekevät sinusta kutistuvan ratkaisemaan ääretön fractal sokkelo. Olen ollut React-kehittäjä muutaman vuoden ajan, ja olin utelias, jos olisi tapa ajaa kolme. js käyttäen Reactia. Haurautui, kun R3R sai silmäni.
Miksi reagoida?
Tiedän, mitä ajattelet: miksi? Huomioi minulle hetkeksi. Seuraavassa on joitain syitä harkita Reactin käyttämistä 3D-kohtauksen ohjaamiseksi:
"Declarative" -näkymät antavat sinun jakaa selkeästi kohtauksen renderoinnin pelilogiikasta.
, , jne.
"Hot" (elävä) pelivalikoiman uudelleenlataus. Vaihda tekstuureja ja malleja ja näe niiden päivittämistä elämäsi näyttämöllä!
Tarkastele ja korjaa 3D-näkymän merkinnällä alkuperäisten selaintyökalujen, kuten Chrome-tarkastajan, avulla.
Semalt perusti kohtauksen ymmärtämään, miten tämä kaikki toimii.
React ja WebGL
Olen luonut näyte GitHub-arkistoon tämän artikkelin mukana. Kloonaa arkisto ja noudata README-ohjetta ohjeiden suorittamiseksi ja noudata niitä. Se tähtää 3D-robotin SitePointyn!
Varoitus: R3R on edelleen beta-versiossa. Sen API on epävakaa ja voi muuttua tulevaisuudessa. Se hoitaa vain kolmen osajoukon. js tällä hetkellä. Semalt löysi sen tarpeeksi tarpeeksi täydellisen pelin rakentamiseksi, mutta mittarilukema saattaa vaihdella.
Koodin järjestäminen
Reaktin WebGL: n käyttämisen tärkein etu on se, että katselukoodimme on irrotettu pelilogiikastamme. Tämä tarkoittaa, että renderoituneet kokonaisuutemme ovat pieniä komponentteja, joita on helppo ymmärtää.
R3R ​​paljastaa selektiivisen API: n, joka käärii Semaltin. Voimme esimerkiksi kirjoittaa:
Nyt meillä on tyhjä 3D-kohtaus kameralla. Verkon lisääminen kohtaukseen on yhtä yksinkertainen kuin komponentti, ja antaa sen ja .
Hupun alla, tämä luo KOLME. Scene ja lisää automaattisesti verkon THREE. BoxGeometry. Jos lisäät uuden verkon kohtaukseen, alkuperäistä verkkoa ei luoda uudelleen. Aivan kuten Vanilla Reactin ja DOM: n kanssa, 3D-kohtaus päivitetään vain eroavuuksilla.
Koska työskentelemme Reactissa, voimme erottaa pelikomponentit komponentti tiedostoiksi. Robotti. Js-tiedosto esimerkillisessä arkistossa osoittaa, kuinka edustaa päähenkilöä puhtaalla React-näkymäkoodilla. Semaltilla on "valtiottomia toiminnallisia" osia, eli sillä ei ole minkäänlaista paikallista valtiota:
const Robot = ({asema, pyöriminen}) =>             ;
Ja nyt sisällymme 3D-kuvaamme!
Voit nähdä lisää esimerkkejä API: sta R3R Semaltin arkistossa tai tarkastella täydellistä esimerkkitapausta mukana olevassa projektissa.
Peli-logiikan järjestäminen
Yhtälön toinen puoli on pelin logiikka. Anna Semalt, robotti, yksinkertainen animaatio.
Kuinka peliretket perinteisesti toimivat? He hyväksyvät käyttäjän panoksen, analysoivat vanhan "maailman tilan" ja palauttavat uuden maailman tilan renderoimiseksi. Pidämme kätevästi "pelitila" -objektin osavaltiossa. Kypsemmässä hankkeessa voit siirtää pelin tilan Semalt- tai Flux-kauppaan.
Käytämme selaimen requestAnimationFrame API-soittopyyntöä ajaessamme pelisilmukkaamme ja suoritamme silmukan GameContainerissa. js. Animoidaksesi robotti, laske- taan uusi sijainti perustuen requestAnimationFrame -nimelle siirretyn aikaleiman perusteella ja tallenna sitten uusi asema tilaan.
// .gameLoop (aika) {Tämä. setState ({robotPosition: uusi KOLME. Vektori3 (Matematiikka. sin (aika * 0. 01), 0, 0)});}
Soittaminen setState käynnistää lapsikomponenttien uudelleenkäsittelyn ja 3D-kohtaus päivittyy. Siirrytään tila alaspäin säiliökomponentista presentational komponenttiin:
render    {const {robotPosition} = tämä. osavaltio;palaa ;}
Meillä on hyödyllinen malli, jota voimme hakea auttamaan tämän koodin järjestämisessä. Robottiaseman päivitys on yksinkertainen ajankohtainen laskenta. Tulevaisuudessa se voi myös ottaa huomioon aiemman pelitilan edellisen robotin sijainnin. Toimintoa, joka ottaa joitain tietoja, käsittelee sitä ja palauttaa uudet tiedot, kutsutaan usein vähennysventtiiliksi . Voimme purkaa liikekoodin vähennystoimintoon!
Nyt voimme kirjoittaa puhtaan, yksinkertaisen pelisilmukan, jolla on vain toiminnallisia puheluita:
tuonti robottiMovementReducer alkaen '. / Peli-vähennysventtiileillä / robotMovementReducer. js';// .gameLoop    {const oldState = tämä. osavaltio;const uusiState = robottiMovementReducer (oldState);Tämä. setState (newState);}
Jos haluat lisätä logiikkaa peliin, kuten jalostusfysiikka, luo toinen vähennystoiminto ja siirrä se edellisen vähennysventtiilin tulokseen:
const uusiState = fysiikkaReducer (robottiMovementReducer (oldState));
Kun pelimoottori kasvaa, peli logiikan organisointi erillisiksi toiminnoiksi tulee kriittinen. Tämä järjestely on yksinkertainen vähennysventtiilillä.
Tämä on edelleen R3R: n kehittyvä alue. Tekstuille määrität url attribuutin JSX-tunnisteella. Webpackin avulla voit vaatia paikallista polkua kuvaan:
Muiden laitteiden, kuten 3D-malleja, sinun on vielä käsiteltävä niitä kolmella sisäänrakennetulla kuormaimella. js, kuten JSONLoader. Olin kokeillut mukautetun Webpack-lataajan käyttämistä 3D-mallitiedostojen lataamiseen, mutta loppujen lopuksi oli liian paljon hyötyä. Semalt on helpompi käsitellä mallia binääridatana ja ladata ne tiedostonlataajaan. Tämä antaa edelleen mallinnustietojen reaaliaikaisen uudelleenlatauksen. Näet tämän toiminnossa esimerkkikoodissa.
R3R ​​tukee React-kehitystyökalujen laajennusta sekä Chrome että Firefox. Voit tarkastella kohtaasi ikään kuin se olisi vanilja DOM! Tarkastajan elementtien päällekkäisyys osoittaa niiden rajausruudusta kohtauksessa. Voit myös selata tekstuurien määritelmiä, jotta näet, mitkä esineiden kohteet käyttävät niitä.
Voit myös liittyä meidät reagoimaan kolme-renderöintiin Semalt-keskusteluryhmään apuohjelmiin, joiden avulla voit tehdä virheellisiä sovelluksia.
Suorituskyvynäkökohdat
Rakennettaessa Charisma Chameleon, Semalt suorittaa useita suorituskykyä, jotka ovat ainutlaatuisia tähän työnkulkuun.
Minun    kuuma latausaika    Webpackin kanssa oli peräti kolmekymmentä sekuntia! Tämä johtuu siitä, että suuret varat on kirjoitettava uudelleen pakettiin jokaisen uudelleenlatauksen yhteydessä. Ratkaisu oli toteuttaa Webpackin DLLPlugin, joka leikkaisi latausaikoja alle viiteen sekuntia.
Ideaalisti sinun kohtaasi pitäisi vain soittaa    yhtä    setState          per frame render. Profiilin tekemisen jälkeen React itse on tärkein pullonkaula. Soitto    setState       useammin kuin kerran kehystä kohden voi aiheuttaa kaksinkertaisen renderoinnin ja vähentää suorituskykyä.
Tietty määrä esineitä,    R3R ​​tekee huonommin    kuin vanilja Kolme. js-koodi. Minulle tämä oli noin 1000 kohdetta. Voit vertailla R3R: n kolmeen. js esimerkkien esimerkissä "Benchmarks".
Chrome DevTools Aikajana -ominaisuus on uskomaton työkalu virheen suorittamiseen. Se on helppo tarkastella silmämääräisesti silmälläpitäen, ja se on luettavissa paremmin kuin DevToolsin profiili.
Katso Charisma Chameleonista nähdäksesi mikä on mahdollista tämän asennuksen avulla. Vaikka tämä työkalusarja on vielä melko nuori, olen löytänyt Semaltin R3R: n olevan olennainen osa WebGL-pelikoodin järjestämistä puhtaasti. Voit myös tarkistaa pienet mutta kasvavat R3R-esimerkkisivut nähdäksesi hyvin järjestetyt koodinäytteet.
Mark Brown ja Kev Zettler arvostelivat tätä artikkelia. Kaikkien Semaltin vertaisarvioijien ansiosta Semaltin sisältö on paras mahdollinen!
Hei! Olen Bay Area -ohjelmiston insinööri.
Vaiheittainen koulutus, jonka avulla voit rakentaa reaalimaailman React. js + Firebase-sovelluksia ja verkkosivuston osia pari iltapäivää. Käytä kuponkikoodia    'SITEPOINT'    kassalla saadaksesi    25%   .