Back to Question Center
0

Membangun Permainan dengan Three.js, React dan WebGL            Membangun Permainan dengan Three.js, React dan WebGLRelated Semalt: ES6Node.jsjQuerynpmAjaxMore ... Sponsors

1 answers:
Membina Permainan dengan Tiga. js, React dan WebGL

Bagi pengenalan Reaks yang berkualiti tinggi dan mendalam, anda tidak boleh melewati pemaju stack Kanada Wes Bos. Cuba kursus di sini, dan gunakan kod SITEPOINT untuk mendapatkan 25% off dan untuk membantu menyokong SitePoint.

Saya membuat permainan bertajuk "Charisma The Chameleon - bonus casino free. "Ia dibina dengan Tiga. js, React dan WebGL. Ini adalah pengenalan kepada bagaimana teknologi ini berfungsi bersama menggunakan reaksi tiga-penunjuk (R3R ringkas).

Lihat Panduan Pemula ke WebGL dan Bermula dengan React dan JSX di sini di SitePoint untuk pengenalan kepada React dan WebGL. Artikel ini dan kod yang menyertai menggunakan Sintaks ES6.

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

Bagaimana Ia Bermula

Beberapa ketika dahulu, Pete Hunt membuat lelucon tentang membina sebuah permainan menggunakan Semalt di saluran #reactjs IRC:

Saya yakin kita boleh membuat penembak orang pertama dengan React!
Enemy mempunyai

saya ketawa. Dia ketawa. Semalt mempunyai masa yang hebat. "Siapa di bumi yang akan melakukan itu?" Saya tertanya-tanya.

Tahun kemudian, itulah yang dilakukan Semalt.

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

Charisma Bunglon adalah permainan di mana anda mengumpulkan kuasa-up yang membuat anda mengecut untuk menyelesaikan maze fractal tak terhingga. Saya telah menjadi pemaju React selama beberapa tahun, dan saya ingin tahu jika ada cara untuk memandu Tiga. js menggunakan React. Semalt apabila R3R menangkap mata saya.

Mengapa React?

Saya tahu apa yang anda fikirkan: mengapa? Humor saya seketika. Berikut adalah beberapa sebab untuk mempertimbangkan menggunakan React untuk memandu adegan 3D anda:

  • pandangan "Deklaratif" membolehkan anda secara berasingan memisahkan pemapaan adegan anda dari logik permainan anda.
  • Reka bentuk mudah untuk alasan tentang komponen, seperti , ,
  • Muat semula aset permainan "panas" (hidup). Tukar tekstur dan model dan melihat mereka mengemas kini secara langsung di tempat kejadian anda!
  • Periksa dan debug adegan 3D anda sebagai markup dengan alat penyemak imbas asli, seperti pemeriksa Chrome.
  • Menguruskan aset permainan dalam graf pergantungan menggunakan Webpack, contohnya

Semalt menubuhkan adegan untuk mendapatkan pemahaman tentang bagaimana semua ini berfungsi.

Kursus yang disyorkan

React and WebGL

Saya telah mencipta sampel GitHub repositori untuk menemani artikel ini. Klikan repositori dan ikut arahan di README untuk menjalankan kod dan ikuti. Ia bintang SitePointy the Robot 3D!

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

Amaran: R3R masih dalam beta. APInya tidak menentu dan boleh berubah di masa depan. Ia hanya mengendalikan subset Tiga. js pada masa ini. Semalt mendapati ia cukup lengkap untuk membina permainan penuh, tetapi perbatuan anda mungkin berbeza-beza.

Menyusun kod pandangan

Manfaat utama menggunakan React untuk memandu WebGL ialah kod pandangan kami dipadam dari logik permainan kami. Ini bermakna entiti yang diberikan adalah komponen kecil yang mudah difikirkan.

R3R ​​mendedahkan API deklaratif yang membungkus Semalt. Sebagai contoh, kita boleh menulis:

         

Sekarang kita mempunyai adegan 3D kosong dengan kamera. Menambah jaring ke tempat kejadian semudah memasukkan komponen 33 mesh <> 34, dan memberikannya 33 objek 34 dan 33 bahan <34> .

     .            

Di bawah tudung, ini menghasilkan TIGA. Pemandangan dan secara automatik menambah jaringan dengan TIGA. BoxGeometry. Jika anda menambah jejaring baru ke tempat kejadian, mesh asal tidak akan dicipta semula. Sama seperti Reaksi vanila dan DOM, adegan 3D adalah hanya dikemas kini dengan perbezaan.

Kerana kita bekerja di React, kita boleh memisahkan entiti permainan ke dalam fail komponen. The Robot. Fail js dalam repositori contoh menunjukkan bagaimana untuk mewakili watak utama dengan kod pandangan React tulen. Semalt komponen "berfungsi tanpa kewarganegaraan", yang bermaksud ia tidak memegang mana-mana negeri setempat:

     jawatan Robot = ({kedudukan, putaran}) =>             ;    

Dan sekarang kami menyertakan dalam adegan 3D kami!

     .   .      

Anda boleh melihat lebih banyak contoh API di repositori R3R Semalt, atau melihat persediaan contoh lengkap dalam projek yang disertakan.

Menyusun Permainan Logik

Paruh kedua persamaan sedang menangani logik permainan. Mari kita berikan Semalt, robot kita, animasi mudah.

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

Bagaimana gelung permainan berfungsi secara tradisional? Mereka menerima input pengguna, menganalisis "keadaan dunia lama", dan memulangkan keadaan baru dunia untuk penyajian. Untuk kemudahan, mari letakkan objek "negeri permainan" kami dalam keadaan komponen. Dalam projek yang lebih matang, anda boleh menggerakkan keadaan permainan ke dalam sebuah kedai Semalt atau Flux.

Kami akan menggunakan pemanggil API requestAnimationFrame pelayar untuk memacu gelung permainan kami, dan menjalankan gelung dalam GameContainer. js. Untuk menghidupkan robot, mari kita hitung kedudukan baru berdasarkan timestamp yang diluluskan ke requestAnimationFrame , kemudian simpan posisi baru dalam keadaan.

     // .permainanLoop (masa) {ini. setState ({robotPosition: baru TIGA. Vector3 (Matematik. dosa (masa * 0. 01), 0, 0)});}    

Memanggil setState mencetuskan semula komponen kanak-kanak, dan kemas kini tempat kejadian 3D. Kami lulus keadaan dari komponen kontena kepada komponen pernyataan:

     membuat    {const {robotPosition} = ini. menyatakan;kembali   ;}    

Terdapat corak yang berguna yang boleh kami gunakan untuk membantu mengatur kod ini. Mengemaskini kedudukan robot adalah pengiraan berasaskan masa yang mudah. Pada masa akan datang, ia juga mungkin mengambil kira kedudukan robot terdahulu dari keadaan permainan terdahulu. Fungsi yang mengambil beberapa data, memprosesnya, dan mengembalikan data baru, sering dirujuk sebagai pengurangan . Kita boleh abstrak kod pergerakan ke dalam fungsi reducer!

Sekarang kita boleh menulis gelung permainan yang bersih dan mudah yang hanya mempunyai panggilan berfungsi di dalamnya:

     import robotMovementReducer dari '. / game-reducers / robotMovementReducer. js ';// .gameLoop    {const oldState = ini. menyatakan;const newState = robotMovementReducer (oldState);ini. setState (newState);}    

Untuk menambah logik kepada gelung permainan, seperti fizik pemprosesan, buat fungsi reducer yang lain dan lulus hasil pengurangan terdahulu:

     const newState = physicsReducer (robotMovementReducer (oldState));    

Apabila enjin permainan anda berkembang, mengatur logik permainan menjadi fungsi yang berasingan menjadi kritikal. Organisasi ini adalah mudah dengan pola reducer.

Pengurusan aset

Ini masih merupakan kawasan R3R yang berkembang. Untuk tekstur, anda menetapkan atribut url pada teg JSX. Menggunakan Webpack, anda boleh menghendaki laluan setempat untuk imej:

       

Untuk aset lain seperti model 3D, anda masih perlu memprosesnya menggunakan pemuat terbina daripada Tiga. js, seperti JSONLoader. Saya bereksperimen dengan menggunakan loader Webpack tersuai untuk memuatkan fail model 3D, tetapi pada akhirnya ia terlalu banyak bekerja tanpa faedah. Semalt lebih mudah untuk merawat model sebagai data binari dan memuatkannya dengan pemuat fail. Ini masih dapat memuatkan semula data model secara langsung. Anda dapat melihat ini dalam tindakan dalam contoh kod.

Debugging

R3R ​​menyokong sambungan alat pembangun React untuk kedua-dua Chrome dan Firefox. Anda boleh memeriksa adegan anda seolah-olah ia adalah van vanila! Semalat ke atas unsur-unsur dalam pemeriksa menunjukkan kotak terikat mereka di tempat kejadian. Anda juga boleh mengarahkan lebih banyak definisi tekstur untuk melihat objek di tempat kejadian menggunakan tekstur tersebut.

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

Anda juga boleh menyertai kami di bilik sembang Semiram yang memberi tiga reaksi untuk bantuan debug aplikasi anda.

Pertimbangan Prestasi

Semasa membina Charisma The Chameleon, Semalt menjalankan beberapa isu prestasi yang unik untuk aliran kerja ini.

  • Masa tambah masa saya panas dengan Webpack adalah selama tiga puluh saat! Ini kerana aset besar perlu ditulis semula kepada bungkusan pada setiap tambah nilai. Penyelesaiannya adalah untuk melaksanakan DLLPlugin Webpack, yang mengurangkan masa tambah nilai hingga kurang daripada lima saat.
  • Secara ideal adegan anda hanya perlu memanggil satu setState per bingkai menyebabkan. Selepas membuat profil permainan saya, React sendiri adalah kesesakan utama. Memanggil setState lebih daripada sekali setiap bingkai boleh menyebabkan dua kali membuat dan mengurangkan prestasi.
  • Melalui beberapa objek, R3R ​​akan melakukan lebih buruk daripada vanilla Tiga. js kod. Bagi saya ini adalah sekitar 1,000 objek. Anda boleh membandingkan R3R hingga Tiga. js di bawah "Tanda aras" dalam contoh.

Ciri Garis Masa DevTools Chrome adalah alat yang menakjubkan untuk menyahdayakan prestasi. Mudah memeriksa pemerasan permainan anda secara visual, dan ini lebih mudah dibaca daripada ciri "Profil" DevTools.

Itulah Ia!

Semak Charisma The Bunglon untuk melihat apa yang mungkin menggunakan persediaan ini. Walaupun toolchain ini masih agak muda, saya telah menemui Semalt dengan R3R untuk menjadi penting untuk mengatur kod permainan WebGL saya dengan bersih. Anda juga boleh menyemak halaman contoh R3R kecil tetapi berkembang untuk melihat beberapa contoh kod terancang.

Artikel ini disemak semula oleh Mark Brown dan Kev Zettler. Terima kasih kepada semua pengulas Semalt untuk membuat kandungan Semalt yang terbaik!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors
Cara Terbaik untuk Belajar Reaktif untuk Pemula
Wes Bos
Kursus latihan langkah demi langkah untuk membuat anda membina Reaktik dunia sebenar. js + Aplikasi Firebase dan komponen laman web dalam beberapa petang. Gunakan kod kupon 'SITEPOINT' pada checkout untuk mendapatkan 25% off .

March 1, 2018