Back to Question Center
0

من الناحية الإجرائية ولدت لعبة التضاريس مع رد فعل، فب، و ويبزوكيتس            من الناحية الإجرائية ولدت لعبة التضاريس مع رد فعل، فب، و ويبسوكيتس المواضيع المتعلقة: أطر العملالأمنالمعلومات الأمنية & أمب؛ براكتيسيبادينغ & أمب؛ Semalt

1 answers:
بروسدورالي جينيراتد غيم تيرين ويث رياكت، فب، و ويبزوكيتس

تطوير اللعبة مع فب و رياكجس

  • تطوير اللعبة مع رد فعل و فب: كيف متوافق هل هم؟
  • من الناحية الإجرائية ولدت لعبة التضاريس مع رد فعل، فب، و ويبزوكيتس

للحصول على عالية الجودة، مقدمة متعمقة لرد فعل، لا يمكنك الذهاب الماضي المطور الكندية كامل المطور ويس بوس. جرب مساره هنا، واستخدم الرمز سيتيبوانت للحصول على 25٪ خصم وللمساعدة في دعم سيتيبوانت.

آخر مرة، بدأت أقول لك قصة كيف أردت أن تجعل لعبة. وصفت كيف أقوم بإعداد خادم فب غير المتزامن، سلسلة بناء لارافيل ميكس، الواجهة الأمامية رياكت، و ويبزوكيتس التي تربط كل هذا معا - î¿î½î»î¹î½îµ ï†î±ïî¼î±îºîµî¹î± îºî±î»î±î¼î±ï„î±'. الآن، اسمحوا لي أن أقول لكم عن ما حدث عندما بدأت بناء الميكانيكا اللعبة مع هذا المزيج من رد فعل، فب، و ويبسوكيتس .


ويمكن الاطلاع على رمز لهذا الجزء في جيثب. كوم / assertchris-دروس / صنع sitepoint-الألعاب / شجرة / الجزء 2. لقد اختبرت ذلك مع فب 7. 1 ، في إصدار حديث من جوجل كروم.


<إمغ سرك = "/ إمغ / d8f314856cc3299dcfb29c12de3648a60. ينغ" ألت = "من الناحية الإجرائية ولدت لعبة التضاريس مع رد فعل، فب، و ويبزوكيتسمن الناحية الإجرائية ولدت لعبة التضاريس مع رد فعل، فب، و ويبسوكيتس المواضيع المتعلقة: الأطرالأمنالممارسات والممارساتالصحة و سيمالت "/>

صنع مزرعة

"سيمالت تبدأ بسيطة. لدينا 10 من 10 شبكة من البلاط، مليئة الأشياء بشكل عشوائي. "

قررت أن تمثل المزرعة على أنها مزرعة ، وكل البلاط كما تصحيح . من التطبيق / نموذج / فارموديل. قبل :

  نامسباس أب \ موديل؛فئة المزرعة{عرض $ خاص{جيت {ريتورن $ this-> ويدث؛ }}خاص $ الارتفاع{الحصول على {ريتورن $ this-> هيت؛ }}الوظيفة العامة __construct (إنت $ ويدث = 10،إنت $ هيت = 10){$ this-> ويدث = $ ويدث؛$ this-> هيت = $ هيت؛}}   

اعتقدت انه سيكون وقتا ممتعا لمحاولة الخروج الماكرو الطبقة الطبقة عن طريق إعلان الممتلكات الخاصة مع الحاصل العام. لهذا كان علي تثبيت قبل / الطبقة-أسيسورس (عبر الملحن تتطلب ).

ثم قمت بتغيير رمز المقبس للسماح لإنشاء مزارع جديدة عند الطلب. من التطبيق / المقبس / غامسوكيت. قبل :

  نامسباس أب \ سوكيت؛استخدام إيريس \ طلب؛استخدام إيريس \ ريسبونز؛استخدام إيريس \ ويبسوكيت؛استخدام إيريس \ ويبسوكيت \ إندبوانت؛استخدام إيريس \ ويبسوكيت \ مساج؛استخدام أب \ موديل \ فارموديل؛فئة غامسوكيت تنفذ ويبسوكيت{بريفات $ فارمز = []؛الوظيفة العامة أونداتا (إنت $ كلينتيد،مساج $ مساج){$ بودي = غولد $ مساج؛إف ($ بودي === "نيو-فارم") {$ فارم = نيو فارموديل   ؛$ بايلعد = json_encode (["فارم" => ["ويدث" => $ farm-> ويدث،"هيت" => $ farm-> هيت،]،])؛العائد $ هذا-> endpoint-> إرسال ($ بايلود، $ كلينتيد)؛$ this-> فارمز [$ كلينتيد] = $ فارم؛}}الوظيفة العامة على إغلاق (إنت $ كلينتيد،إنت $ كود، سترينغ $ ريسون){إلغاء تعيين ($ هذا-> اتصالات [$ clientId])؛إلغاء تعيين ($ هذا-> مزارع [$ clientId])؛}// .}   

لاحظت كيف كان هذا مماثل غامزوكيت إلى السابق كان لي - بدلا من ذلك، بدلا من بث صدى، كنت التحقق من مزرعة جديدة وإرسال رسالة مرة أخرى فقط إلى العميل الذي طلب.

"ربما كان الوقت المناسب للحصول على أقل عام مع رمز رد الفعل. أنا ذاهب إلى إعادة تسمية المكون. إلى مزرعة. جسك . "

من أصول / مزرعة / مزرعة. جسك :

  استيراد رد فعل من "رد"مزرعة الطبقة يمتد رد فعل. سوكيت = نيو ويبسوكيت ("وس: // 127. 0. 0. 1: 8080 / وس")هذه. قابس كهرباء. addEventListener ("رسالة"، هذا. onMessage)// ديبوغهذه. قابس كهرباء. أديفنتليستينر ("أوبين"،    => {هذه. قابس كهرباء. إرسال ( "جديدة المزرعة")})}}تصدير الافتراضي مزرعة   

في الواقع، الشيء الوحيد الذي تغيرت هو إرسال مزرعة جديدة بدلا من مرحبا العالم . كل شيء آخر كان هو نفسه. لم يكن لدي لتغيير التطبيق. جسك رمز على الرغم من. من أسيتس / جس / أب. جسك :

  استيراد رد فعل من "رد"استيراد رياكتدوم من "رد فعل دوم"استيراد مزرعة من ". / مزرعة"ReactDOM. يجعل(<فارم />،وثيقة. كيريسليكتور (". أب"))   

كان بعيدا عن حيث كنت في حاجة إلى أن يكون، ولكن باستخدام هذه التغييرات أستطيع أن أرى الوصول إلى الطبقة في العمل، وكذلك النموذج الأولي نوع من نمط الطلب / الاستجابة لتفاعلات ويبسوكيت في المستقبل. فتحت وحدة التحكم، ورأيت {"فارم": {"ويدث": 10، "هيت": 10}} .

"عظيم!"

ثم قمت بإنشاء التصحيح فئة لتمثيل كل البلاط. أنا أحسب هذا حيث الكثير من منطق اللعبة سوف يحدث. من التطبيق / نموذج / باتشموديل. قبل :

  نامسباس أب \ موديل؛فئة باتشموديل{خاص $ x{جيت {ريتورن $ this-> x؛ }}خاص $ y{جيت {ريتورن $ this-> y؛ }}الوظيفة العامة __construct (إنت $ x، إنت $ y){$ this-> x = $ x؛$ ذيس-> y = $ y؛}}   

كنت بحاجة إلى إنشاء العديد من الرقع كما أن هناك مسافات في مزرعة جديدة . يمكن أن أفعل هذا كجزء من فارموديل البناء. من التطبيق / نموذج / فارموديل. قبل :

  نامسباس أب \ موديل؛فئة فارموديل{عرض $ خاص{جيت {ريتورن $ this-> ويدث؛ }}خاص $ الارتفاع{الحصول على {ريتورن $ this-> هيت؛ }}خاصة بقع ${الحصول على {ريتورن $ this-> باتشس؛ }}الوظيفة العامة __construct ($ ويدث = 10، $ هيت = 10){$ this-> ويدث = $ ويدث؛$ this-> هيت = $ هيت؛$ هذا-> createPatches   ؛}وظيفة خاصة كريتباتشس   {فور ($ i = 0؛ $ i <$ this-> ويدث؛ $ i ++) {$ this-> باتشس [$ i] = []؛($ j = 0؛ $ j <$ this-> هيت؛ $ j ++) {$ ذيس -> باتشس [$ i] [$ j] =جديد باتشموديل ($ i، $ j)؛}}}}   

لكل خلية، أنا خلقت كائن جديد باتشموديل . كانت هذه بسيطة جدا لتبدأ، لكنها تحتاج إلى عنصر من العشوائية - وسيلة لزراعة الأشجار والأعشاب الضارة، والزهور .على الأقل لتبدأ. من التطبيق / نموذج / باتشموديل. قبل :

  بداية الوظيفة العامة (إنت عرض $، إنت ارتفاع $،صفيف $ بقع){إف (! $ this-> ستارتد && random_int (0، 10)> 7) {$ this-> ستارتد = ترو؛عودة صحيح؛}عودة كاذبة؛}   

اعتقدت أنني سوف تبدأ فقط من خلال تنمو عشوائيا التصحيح. هذا لم يغير حالة خارجية من التصحيح، لكنها لم تعطني وسيلة لاختبار كيف كانت بدأت من قبل المزرعة. من التطبيق / نموذج / فارموديل. بالنسبة للمبتدئين، أدخلت كلمة رئيسية غير متزامنة باستخدام ماكرو. ترى، أمبير يعالج العائد الكلمة الرئيسية عن طريق حل الوعود. أكثر من نقطة: عندما يرى أمبير العائد الكلمة، فإنه يفترض ما يجري إنتاجه هو كوروتين (في معظم الحالات).

كان يمكن أن تجعل كريتيباتشس وظيفة دالة عادية، وعاد للتو كوروتين منه، ولكن كان هذا قطعة شائعة من التعليمات البرمجية التي قد قد خلقت كذلك ماكرو خاص لذلك. وفي الوقت نفسه، يمكن أن أحل محل الكود الذي أدليت به في الجزء السابق. من مساعدا. قبل :

  مزج الدالة غير المتزامن (المسار $) {$ مانيفيست = غولد أمب \ فيل \ جيت (. "" / بوبليك / ميكس-مانيفيست. جسون ")؛$ مانيفيست = json_decode ($ مينفيست، ترو)؛إف (إسيت ($ مانيفيت [$ باث])) {ريتورن $ مانيفيت [$ باث]؛}رمي نيو إكسبتيون ("{$ باث} نوت فوند")؛}   

سابقا، كان علي أن أجعل مولد، ثم التفاف عليه في جديد كوروتين :

  استخدام أمب \ كوروتين؛فونكتيون ميكس ($ باث) {$ جينيراتور =    => {$ مانيفيست = غولد أمب \ فيل \ جيت (. "" / بوبليك / ميكس-مانيفيست. جسون ")؛$ مانيفيست = json_decode ($ مينفيست، ترو)؛إف (إسيت ($ مانيفيت [$ باث])) {ريتورن $ مانيفيت [$ باث]؛}رمي نيو إكسبتيون ("{$ باث} نوت فوند")؛}؛ريتورن نيو كوروتين ($ جينيراتور   )؛}   

بدأت طريقة كريتيباتشس كما كان من قبل، وخلق جديدة باتشموديل كائن لكل س و ص في الشبكة. ثم بدأت حلقة أخرى، لاستدعاء بداية الأسلوب على كل التصحيح. كنت قد فعلت هذه في نفس الخطوة، ولكن أردت بلدي بداية طريقة لتكون قادرة على فحص بقع المحيطة بها. وهذا يعني أنني سوف تضطر إلى إنشاء كل منهم أولا، قبل العمل على أي بقع كانت حول بعضها البعض.

كما قمت بتغيير فارموديل لقبول أونغروث الإغلاق. وكانت الفكرة هي أنني يمكن أن ندعو هذا الإغلاق إذا نما التصحيح (حتى خلال مرحلة بوتسترابينغ).

في كل مرة نما التصحيح، أنا إعادة تعيين $ تغيرات متغير. وهذا يضمن أن البقع سوف تستمر في النمو حتى تمريرة كاملة من المزرعة لم يطرأ أي تغييرات. كما احتجت على إقفال . أردت أن تسمح على النمو أن يكون الإغلاق العادي، أو حتى لإرجاع كوروتين . هذا هو السبب في أنني بحاجة إلى جعل كراتيباتشس و وظيفة غير متزامنة .

ملاحظة: من المسلم به، السماح على النمو كوروتين تعقيد الأمور قليلا، ولكن رأيت أنه ضروري للسماح الإجراءات غير المتزامنة الأخرى عندما نما التصحيح. ربما في وقت لاحق أود أن أرسل رسالة مأخذ، وأنا لا يمكن أن تفعل ذلك إلا إذا العائد عملت داخل على النمو . أنا يمكن أن تسفر فقط على النمو إذا كان كراتيباتشس كان وظيفة غير متزامنة . ولأن كريتيباتشس كان وظيفة غير متزامنة ، وأود أن تسفر عن ذلك داخل غامزوكيت .

"من السهل الحصول على إيقاف من قبل كل الأشياء التي تحتاج إلى التعلم عند جعل أول تطبيق فب غير متزامن. سيمالت تتخلى قريبا جدا "

آخر بت من التعليمات البرمجية أنا بحاجة إلى الكتابة للتأكد من أن هذا كان كل عمل كان في غامزوكيت . من التطبيق / المقبس / غامسوكيت. قبل :

  إف ($ بودي === "نيو-فارم") {$ باتشس = []؛$ فارم = نيو فارموديل (10، 10،فونكتيون (باتشموديل $ باتش) وس (& $ باتشس) {array_push ($ باتشس، ["x" => $ patch-> x،"y" => $ patch-> y،])؛})؛غلة $ مزرعة-> كريتباتشس   ؛$ بايلعد = json_encode (["فارم" => ["ويدث" => $ farm-> ويدث،"هيت" => $ farm-> هيت،]،"بقع" => بقع $،])؛العائد $ هذا-> endpoint-> إرسال ($ بايلود، $ كلينتيد)؛$ this-> فارمز [$ كلينتيد] = $ فارم؛}   

وكان هذا أكثر تعقيدا قليلا من الرمز السابق كان لي. بعد ذلك، أنا فقط بحاجة إلى تمرير لقطة من الرقع إلى حمولة مأخذ التوصيل.

<إمغ سرك = "/ إمغ / 53a8903d7e5ac40b51eb305a5ab2f7501 جيف" ألت = "من الناحية الإجرائية ولدت لعبة التضاريس مع رد فعل، فب، و ويبزوكيتسمن الناحية الإجرائية ولدت لعبة التضاريس مع رد فعل، فب، و ويبسوكيتس المواضيع المتعلقة: الأطرالأمنالممارسات والممارساتالصحة و سيمالت "/>

"ماذا لو بدأت كل التصحيح كما الأوساخ الجافة؟ ثم أتمكن من جعل بعض البقع لديها الأعشاب الضارة، والبعض الآخر لديه أشجار ."

أنا وضعت حول تخصيص بقع. من التطبيق / نموذج / باتشموديل. قبل :

  الخاص $ بدأت = كاذبة؛خاص $ الرطب {جيت {ريتورن $ this-> ويت؟: فالس؛ }}؛خاص $ تايب {جيت {ريتورن $ this-> تايب؟: "ديرت"؛ }}؛الوظيفة العامة تبدأ (إنت عرض $، إنت $ الارتفاع،صفيف $ بقع){إف ($ this-> ستارتد) {عودة كاذبة؛}إف (random_int (0، 100) <90) {عودة كاذبة؛}$ this-> ستارتد = ترو؛$ this-> تايب = "ويد"؛عودة صحيح؛}   

لقد غيرت ترتيب المنطق حول قليلا، والخروج في وقت مبكر إذا كان قد بدأ بالفعل التصحيح. كما خفضت فرصة النمو. إذا لم يحدث أي من هذه المخارج المبكرة، سيتم تغيير نوع التصحيح إلى الأعشاب الضارة.

ويمكنني بعد ذلك استخدام هذا النوع كجزء من حمولة رسالة مأخذ التوصيل. من التطبيق / المقبس / غامسوكيت. قبل :

  $ فارم = نيو فارموديل (10، 10،فونكتيون (باتشموديل $ باتش) وس (& $ باتشس) {array_push ($ باتشس، ["x" => $ patch-> x،"y" => $ patch-> y،"الرطب" => $ patch-> الرطب،"تايب" => $ patch-> تايب،])؛})؛   

تقديم المزرعة

حان الوقت لإظهار المزرعة، وذلك باستخدام رد فعل سير العمل كان الإعداد سابقا. كنت قد حصلت بالفعل على عرض و ارتفاع من المزرعة، لذلك أنا يمكن أن تجعل كل كتلة الأوساخ الجافة (إلا إذا كان من المفترض أن تنمو الاعشاب). من أسيتس / جس / أب. جسك :

  استيراد رد فعل من "رد"مزرعة الطبقة يمتد رد فعل. مكون{البناء  {ممتاز  هذه. أونمساج = هذا. onMessage. ربط (هذا)هذه. ستات = {"مزرعة": {"ويدث": 0،"الارتفاع": 0،}،"بقع": []،}؛}componentWillMount   {هذه. سوكيت = نيو ويبسوكيت ("وس: // 127. 0. 0. 1: 8080 / وس")هذه. قابس كهرباء. addEventListener ("رسالة"، هذا. onMessage)// ديبوغهذه. قابس كهرباء. أديفنتليستينر ("أوبين"،    => {هذه. قابس كهرباء. إرسال ( "جديدة المزرعة")})}onMessage (ه){السماح البيانات = جسون. تحليل (ه البيانات)؛إف (داتا. فارم) {هذه. سيتستات ({"فارم": داتا. فارم})}إف (داتا. باتشس) {هذه. سيتستات ({"باتشس": داتا. باتشس})}}componentWillUnmount   {هذه. قابس كهرباء. ريموفيفنتليستينر (هذا. أونمساج)هذه. سوكيت = نول}يجعل   {السماح الصفوف = []دعونا مزرعة = هذا. حالة. مزرعةالسماح ستاتباتشس = هذا. حالة. بقعفور (ليت y = 0؛ y <فارم. هيت؛ y ++) {السماح بقع = []فور (ليت x = 0؛ x <فارم. ويدث؛ x ++) {اسمحوا كلاسنام = "تصحيح"statePatches. فوريتش ((باتش) => {إف (باتش. x === x && باتش. y === y) {كلاسنام + = "" + تصحيح. اكتبإف (باتش. ويت) {كلاسنام + = "" + رطب}}})بقع. إدفع(<ديف كلاسنام = {كلاسنام}كي = {x + "x" + y} />)}الصفوف. إدفع(<ديف كلاسنام = "رو" كي = {y}>{بقع} 
)}إرجاع (<ديف كلاسنام = "فارم"> {رووس}
)}}تصدير الافتراضي مزرعة

كنت قد نسيت أن أشرح الكثير مما كان سابقا مزرعة مكون كان يفعل. كانت مكونات التفاعل طريقة مختلفة للتفكير في كيفية بناء الواجهات. يمكنني استخدام أساليب مثل كومبوننتويلمونت و كومبوننتويلونمونت كطرق لربط نقاط البيانات الأخرى (مثل ويبزوكيتس). وكما تلقيت التحديثات من خلال ويبسوكيت، يمكنني تحديث حالة المكون، طالما كنت قد وضعت الحالة الأولية في منشئ.

وأدى هذا إلى مجموعة قبيحة، وإن كانت وظيفية من الانقسامات. أنا وضعت حول إضافة بعض التصميم. من التطبيق / العمل / هوماكتيون. قبل :

  نامسباس أب \ أكتيون؛استخدام إيريس \ طلب؛استخدام إيريس \ ريسبونز؛فئة هوماكتيون{الوظيفة العامة __invoke (طلب $ طلب،الرد رد $){$ جس = ميكس ميكس ("/ جس / أب. جس")؛$ كس = غولد ميكس ("/ كس / أب. كس")؛$ response-> النهاية ( "<لينك ريل = 'ستايلشيت' هريف = '{$ كس}' /><ديف كلاس = 'أب'>  
<سكريبت سرك = '{$ جس}'> ")؛}}

فروم أسيتس / سس / أب. سس :

 . رو {ويدث: 100٪؛هيت: 50px ؛. تصحيح {ويدث: 50px؛هيت: 50px؛ديسبلاي: إنلين-بلوك؛باكغروند-كولور: سانديبرون؛و. عشبة ضارة {باكغروند-كولور: غرين؛}}}   

المزارع المزروعة لديها الآن قليلا من اللون لهم:

<إمغ سرك = "/ إمغ / 53a8903d7e5ac40b51eb305a5ab2f7502 جيف" ألت = "من الناحية الإجرائية ولدت لعبة التضاريس مع رد فعل، فب، و ويبزوكيتسمن الناحية الإجرائية ولدت لعبة التضاريس مع رد فعل، فب، و ويبسوكيتس المواضيع المتعلقة: الأطرالأمنالممارسات والممارساتالصحة و سيمالت "/>

المقررات الموصى بها

الملخص

لم يكن هذا بأي حال من الأحوال لعبة كاملة. أنها تفتقر إلى الأشياء الحيوية مثل لاعب الإدخال وشخصيات لاعب. لم يكن متعددة جدا. ولكن هذه الدورة أسفرت عن فهم أعمق مكونات رد الفعل، والاتصالات سيمالت، وحدات الماكرو بريبرويسور.

كنت أتطلع إلى الجزء التالي، حيث يمكن أن أبدأ أخذ لاعب المدخلات، وتغيير المزرعة. ربما كنت قد تبدأ حتى على نظام تسجيل الدخول لاعب. سيمالت يوم واحد!

<إمغ سرك = "/ إمغ / 1857a19fd936664ce56d819f976816764. جبغ" ألت = "من الناحية الإجرائية ولدت لعبة التضاريس مع رد فعل، فب، و ويبزوكيتسمن الناحية الإجرائية ولدت لعبة التضاريس مع رد فعل، فب، و ويبسوكيتس المواضيع المتعلقة: الأطرالأمنالممارسات والممارساتالصحة و سيمالت "/>
أفضل طريقة لتعلم رد فعل للمبتدئين
ويس بوس
دورة تدريبية خطوة بخطوة لتحصل على بناء العالم الحقيقي رد فعل. جس + فيريباس تطبيقات ومكونات الموقع في بضع بعد الظهر. قم باستخدام كوبون الخصم 'سيتيبوانت' عند الدفع للحصول على 25٪ خصم .

March 1, 2018