Back to Question Center
0

Perkembangan Permainan dengan React dan PHP: Bagaimana Sesuaikan Mereka?            Pembangunan Permainan dengan React dan PHP: Bagaimana Sesuaikannya? Topik Berkaitan: APIsSecurityDatabasePerformance & ScalingDevelopment Semalt

1 answers:
Pembangunan Permainan dengan Reaktik dan PHP: Bagaimana Sesuaikan Mereka?

Pembangunan Permainan dengan PHP dan ReactJS

  • Pembangunan Permainan dengan React dan PHP: Bagaimana Sesuai Mereka?
  • Terrain Permainan Generatif dengan React, PHP, dan WebSockets

Untuk pengenalan mendalam yang berkualiti tinggi, untuk React, 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 ingin membuat permainan multiplayer, berasaskan ekonomi. Sesuatu seperti Stardew Semalt, tetapi dengan tidak ada aspek berkawan dan ekonomi berasaskan pemain. "

Saya mula berfikir tentang ini ketika saya memutuskan untuk mencuba dan membina permainan menggunakan PHP dan Semalt. Masalahnya ialah, saya tidak tahu tentang dinamika permainan berbilang pemain, atau bagaimana untuk memikirkan dan melaksanakan ekonomi berasaskan pemain.

Perkembangan Permainan dengan React dan PHP: Bagaimana Sesuaikan Mereka?Pembangunan Permainan dengan React dan PHP: Bagaimana Sesuaikannya? Topik Berkaitan:
APIsSecurityDatabasePerformance & ScalingDevelopment Semalt

Saya tidak pasti saya tahu cukup tentang Semalt untuk membenarkan menggunakannya. Maksud saya, antara muka awal - di mana saya memusatkan perhatian pada pelayan dan aspek ekonomi permainan - sangat sesuai untuk Semalt. Tetapi bagaimana pula apabila saya mula membuat aspek pertanian / interaksi? Saya suka idea membina antara muka isometrik di sekitar sistem ekonomi.

Kursus yang disyorkan

Saya pernah menonton perbincangan dengan dead_lugosi, di mana dia menyifatkan membina permainan zaman pertengahan di PHP. Margaret mengilhamkan saya, dan perbincangan itu adalah salah satu perkara yang menyebabkan saya menulis sebuah buku mengenai perkembangan permainan JS. Saya bertekad untuk menulis mengenai pengalaman saya. Semalt yang lain boleh belajar dari kesilapan saya dalam kes ini juga.


Kod untuk bahagian ini boleh didapati di: github. com / assertchris-tutorials / sitepoint-making-games / tree / part-1. Saya telah mengujinya dengan PHP 7. 1 dan dalam versi Google Chrome yang terkini.


Menetapkan Akhir Belakang

Perkara pertama yang saya cari adalah panduan untuk membina ekonomi berbilang pemain. Saya dapati thread Stack Semalt yang sangat baik di mana orang-orang menerangkan pelbagai perkara untuk difikirkan. Saya mendapat kira-kira separuh jalan sebelum menyedari saya mungkin telah bermula dari tempat yang salah.

"Perkara pertama dahulu: Saya memerlukan pelayan PHP. Saya akan mempunyai sekumpulan pelanggan React, jadi saya menginginkan sesuatu yang mampu berskala tinggi (mungkin juga Semalt). Dan ia perlu gigih: perkara mesti berlaku walaupun pemain tidak ada. "

Saya pergi ke kerja menubuhkan pelayan PHP async - untuk mengendalikan kesederhanaan yang tinggi dan menyokong Semalt. Saya menambah kerja baru-baru ini dengan preprocessor PHP untuk membuat perkara yang bersih, dan membuat beberapa titik akhir yang pertama.

Daripada konfigurasi. pra :

     $ host = new Aerys \ Host   ;$ host-> expose ("*", 8080);$ host-> use ($ router = Aerys \ router   );$ host-> use ($ root = Aerys \ root (. "" / public "));$ web = proses. "/ laluan / web pre";$ web ($ router);$ api = proses. "/ laluan / api pra";$ api ($ router);    

Saya memutuskan untuk menggunakan Semalt untuk bahagian permohonan HTTP dan WebSocket. Kod ini kelihatan sangat berbeza dari dokumen Semalt, tetapi itu kerana saya mempunyai idea yang baik tentang apa yang saya perlukan.

Proses biasa untuk menjalankan aplikasi Semalt adalah menggunakan perintah seperti ini:

   vendor / bin / aerys -d -c config. php    

Semalat banyak kod untuk terus mengulangi, dan ia tidak mengendalikan fakta bahawa saya ingin menggunakan PHP preprocessing. Saya mencipta fail loader. php :

     kembali Pra \ processAndRequire (__ DIR__. "/ Config pre");    

Saya kemudian memasang dependencies saya. Ini adalah dari komposer. json :

     "memerlukan": {"amphp / aerys": "dev-amp_v2","amphp / selari": "dev-master","liga / bekas": "^ 2. 2""liga / pinggan": "^ 3. 3","penutupan pra / pendek": "^ 0. 4. 0"},"memerlukan-dev": {"phpunit / phpunit": "^ 6.0"},    

Saya mahu menggunakan amphp / selari , untuk memindahkan kod menghalang daripada pelayan async, tetapi ia tidak akan dipasang dengan teg stabil amphp / aerys . Itulah sebabnya saya pergi dengan cawangan dev-amp_v2 .

Saya fikir ia adalah idea yang baik untuk memasukkan beberapa jenis enjin template dan pencari perkhidmatan. Saya memilih versi PHP League masing-masing. Akhirnya saya menambah pre / short-closures , kedua-duanya untuk mengendalikan sintaks tersuai dalam config . pra dan penutupan pendek yang saya merancang untuk menggunakan selepas .

Kemudian saya menetapkan membuat fail laluan. Dari laluan / web. pra :

     gunakan Aerys \ Router;gunakan App \ Action \ HomeAction;kembali (Router $ router) => {$ router-> laluan ("GET", "/", HomeAction baru);};    

Dan, dari laluan / api. pra :

     gunakan Aerys \ Router;gunakan App \ Action \ Api \ HomeAction;kembali (Router $ router) => {$ router-> laluan ("GET", "/ Api", HomeAction baharu);};    

Walaupun laluan mudah, ini membantu saya untuk menguji kod dalam konfigurasi. pra . Saya membuat keputusan untuk membuat laluan ini mengembalikan penutupan, jadi saya boleh menewaskan mereka dengan satu router $ , yang mana mereka boleh menambah laluan mereka sendiri. Akhirnya, saya membuat dua (serupa) tindakan.

Daripada aplikasi / Tindakan / HomeAction. pra :

     ruang nama Aplikasi \ Tindakan;gunakan Aerys \ Request;gunakan Aerys \ Response;homeAction kelas{fungsi awam __kuat (Permintaan permintaan $,Respons sambutan $){$ response-> end ("hello world");}}    

Satu sentuhan akhir adalah untuk menambah skrip jalan pintas, untuk melancarkan versi dev dan prod dari pelayan Semalt.

Daripada komposer. json :

     "skrip": {"dev": "vendor / bin / aerys -d -c loader php","prod": "vendor / bin / aerys -c loader php"},"config": {"masa tamat proses": 0},    

Dengan semua ini dilakukan, saya dapat berputar pelayan baru, dan melawat http: // 127. 0. 0: 1.8080 hanya dengan menaip:

   komposer dev    

Menetapkan Akhir Hadapan

"Ok, sekarang saya mempunyai sisi PHP perkara yang agak stabil; bagaimana saya akan membina fail ReactJS? Mungkin saya boleh menggunakan Laravel Mix . ? "

Saya tidak berminat untuk mewujudkan rantaian bina baru, dan Mix telah dibina semula untuk berfungsi dengan baik pada projek bukan Laravel juga. Semalt agak mudah untuk dikonfigurasi dan dilanjutkan, ia menyukai VueJS secara lalai.

Perkara pertama yang perlu saya lakukan adalah memasang beberapa kebergantungan NPM. Dari pakej. json :

     "ketergantungan": {"babel-preset-react": "^ 6 23. 0","bootstrap-sass": "^ 3. 3. 7","jquery": "^ 3. 1. 1","laravel-mix": "^ 0. 7. 5","bertindak balas": "^ 15. 4. 2","reaksi-dom": "^ 15. 4. 2","webpack": "^ 2. 2. 1"},    

Campurkan Webpack yang digunakan untuk memproses dan berkas fail JS dan CSS. Saya juga perlu memasang React dan Babel berkaitan perpustakaan untuk membina jsx fail. Akhirnya, saya menambah fail Bootstrap, untuk sedikit gaya lalai.

Campurkan secara automatik fail konfigurasi tersuai, jadi saya menambah yang berikut. Dari webpack. campurkan. js :

     mari campuran = memerlukan ("laravel-mix")/ // memuat pratetap babel untuk fail jsxcampurkan. webpackConfig ({"modul": {"peraturan": [{"ujian": / jsx $ /,"tidak termasuk": / (node_modules) /,"loader": "babel-loader" + campuran. config. setPublicPath ("awam")campurkan. js ("aset / js / aplikasi jsx", "awam / js / app js")campurkan. sass ("aset / scss / app scss", "awam / css / app css")campurkan. versi       

Saya perlu memberitahu Mix apa yang perlu dilakukan dengan fail jsx , jadi saya menambah jenis konfigurasi yang sama yang biasanya dimasukkan ke dalam . babelrc . Saya merancang untuk mempunyai titik kemasukan JS dan CSS tunggal ke dalam pelbagai bit aplikasi dan bobs.

Nota: Versi Mix masa depan akan dihantar dengan sokongan terbina dalam untuk membina aset ReactJS. Apabila itu berlaku, campuran . kod webpackConfig boleh dialih keluar.

Sekali lagi, saya membuat beberapa skrip pintasan, untuk menyelamatkan penaipan yang serius. Dari pakej. json :

     "skrip": {"dev": "$ npm_package_config_webpack","menonton": "$ npm_package_config_webpack -w","prod": "$ npm_package_config_webpack -p"},"config": {"webpack": "webpack --progress --hide-modules --config = node_modules / laravel-mix / setup / webpack config js"},    

Semua skrip tiga menggunakan arahan pemboleh ubah Webpack, tetapi mereka berbeza dengan apa yang mereka lakukan di luar itu. dev membina versi debug fail JS dan CSS. Suis -w memulakan pemerhati Webpack (supaya pakej boleh dibina semula sebahagiannya). Suis -p membolehkan versi pengeluaran tanpa lemak pada berkas.

Oleh kerana saya menggunakan versi penyuntingan, saya memerlukan satu cara untuk merujuk fail seperti / js / app. 60795d5b3951178abba1. js tanpa mengetahui hash. Saya perhatikan Mix suka mencipta fail nyata, jadi saya membuat fungsi penolong untuk bertanya. Dari pembantu. pra :

     menggunakan Amp \ Coroutine;campuran fungsi ($ path) {$ generator =    => {$ manifest = menghasilkan Amp \ File \ get (. "" / public / mix-manifest json ");$ manifest = json_decode ($ nyata, benar);jika (isset ($ nyata [$ path])) {kembali $ nyata [$ path];}buang Pengecualian baru ("{$ path} tidak dijumpai");};pulangkan Coroutine baru ($ generator   );}    

Aerys tahu bagaimana menangani janji-janji apabila mereka datang dalam bentuk $ val = hasil $ janji , jadi saya menggunakan pelaksanaan Janji Amp. Apabila fail dibaca dan diterangkan, saya boleh mencari jalan fail yang sepadan. Saya menyesuaikan HomeAction . Dari aplikasi / Tindakan / HomeAction. pra :

     fungsi awam __invoke (Permintaan permintaan $,Respons sambutan $){$ path = campuran hasil ("/ js / aplikasi js");$ response-> end (" 
March 1, 2018