Back to Question Center
0

प्रतिक्रियात्मक, पीएपी, आणि वेबसॉकेटसह प्रोक्रिअरीरीली जनरेटेड गेम टेरेन            प्रतिक्रियात्मक, पीएपी, आणि वेबसॉकेटसह प्रोक्युअरेरिकली जनरेटेड गेम टेरेन: संबंधित विषय: फ्रेमवर्क्स APIS सुरक्षापेटर्ने आणि & आचरण डिबगिंग & मिमल

1 answers:
प्रतिक्रियात्मक, पीएचपी आणि वेबसकेट सह प्रक्रियात्मक तयार केलेले भूमीचे भाग

पीएचपी आणि रिएक्टजेएस सह गेम डेव्हलपमेंट

  • प्रतिक्रिया आणि PHP सह गेम डेव्हलपमेंट: ते किती सुसंगत आहेत?
  • रिऍक्ट, पीएचपी, आणि वेबसकेट्स सह प्रक्रियात्मक तयार केलेले प्लेन

उच्च दर्जाच्या, प्रतिक्रिया देण्यासाठी सखोल परिचय, आपण कॅनेडियन पूर्ण-स्टॅक विकसक वेस बॉसच्या आधी जाऊ शकत नाही. येथे आपला कोर्स वापरून पहा आणि कोड वापरा SITEPOINT मिळविण्यासाठी 25% बंद आणि साइटपॉईंटस मदत करण्यास मदत करण्यासाठी

मागील वेळी, मी तुम्हाला गेम बनवायचा होता याबद्दलची गोष्ट सांगू लागली. मी वर्णन केले आहे की मी एसिंक PHP सर्व्हर कसे तयार करतो, Laravel मिक्स बिल्ड साखळी, रिचाईब फ्रंट फ्रंट आणि WebSockets एकत्रित करते. आता, मी तुम्हाला या प्रक्रियेच्या रिएक्ट, पीएचपी, आणि वेबसॉकेट्ससह गेम यांत्रिकी तयार करण्यास सुरुवात केली तेव्हा काय घडले याबद्दल मला सांगू .


या भागाचा कोड जिथूबवर आढळू शकतो - casino bonus sans depot coupon redeem for cookie. com / assertchris-tutorials / sitepoint-making-games / tree / part-2 मी PHP 7 सह चाचणी केली आहे. 1 , Google Chrome च्या अलीकडील आवृत्तीत


प्रतिक्रियात्मक, पीएपी, आणि वेबसॉकेटसह प्रोक्रिअरीरीली जनरेटेड गेम टेरेनप्रतिक्रियात्मक, पीएपी, आणि वेबसॉकेटसह प्रोक्युअरेरिकली जनरेटेड गेम टेरेन: संबंधित विषय:
फ्रेमवर्क्स APIS सुरक्षापानाचे आणि आचरण डीबगिंग आणि सेमील्ट

शेती करणे

"Semaltेट सुरू करणे सोपे आहे. यादृच्छिकरित्या व्युत्पन्न केलेली सामग्रीसह आपल्याजवळ 10 बाय 10 ग्रीड टाइल्स आहेत. "

मी शेत शेत आणि प्रत्येक टाइल म्हणून पॅच म्हणून प्रतिनिधित्व करण्याचा निर्णय घेतला. कडून अनुप्रयोग / मॉडेल / फार्ममोडेल पूर्व :

     नेमस्पेस अॅप \ मॉडेल;वर्ग फार्म{खाजगी $ रुंदी{परत करा $ this-> रूंदी; }}खाजगी $ उंची{रिटर्न $ this-> उंची; }}सार्वजनिक कार्य __construct (int $ width = 10,int $ height = 10){$ this-> रूंदी = $ रूंदी;$ the-> उंची = $ उंची;}}   (5 9) 

मी विचार केला की सार्वजनिक प्रवेशासह खाजगी मालमत्ते जाहीर करून वर्ग अभिलेख मैक्रो वापरून पाहण्याचा एक मजेदार वेळ असेल. त्यासाठी मी स्थापित केले होते प्री / क्लास-अॅक्सेसर्स (मार्गे कंप्यसर आवश्यक ).

त्यानंतर मी विनंती केल्यावर नवीन शेतात तयार होण्याची सोय सॉकेट कोड बदलली. कडून अनुप्रयोग / सॉकेट / गेमसॉकेट पूर्व :

     नेमस्पेस अॅप \ सॉकेट;Aerys \ विनंती वापरा;Aerys \ Response वापराAerys \ Websocket वापरा;Aerys \ Websocket \ समापनबिंदू वापरा;Aerys \ Websocket संदेश वापरा;अनुप्रयोग \ मॉडेल \ फार्ममोडेल वापरा;वर्ग गेमस्केट वापरण्याचे वेबस्केट{खाजगी $ शेतात = [];सार्वजनिक प्रकल्पावर डेटा (इंट $ clientId,$ संदेश संदेश{$ body = $ संदेश उत्पन्न करा;जर ($ body === "नवीन-शेत") {$ farm = नवीन फार्ममोडेल   ;$ payload = json_encode (["शेत" => ["रुंदी" => $ शेत-> रूंदी,"उंची" => $ शेत-> उंची,],]);उत्पन्न $ हे-> एंडपॉइंट-> पाठवा ($ पेलोड, $ clientId);$ this-> शेतात [$ clientId] = $ farm;}}सार्वजनिक कार्यावर बंद (int $ clientId,int $ कोड, स्ट्रिंग $ कारण){सेट न करता ($-> कनेक्शन [$ clientId]);अनसेट करा ($-> शेतात [$ clientId]);}// .}   (5 9) 

माझ्या लक्षात आले की हे गेमसॉकेट माझ्या आधीच्या एकाकडे होते - वगैरे, एक प्रतिध्वनी प्रसारित करण्याऐवजी, मी नवीन-शेत (7) वर तपासत होतो आणि एक संदेश परत पाठविला होता. विचारले होते त्या ग्राहकांना

"कदाचित हा रिएक्ट कोडसह कमी जेनेरिक मिळविण्यासाठी योग्य वेळ आहे. मी घटक पुनर्नामित करणार आहे जेएसएक्स ते शेत. जेएसएक्स "

मालमत्ता / जेएस / शेत पासून जेएसएक्स :

  (9 3) आयात "प्रतिक्रिया" पासून प्रतिक्रियावर्ग फॅक्टर प्रतिक्रिया वाढवितो. सॉकेट = नवीन वेबसॉकेट ("ws: // 127 0. 0. 1: 8080 / सेकंद")हे. सॉकेट addEventListener ("संदेश", हे. ऑन मेसेज)// DEBUGहे. सॉकेट addEventListener ("उघडा",    => {हे. सॉकेट पाठवा ("नवीन-शेत")})}}निर्यात डिफॉल्ट फार्म   (5 9) 

किंबहुना, मी बदललेली दुसरी गोष्ट हॅलो वर्ल्ड च्याऐवजी नवीन-शेत पाठवत होती. इतर सर्व काही समान होते. मला अॅप ​​बदलावा लागेल तथापि जेएसएक्स कोड. मालमत्ता / जेएस / अनुप्रयोग कडून जेएसएक्स :

  (9 3) आयात "प्रतिक्रिया" पासून प्रतिक्रिया"प्रतिक्रिया- dom" वरून प्रतिक्रियाप्रदर्शन करा". / शेत" वरून आयात कराप्रतिक्रिया नोंदवा प्रस्तुत करा ( <फार्म /> ,दस्तऐवज querySelector ("अनुप्रयोग"))   (5 9) 

मला ज्या ठिकाणी जाण्याची आवश्यकता होती त्या ठिकाणापासून लांब होता, परंतु हे बदल वापरून मी क्लास एक्सेसर्सला कृतीदेखील पाहू शकेन, तसेच भविष्यातील वेबसॅटिक परस्परसंवादासाठी विनंती / प्रतिसादाची नमुना ओळखली जाऊ शकते. मी कन्सोल उघडले आणि पाहिले {"farm": {"width": 10, "height": 10}} .

"ग्रेट!"

मग मी प्रत्येक टाइलचे प्रतिनिधित्व करण्यासाठी एक पॅच वर्ग तयार केला. मला असे वाटलं की हा खेळ खूपच तर्कपूर्ण होईल. कडून अनुप्रयोग / मॉडेल / पॅचमोडेल पूर्व :

     नेमस्पेस अॅप \ मॉडेल;क्लास पॅचमॉडेल{खाजगी $ x{मिळवा {रिटर्न $ या-> एक्स; }}खाजगी $ y{मिळवा {return $ this-> y; }}सार्वजनिक फंक्शन __ रचना (इंट $ x, int $ y){$ the-> x = $ x;$ this-> y = $ y;}}   (5 9) 

मला असे बरेच पॅचेस बनविण्याची आवश्यकता आहे कारण नवीन फार्ममध्ये जागा आहेत . मी फार्ममॉडेल बांधकाम म्हणून हे करू शकतो. कडून अनुप्रयोग / मॉडेल / फार्ममोडेल पूर्व :

     नेमस्पेस अॅप \ मॉडेल;वर्ग फार्ममॉडेल{खाजगी $ रुंदी{परत करा $ this-> रूंदी; }}खाजगी $ उंची{रिटर्न $ this-> उंची; }}खाजगी $ पॅचेस{परत करा $ this-> पॅचेस; }}सार्वजनिक कार्य __ रचना ($ width = 10, $ height = 10){$ this-> रूंदी = $ रूंदी;$ the-> उंची = $ उंची;$ the-> createPatches   ;}खाजगी फंक्शन createpatches   {साठी ($ i = 0; $ i  <$ this->  रूंदी; $ i ++) {$ this-> पॅचेस [$ i] = [];साठी ($ j = 0; $ j  <$ this->  उंची; $ j ++) {$ this-> पॅचेस [$ i] [$ j] =नवीन पॅचमॉडेल ($ i, $ j);}}}}   (5 9) 

प्रत्येक सेलसाठी, मी एक नवीन पॅच मॉडेल ऑब्जेक्ट तयार केला. हे सुरुवातीला अगदी सोपी होते, परंतु त्यांना यादृष्टीने एक घटक आवश्यक - झाड, तण, फुले वाढण्यास .आणि कमीतकमी सुरूवात करण्याचा मार्ग. कडून अनुप्रयोग / मॉडेल / पॅचमोडेल पूर्व :

     सार्वजनिक कार्य प्रारंभ (पूर्णांकाच्या $ रूंदी, int $ उंची,अॅरे $ पैचेस){जर ($ $- >- && random_int (0, 10)> 7) {$ this-> सुरु = सत्य;सत्य खरे;}खोटे परत;}   (5 9) 

मला वाटले की मी फक्त पॅच वाढवितो. यामुळे पॅचची बाह्य स्थिती बदलली नाही, परंतु हे मला शेतकराची सुरुवात कशी होते हे तपासण्याचा एक मार्ग दिला. कडून अनुप्रयोग / मॉडेल / फार्ममोडेल. सुरुवातीस मी एक एसिंक फंक्शन कीवर्ड मॅक्रोचा वापर करून सादर केला. आपण पाहता, एएमपी उत्पन्नाच्या शब्दांचे निराकरण करुन वचन हाताळते. बिंदू अधिक: जेव्हा एएमपी उपज कीवर्ड पाहतो, तेव्हा हे समजते की काय झाले आहे ते कॉरॉरिन (बहुतांश प्रकरणांमध्ये) आहे.

मी तयार पॉइंट्स एक सामान्य फंक्शन कार्यान्वित करू शकले असते आणि त्यातून एक कॉरॉरिन परतले असते, पण हे असे एक सामान्य कोड होते ज्यामुळे मी त्याच्यासाठी एक खास मॅक्रो तयार केला होता. त्याच वेळी, मी मागील भागात केलेले कोड पुनर्स्थित करू शकते. मदतनीस कडून पूर्व :

     एसिन्क फंक्शन मिक्स ($ पथ) {$ manifest = उत्पन्न एम्पी फाइल करा (". / public / mix-manifest. json");$ manifest = json_decode ($ मॅनिफेस्ट, सत्य);जर (isset ($ मॅनिफेस्ट [$ path])) {$ मॅनिफेस्ट [$ पाथ] परत करा;}नवीन अपवाद टाकून द्या ("{$ path} सापडला नाही");}   (5 9) 

पूर्वी, मला एक जनरेटर बनवायचे होते आणि मग ते एका नवीन कॉरॉटाइन :

     Amp \ Coroutine वापर;फंक्शन मिक्स ($ पथ) {$ जनरेटर =    => {$ manifest = उत्पन्न एम्पी फाइल करा (". / public / mix-manifest. json");$ manifest = json_decode ($ मॅनिफेस्ट, सत्य);जर (isset ($ मॅनिफेस्ट [$ path])) {$ मॅनिफेस्ट [$ पाथ] परत करा;}नवीन अपवाद टाकून द्या ("{$ path} सापडला नाही");};नवीन कॉरॉटाइन परत करा ($ जनरेटर   );}   (5 9) 

मी ग्रिडमध्ये प्रत्येक x आणि y साठी नवीन पॅचमोडेल ऑब्जेक्ट तयार करण्याच्या पटकने पद्धतीने पूर्वीप्रमाणेच सुरुवात केली. मग मी दुसर्या पळवाट सुरु केली, प्रत्येक पॅचवर प्रारंभ पद्धतीवर कॉल करण्यासाठी. मी हेच त्याच पध्दतीने केले असते, परंतु मी सुरवातीच्या पॅचेसची तपासणी करण्यासाठी पद्धत शोधू इच्छित होते याचा अर्थ असा होतो की मी पॅचेस एकमेकांच्या भोवताली पाहण्याआधी सर्वप्रथम त्यांना सर्व तयार करू इच्छित होतो.

मी देखील फार्ममॉडेल वर बदलण्यासाठी वेग वाढणे बंद करणे. कल्पना अशी होती की जर पॅच वाढली तर तो बंद होईल (बूटस्ट्रॅपिंग टप्प्यातही).

प्रत्येक वेळी पॅच वाढल्यावर मी $ बदल व्हेरिएबल रीसेट करते. यामुळे खेड्यांच्या संपूर्ण पासखेरीज कोणतेही बदल न होण्याआधी पॅच वाढतच राहतील. मी देखील ऑन ग्रोथ बंद करण्याचे आवाहन केले. मी ऑन ग्रॉथ हे सामान्य बंद करणे किंवा कॉरॉटाइन परत करण्याची परवानगी देणे आवश्यक होते. म्हणूनच मला तयार कराव्यापित करणे एसिंक कार्य करणे आवश्यक होते

टीप: कबूल आहे की onGrowth coroutines थोडा जटिल गोष्टी, परंतु मी एक पॅच वाढली तेव्हा इतर async क्रियांसाठी परवानगी म्हणून पाहिले. कदाचित नंतर मी एक सॉकेट संदेश पाठवू इच्छित आहे, आणि मी फक्त असे करू शकतो उत्पन्न onGrowth आत काम केले तर. मी onGrowth तर तयार पॅच एक async कार्य होते उत्पन्न करू शकते. आणि createpatches एक होते async कार्य, मी GameSocket आत ते उत्पन्न करणे आवश्यक आहे.

"एखाद्याचे प्रथम एसिंक PHP ऍप्लिकेशन बनविताना शिकण्याची गरज असलेल्या सर्व गोष्टी बंद करणे सोपे आहे. मिमल नंतर लगेच सोडले! "

हे शेवटचे कोड मी लिहिण्यासाठी लिहिलं होतं कारण हे सर्व काम करत होते GameSocket . कडून अनुप्रयोग / सॉकेट / गेमसॉकेट पूर्व :

     जर ($ body === "नवीन-शेत") {$ पॅचेस = [];$ farm = नवीन फार्ममोडेल (10, 10,फंक्शन (पॅचमोडेल $ पॅच) वापरा (& $ पॅचेस) {अॅरे_पश ($ पॅचेस, ["x" => $ पॅच-> एक्स,"y" => $ पॅच-> यु,]);});$ farm-> createPatches    द्या;$ payload = json_encode (["शेत" => ["रुंदी" => $ शेत-> रूंदी,"उंची" => $ शेत-> उंची,],"पॅचेस" => $ पॅच,]);उत्पन्न $ हे-> एंडपॉइंट-> पाठवा ($ पेलोड, $ clientId);$ this-> शेतात [$ clientId] = $ farm;}   (5 9) 

हे मागील कोडपेक्षा थोडा अधिक जटिल होता. त्यानंतर, मला सॉकेट पेलोडच्या पॅचेसचा स्नॅपशॉट द्यायची आवश्यकता होती.

प्रतिक्रियात्मक, पीएपी, आणि वेबसॉकेटसह प्रोक्रिअरीरीली जनरेटेड गेम टेरेनप्रतिक्रियात्मक, पीएपी, आणि वेबसॉकेटसह प्रोक्युअरेरिकली जनरेटेड गेम टेरेन: संबंधित विषय:
फ्रेमवर्क्स APIS सुरक्षापानाचे आणि आचरण डीबगिंग आणि सेमील्ट

"मी प्रत्येक पॅच कोरडे घाण म्हणून सुरू तर काय? मग मी काही खड्डे बुरशी आणू शकले आणि इतर झाडांना ."

मी पॅचेस अनुरूपण बद्दल सेट कडून अनुप्रयोग / मॉडेल / पॅचमोडेल पूर्व :

     खाजगी $ सुरु = खोटे;खाजगी $ ओले {परत मिळवा $ this-> ओले?: खोटे; }};खाजगी $ प्रकार {मिळवा {return $ this-> टाइप करा ?: "घाण"; }};सार्वजनिक कार्य प्रारंभ (पूर्णांकाच्या $ रूंदी, int $ उंची,अॅरे $ पैचेस){जर ($ the-> सुरू) {खोटे परत;}जर (random_int (0, 100)  <90) {खोटे परत;}$ this->  सुरु = सत्य;$ this-> प्रकार = "तण";सत्य खरे;}   (5 9) 

मी थोडक्यात तर्कशास्त्र क्रम बदलला, पॅच आधीपासूनच सुरू झाले असल्यास लवकर बाहेर पडत आहे. मी वाढीची शक्यता देखील कमी केली. जर यापैकी लवकर बाहेर पडले नाही तर, पॅच प्रकार बदलून तण करण्यात येईल.

मी या प्रकारचा सॉकेट संदेश पेलोडचा भाग म्हणून वापर करू शकतो. कडून अनुप्रयोग / सॉकेट / गेमसॉकेट पूर्व :

     $ farm = नवीन फार्ममोडेल (10, 10,फंक्शन (पॅचमोडेल $ पॅच) वापरा (& $ पॅचेस) {अॅरे_पश ($ पॅचेस, ["x" => $ पॅच-> एक्स,"y" => $ पॅच-> यु,"ओले" => $ पॅच-> ओले,"प्रकार" => $ पॅच-> प्रकार,]);});   (5 9) 

फार्म रेंडरिंग

मी पूर्वी सेट केलेल्या रीकफेक्ट वर्कफ्लोचा उपयोग करून शेत दर्शविण्याची वेळ होती. मला आधीच शेत रूंदीची आणि उंची मिळत होती, म्हणून मी प्रत्येक ब्लॉक कोरडे घाण (जोपर्यंत तो तण वाढू शकत नव्हता तोपर्यंत) करू शकतो. मालमत्ता / जेएस / अनुप्रयोग कडून जेएसएक्स :

  (9 3) आयात "प्रतिक्रिया" पासून प्रतिक्रियावर्ग फॅक्टर प्रतिक्रिया वाढवितो. घटक{कन्स्ट्रक्टर   {सुपर   हे. onMessage = हे ऑन मेसेज बांधणी (हा)हे. राज्य = {"शेत": {"रूंदी": 0,"उंची": 0,},"पॅचेस": [],};}घटकवॉलमाउंट   {हे. सॉकेट = नवीन वेबसॉकेट ("ws: // 127 0. 0. 1: 8080 / सेकंद")हे. सॉकेट addEventListener ("संदेश", हे. ऑन मेसेज)// DEBUGहे. सॉकेट addEventListener ("उघडा",    => {हे. सॉकेट पाठवा ("नवीन-शेत")})}ऑन मेसेज (ई){डेटा = JSON ला द्या पार्स (ई. डेटा);जर (डेटा फार्म) {हे. setState ({"farm": data farm})}तर (डेटा पॅच) {हे. setState ({"पॅचेस": डेटा. पॅचेस})}}घटकवॉलयूएनमाउंट   {हे. सॉकेट काढून टाका EventListener (हे. onMessage)हे. सॉकेट = नल}रेंडर करा    {पंक्ती द्या [=]शेतासाठी = हे. राज्य. शेतराज्यपेटी द्या = हे. राज्य. पॅचेससाठी (जाऊ द्या y = 0; y   {जर (पॅच x === x && पॅच. y === y) {className + = "" + पॅच प्रकारजर (पॅच ओले) {className + = "" + ओले}}})पॅचेस पुश ( 
)}पंक्ती पुश (
{पॅचेस}
)}परत (
{पंक्ती}
)}}निर्यात डिफॉल्ट फार्म
(5 9)

मी मागील फार्म घटक करत होते त्यापेक्षा जास्त माहिती देण्यास विसरले होते. प्रतिसाद घटक हे इंटरफेस कसे तयार करावे याबद्दल विचार करण्याचा भिन्न मार्ग होता. इतर डेटा पॉइंट्स (जसे की वेबसकेट्स) मध्ये हुक म्हणून मी घटकवॉलमाउंट आणि घटक वॉल्नमाउंट पद्धती वापरु शकतो आणि मला वेबसॉकेटद्वारे अद्यतने मिळाली म्हणून, मी घटकचे राज्य अद्ययावत करू शकते, जोपर्यंत मी कन्स्ट्रक्टरमध्ये प्रारंभिक स्थिती सेट केली होती.

फलस्वरूप दिवेचे फंक्शनल सेट असले तरी हे एक कुरुप होते. मी काही शैली जोडण्याविषयी सेट करतो. कडून अनुप्रयोग / क्रिया / HomeAction पूर्व :

     नेमस्पेस ऍप / अॅक्शन;Aerys \ विनंती वापरा;Aerys \ Response वापरावर्ग होम ऍक्शन{सार्वजनिक कार्य __इनवोक (विनंती $ विनंती,प्रतिसाद $ प्रतिसाद{$ js = उत्पन्न मिक्स ("/ जेएस / अॅप. जेएस");$ css = उपज मिक्स ("/ CSS / ऍप्लिकेशन सीएसएस");$ प्रतिसाद-> अंत ("   
March 1, 2018