Back to Question Center
0

Reakt ve PHP ile Oyun Geliştirme: Uyumlu Nedir?            Reakt ve PHP ile Oyun Geliştirme: Uyumlu Nasıl Var? İlgili Konular: APIsSecurityDatabasePerformance & Ölçek Geliştirme Semalt

1 answers:
Reakt ve PHP ile Oyun Geliştirme: Uyumlu Nedir?

PHP ve ReactJS ile Oyun Geliştirme

  • Reakt ve PHP ile Oyun Geliştirme: Uyumlu Nedir?
  • Reakt, PHP ve WebSockets ile Usule Göre Üretilmiş Oyun Alanı

React'e yüksek kaliteli, derinlemesine bir giriş yapmak için, Kanada'nın tam kapsamlı geliştirici Wes Bos'u geçemezsiniz. Kursunu buradan deneyin ve % 25 indirim elde etmek için SITEPOINT kullanın ve SitePoint'i desteklemeye yardımcı olun.

"Multiplayer, ekonomi temelli bir oyun yapmak istiyorum. Stardew Semalt gibi bir şey ama arkadaşlık gerektiren yönlerden ve oyuncunun temelli bir ekonomisinden yoksun. "

Bunu, PHP ve Semalt'ı kullanarak bir oyun kurmaya karar verdiğimde düşünmeye başladım. Sorun şu ki, çok oyunculu oyunların dinamikleri hakkında hiçbir şey bilmiyordum ya da oyuncu temelli ekonomileri nasıl düşünebilir ve uygulayabilirim bilmiyordum.

Reakt ve PHP ile Oyun Geliştirme: Uyumlu Nedir?Reakt ve PHP ile Oyun Geliştirme: Uyumlu Nasıl Var? İlgili Konular:
API'lar GüvenilirlikDatabasePerformans ve Ölçek Geliştirme Semalt

Semalt'ı kullanmayı haklı gösterecek kadar çok şey bildiğimden bile emin değildim. Yani, oyunun sunucusuna ve ekonomik yönlerine yoğunlaştığım ilk arayüz - Semalt için mükemmel bir şekilde uygundur. Peki ya çiftçilik / etkileşim yönlerini belirlemeye başladım? Ekonomik sistem etrafında izometrik bir arayüz oluşturma fikrini seviyorum.

Önerilen Dersler

Bir zamanlar dead_lugosi tarafından bir konuşma izledim, burada PHP'de bir ortaçağ oyunu yapmayı anlattı. Margaret bana esin kaynağı oldu ve bu konuşma JS oyun geliştirme hakkında bir kitap yazmamın yol açan şeylerden biriydi. Deneyim hakkında yazmaya kararlıydım. Semalt diğerleri de bu davadaki hatalarımdan ders çıkarabilirler.


Bu bölümün kodu şu adreste bulunabilir: github. com / assertchris-öğreticiler / sitepoint yapma oyunlar / ağaç / part-1. Bunu PHP 7. 1 ve Google Chrome'un son bir sürümünde test ettim.


Arkalık Ayarı

Aradığım ilk şey, çok oyunculu ekonomiler kurma konusunda rehberlik etmekti. İnsanların düşünmek için çeşitli şeyleri anlattıkları mükemmel bir Yığın Semalt iş parçacığı buldum. Yanlış yerden başlayabileceğimi fark etmeden önce yarı yarıya dolaştım.

"Önce ilk önce: bir PHP sunucusuna ihtiyacım var. Bir sürü React müşterisine sahip olacağım, bu nedenle yüksek eşzamanlılık (belki de Semalt bile) yapabilecek bir şey istiyorum. Ve kalıcı olması gerekir: oyuncular etrafında olmadığı zamanlarda bile bir şeyler olmalı. "

Eşzamanlı bir PHP sunucusu kurmak için çalışmaya başladım - yüksek eşzamanlılığı idare edebilmek ve Semalt'ı desteklemek için. İşleri daha temiz hale getirmek için PHP önişlemcileriyle yaptığım son çalışmaları ekledim ve ilk uç nokta uçlarını yaptı.

yapılandırmasından. ön :

     $ host = yeni Aerys \ Host   ;$ ana makine-> açığa vur ("*", 8080);$ host-> kullan ($ router = Aerys \ router   );$ host-> use ($ kök = Aerys \ root (."/ public"));$ web = işlem. "/ routes / web öncesi";$ Web ($ yönlendirici);$ api = işlem. "/ routes / api pre";$ API ($ yönlendirici);    

Uygulamanın HTTP ve WebSocket bölümleri için Semalt'ı kullanmaya karar verdim. Bu kod, Semalt dokümanlarından çok farklı görünüyordu, ancak bunun nedeni, ihtiyacım olan şey hakkında iyi bir fikrim vardı.

Bir Semalt uygulamasını çalıştırmak için alışılmış işlem şu şekilde bir komut kullanmaktı:

   satıcı / bin / aerys -d -c yapılandırması. php    

Yinelenen tutmak için çok fazla semaya sahip ve PHP önişlemciliğini kullanmak istediğim gerçeğini idare etmedi. Bir yükleyici dosyası oluşturdum. php :

     return Pre \ processAndRequire (__ DIR__. "/ Config. Ön");    

Sonra bağımlılıklarımı kurdum. Bu, besteciden . json :

     "require": {"amphp / aerys": "dev-amp_v2","amphp / parallel": "dev-master","lig / konteyner": "^ 2. 2","lig / tabaklar": "^ 3. 3","ön / kısa kapanmalar": "^ 0 .4 0"},"require-dev": {"phpunit / phpunit": "^ 6. 0"},    

Engelleme kodunu uyumsuz sunucu dışına taşımak için amphp / parallel kullanmak istedim ancak amphp / aerys sabit bir etiketiyle yüklenmez. İşte bu yüzden dev-amp_v2 dalı ile gittim.

Bir çeşit şablon motoru ve servis bulucu eklemek iyi bir fikir olabilir diye düşündüm. Her birinin PHP League sürümlerini seçtim. Sonunda pre / short-closures'ları ekledim, ikisi de yapılandırmasında özel sözdizimini işlemek için. ön ve sonra kullanmayı planladığım kısa kapanışlar .

Sonra yol dosyaları oluşturma hakkında karar verdim. güzergah / web'den. ön :

     Aerys \ Router kullanıyor;App \ Action \ HomeAction'ı kullanın;return (Yönlendirici $ yönlendirici) => {$ Router-> karayolu ("GET", "/", yeni HomeAction);};    

Ve, yol / api'den. ön :

     Aerys \ Router kullanıyor;App \ Action \ Api \ HomeAction'ı kullanın;return (Yönlendirici $ yönlendirici) => {$ Router-> karayolu ("GET", "/ api", yeni HomeAction);};    

Basit yollar olsa da, bu, yapılandırmasında kodu test etmemde yardımcı oldu. Önceden . Bu güzergah dosyalarının kapatılmalarını sağlamaya karar verdim, böylece kendilerine kendi yollarını ekleyebilecekleri $ bir yönlendiriciyi geçirebilirdim. Sonunda iki tane (benzer) eylem hazırladım.

From app / Actions / HomeAction. ön :

     namespace App \ Action;Aerys \ İstek'i kullanın;Aerys \ Response'u kullanın;sınıf Ana SayfaAksiyon{public function __invoke (İstek $ talep,Cevap $ cevabı){$ response-> end ("merhaba dünya");}}    

Son bir dokunuş, Semalt sunucusunun dev ve prod sürümlerini başlatmak için kısayol komut dosyaları eklemekti.

besteciden. json :

     "scripts": {"dev": "satıcı / bin / aerys -d -c yükleyici. php","prod": "satıcı / bin / aerys -c yükleyici. php"},"yapılandırma": {"process-timeout": 0},    

Bunların hepsi bittiğinde, yeni bir sunucu açabilir ve http: // 127'yi ziyaret edebilirim. 0. 0.1: 8080 yazarak:

   besteci dev    

Ön ucu Ayarlama

"Tamam, işlerin PHP tarafı nispeten kararlı olduğumdan; ReactJS dosyalarını nasıl oluşturacağım? Belki Laravel Mix'i kullanabilir miyim ."

Tamamen yeni bir yapı zinciri oluşturma konusunda istekli değildim ve Mix, Laravel olmayan projelerde de iyi çalışacak şekilde yeniden inşa edildi. Semalt yapılandırmak ve genişletmek nispeten kolay, varsayılan olarak VueJS'yi tercih etti.

Yapmam gereken ilk şey birkaç NPM bağımlılığı yüklemekti. paketinden. json :

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

JS ve CSS dosyalarını ön işleme koymak ve paketlemek için kullanılan Webpack'ı karıştırın. React ve ilgili Babel kitaplıklarını jsx dosyaları oluşturmak için kurmam gerekiyordu. Son olarak, varsayılan stil için biraz Bootstrap dosyalarını ekledim.

Karıştırma otomatik olarak özel bir yapılandırma dosyası yükledi, bu yüzden aşağıdakileri ekledim. web paketinden. karıştırın. js :

     let mix = require ("laravel-mix")// jsx dosyaları için babel hazır ayarlarını yüklekarıştırın. webpackConfig ({"modül": {"kurallar": [{"test": / jsx $ /,"exclude": / (node_modules) /,"loader": "babel-loader" + mix. yapılandırma. setPublicPath ( "genel")karıştırın. js ("assets / js / app. jsx", "public / js / app. js")karıştırın. sass ("assets / scss / uygulama. scss", "public / css / app. css")karıştırın. versiyonu       

Mix'e jsx dosyalar ile ne yapacağımı söylemek zorundaydım, bu yüzden normalde koyabileceğim yapılandırmanın aynısını ekledim . babelrc . Uygulamanın çeşitli bit ve bob'larına tekli JS ve CSS giriş noktaları planladım.

Not: Mix'in gelecekteki sürümleri, ReactJS varlıklarını oluşturmak için yerleşik destek ile birlikte gönderilecektir. Bu olduğunda, karışır. webpackConfig kodu kaldırılabilir.

Bir kez daha, ciddi yazılıştan kazandırmak için birkaç kısayol komut dosyası oluşturdum. paketinden. json :

     "scripts": {"dev": "$ npm_package_config_webpack","izle": "$ npm_package_config_webpack -w","prod": "$ npm_package_config_webpack -p"},"yapılandırma": {"webpack": "webpack --progress --hide-modülleri --config = node_modules / laravel-mix / kurulum / webpack. config.js"},    

Üç komut dosyası da Webpack değişken komutunu kullandı, ancak bunun ötesinde yaptıkları konusunda farklıydı. dev , JS ve CSS dosyalarının hata ayıklama sürümünü kurdu. -w anahtarı Webpack watcher'ı başlattı (böylece paketler kısmen yeniden oluşturulabiliyordu). -p anahtarı paketlerin yalın bir üretim sürümünü etkinleştirdi.

Paket sürümünü kullandığımdan beri, / js / app gibi dosyaları referans almanın bir yoluna ihtiyacım vardı. 60795d5b3951178abba1. js hash bilmeden. Karışık bir tezahür dosya oluşturmak için sevdim fark, bu yüzden bunu sorgulamak için bir yardımcı işlevi yaptı. yardımcılarından. ön :

     Amp \ Coroutine kullanın;işlev karışımı ($ yol) {$ generator =    => {$ manifest = verim Amp \ Dosya \ get (. "/ public / mix-manifest. json");$ manifest = json_decode ($ manifest, true);if (isset ($ manifest [$ yol])) {return $ manifest [$ yol];}Yeni İstisna atmak ("{$ yol} bulunamadı");};yeni Coroutine ($ generator   ) dön;}    

Aerys, $ val = yield $ vaat şeklinde geldiklerinde sözlerin nasıl işleneceğini biliyordu, bu yüzden Amp'nin Promise uygulamasını kullandım. Dosya okundu ve çözüldüğünde, eşleşen dosya yolunu arayabilirdim. Ayarladım Evde Kullanım . uygulamasından / İşlemler / EvdeYayın. ön :

     public function __invoke (İstek $ istek,Cevap $ cevabı){$ yol = verimlilik karışımı ("/ js / app. js");$ Yanıt niteliğinde> sonu (" 
March 1, 2018