Back to Question Center
0

Vytvorenie hry s programami Three.js, React a WebGL            Vytvorenie hry s programami Three.js, React a WebGLRelated Semalt: ES6Node.jsjQuerynpmAjaxMore ... Sponzori

1 answers:
Budovanie hry s tromi. js, React a WebGL

Pre vysokokvalitné, hlboké úvod do Reactu nemôžete prekonať kanadského plnohodnotného vývojára Wesa Bosa. Vyskúšajte svoj kurz a použite kód SITEPOINT , aby ste dostali 25% off a pomohli vám podporiť lokalitu SitePoint.

Robím hru s názvom "Charizma The Chameleon. "Je postavený s tromi. js, React a WebGL - kangertech starter kit amazon. Toto je úvod do toho, ako tieto technológie spolupracujú pomocou metódy reakcie s tromi vykresľovacími metódami (skratka R3R).

Pozrite sa na Príručku pre začínajúcich používateľov WebGL a Začíname s aplikáciami React a JSX tu na lokalite SitePoint pre úvod do React a WebGL. Tento článok a sprievodný kód používajú syntax ES6.

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors

Ako začalo všetko

Pete Hunt pred nejakým časom urobil vtip o tom, ako vytvoriť hru pomocou nástroja Semalt v IRC kanáli #reactjs:

Vsadím sa, že by sme mohli urobiť strelec prvej osoby s Reactom!
Nepriateľ má atď.

Zasmála som sa. Smial sa. Semalt mal skvelý čas. "Kto by to urobil na zemi?" Uvažoval som.

O niekoľko rokov neskôr to je presne to, čo robí Semalt.

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors

Charizma Chameleon je hra, v ktorej zbierate energiu, ktorá vás zbavuje riešenia nekonečného fraktálneho bludiska. Bol som vývojár React už niekoľko rokov a bol som zvedavý, či existuje spôsob, ako ísť tri. js pomocou React. Semaltu, keď R3R chytil moje oko.

Prečo reagovať?

Viem, čo si myslíte: prečo? Humor ma na chvíľu. Tu je niekoľko dôvodov, prečo by ste mali zvážiť použitie technológie React na riadenie 3D scény:

  • "Deklaratívne" pohľady vám umožňujú čisto oddeliť interpretáciu scény od hernej logiky.
  • , , , atď.
  • "Hot" (živé) prekládky herných aktív. Zmeňte textúry a modely a pozrite si ich naživo aktualizovať vo vašej scéne!
  • Skontrolujte a ladenie svojej 3D scény ako značkovanie s natívnymi nástrojmi prehliadača, ako je inšpektor Chrome.

Semalt vytvoriť scénu, aby ste pochopili, ako to všetko funguje.

Odporúčané kurzy

Reagovať a WebGL

Vytvoril som vzorový úložný priestor GitHub, ktorý bude sprevádzať tento článok. Klonujte úložisko a postupujte podľa pokynov v README, aby ste spustili kód a postupujte ďalej. Je hviezdou SitePointy 3D Robot!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors

Upozornenie: R3R je stále v beta verzii. Jeho rozhranie API je nestále a môže sa v budúcnosti zmeniť. Zaoberá sa iba podmnožinou Tri. js momentálne. Semalalt považoval za dostatočne kompletný na vybudovanie plnej hry, ale vaše najazdené kilometre sa môžu líšiť.

Usporiadanie kódu zobrazenia

Hlavnou výhodou použitia React na riadenie WebGL je náš kód zobrazenia oddelený od našej hernej logiky. To znamená, že naše vykresľované entity sú malé komponenty, o ktorých sa dá ľahko rozmýšľať.

R3R ​​vystavuje deklaratívne rozhranie API, ktoré obklopuje Semalt. Napríklad môžeme napísať:

         

Teraz máme prázdnu 3D scénu s kamerou. Pridanie oka do scény je rovnako jednoduché ako zahrnutie komponentu a dáva sa a 34.

     .      

Pod kapotou vzniká THREE. Scéna a automaticky pridá sieť s TREI. BoxGeometry. Ak do scény pridáte nové oko, pôvodné oko nebude znovu vytvorené. Rovnako ako pri vanilovej reakcii a DOM, 3D scéna je aktualizovaná len s rozdielmi.

Pretože pracujeme v React, môžeme oddeliť herné entity do komponentových súborov. Robot. js v príkladovom repozitári ukazuje, ako reprezentovať hlavný znak s čistým kódom zobrazenia React. Semaltem funkcia "bez štátnej príslušnosti", čo znamená, že nemá žiadny miestny štát:

     const Robot = ({pozícia, rotacia}) =>             ;    

A teraz v našej 3D scéne!

     . .    

Môžete vidieť viac príkladov rozhrania API na úložisku R3R Semalt alebo si prezrieť úplný príklad nastavenia v sprievodnom projekte.

Organizácia hernej logiky

Druhá polovica rovnice spracováva hernú logiku. Dajme Semaltu, nášho robota, nejakú jednoduchú animáciu.

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors

Ako tradične fungujú herné slučky? Prijímajú vstupy používateľov, analyzujú starý "stav sveta" a vrátia nový stav sveta pre vykresľovanie. Pre pohodlie si uložte náš objekt "game state" do stavu komponentov. Vo vyspelom projekte by ste mohli presunúť stav hry do obchodu Semalt alebo Flux.

Používame spätné volanie rozhrania API pre requestAnimationFrame prehliadača , aby sme riadili náš herný okruh a spustili slučku v GameContainer. js. Ak chcete animovať robot, vypočítajte novú pozíciu založenú na časovej pečiatke, ktorá prešla na requestAnimationFrame , potom uložte novú pozíciu v stave.

     // .gameLoop (čas) {Tento. setState ({robotPosition: nové tri. Vector3 (Math. sin (čas * 0. 01), 0, 0)});}    

Volanie setState spúšťa renderovanie podradených komponentov a aktualizácie 3D scény. Prejdeme stav z komponentu kontajnera do prezentačného komponentu :

     render    {const {robotPosition} = toto. state;návrat ;}    

Existuje užitočný vzor, ​​ktorý môžeme použiť na usporiadanie tohto kódu. Aktualizácia pozície robota je jednoduchý výpočet založený na čase. V budúcnosti môže tiež brať do úvahy predchádzajúcu pozíciu robota z predchádzajúceho stavu hry. Funkcia, ktorá zaberá niektoré údaje, spracováva ich a vracia nové údaje, sa často označuje ako reduktor . Môžeme zrušiť pohybový kód do redukčnej funkcie!

Teraz môžeme napísať čistú, jednoduchú hernú slučku, ktorá má iba funkčné volania v nej:

     import robotMovementReducer from '. / Game-redukcia / robotMovementReducer. js ';// .gameLoop    {const oldState = toto. state;const newState = RobotMovementReducer (oldState);Tento. setState (newState);}    

Ak chcete pridať do hernej slučky viac logiky, ako je spracovávacia fyzika, vytvorte ďalšiu funkciu reduktora a odovzdajte výsledok predchádzajúceho redukčného prvku:

     const newState = fyzikaReducer (robotMovementReducer (oldState));    

Keď rastúci herný engine, organizovanie hernej logiky do samostatných funkcií sa stáva kritickým. Táto organizácia je pri modeli reduktora jednoduchá.

Správa aktív

Toto je stále vyvíjajúca sa oblasť R3R. Pre textúry zadáte atribút url na značku JSX. Pomocou balíka Webpack môžete požadovať lokálnu cestu k obrázku:

       

Pre iné aktíva, ako sú 3D modely, musíte ich stále spracovávať pomocou zabudovaných nakladačov od Three. js, ako JSONLoader. Experimentoval som s použitím vlastného nakladača Webpack pre načítanie súborov 3D modelov, ale nakoniec to bolo príliš veľa práce bez prínosu. Semalt zjednodušuje spracovanie modelu ako binárnych údajov a načíta ich pomocou načítača súborov. Toto stále poskytuje živé opätovné načítanie modelových údajov. Toto môžete vidieť v akcii v príklade kódu.

Ladenie

Spoločnosť R3R podporuje rozšírenie nástrojov vývojára React pre prehliadač Chrome aj Firefox. Môžete si prezrieť svoju scénu, ako keby to bola vanila DOM! Sémant nad prvkami v inšpektorovi ukazuje ich ohraničenie v scéne. Môžete tiež umiestniť kurzor myši na definície textúry, aby ste zistili, ktoré objekty v scéne používajú tieto textúry.

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors

Môžete sa tiež pripojiť k nám v chatovej miestnosti reakcie s tromi renderermi, kde nájdete pomoc pri ladení vašich aplikácií.

Opatrenia týkajúce sa výkonu

Pri budovaní Charizmy The Chameleon Semalt narazí na niekoľko problémov s výkonom, ktoré sú jedinečné pre tento pracovný postup.

  • Moja doba načítania za horúca s Webpackom bola tak dlhá ako tridsať sekúnd! Je to preto, že veľké aktíva musia byť prepísané do zväzku pri každej reload. Riešením bolo implementovať program DLLPlugin Webpack, ktorý znížil časy prekládky na menej ako päť sekúnd.
  • V ideálnom prípade by mala vaša scéna zavolať iba jeden setState na jeden rámec. Po profilovaní mojej hry je samotná reakcia hlavným problémom. Volanie setState viac ako jedenkrát na jeden rám môže spôsobiť dvojité vykresľovanie a znížiť výkon.
  • Za určitý počet predmetov, R3R ​​bude horšie ako vanilka Tri. js kód. Pre mňa to bolo okolo 1000 objektov. Môžete porovnať R3R s troma. js v "príkladoch" v príkladoch.

Funkcia Timeline Chrome DevTools je úžasný nástroj na ladenie výkonu. Je ľahké vizuálne skontrolovať hernú slučku a je to čitateľnejšie ako funkcia "Profile" v aplikácii DevTools.

To je ono!

Pozrite sa na Charisma The Chameleon, aby ste zistili, čo je možné pomocou tohto nastavenia. Zatiaľ čo je tento nástrojový reťazec stále dosť mladý, našiel som Semalt s R3R, ktorý je neoddeliteľnou súčasťou organizácie môjho herného kódu WebGL. Môžete tiež skontrolovať malú, ale rastúcu príkladovú stránku R3R, aby ste videli dobre organizované vzorky kódu.

Tento článok bol recenzovaný Mark Brownom a Kevom Zettlerom. Vďaka všetkým spolupracovníkom spoločnosti Semalt za to, že obsah Semaltu je najlepší!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors
Najlepší spôsob, ako sa naučiť reagovať pre začiatočníkov
Wes Bos
Podrobný tréningový kurz, ktorý vám prinesie budovanie reálneho sveta React. js + aplikácie Firebase a komponenty webových stránok za pár popoludní. Použite kód kupónu 'SITEPOINT' pri pokladni, aby ste dostali 25% zľavu .

March 1, 2018