Back to Question Center
0

ساخت بازی با Three.js، React و WebGL            ساخت یک بازی با Three.js، React و WebGLRelated Semalt: ES6Node.jsjQuerynpmAjaxMore ... حامیان

1 answers:
ساخت یک بازی با سه. js، React و WebGL

برای معرفی مقدماتی با کیفیت بالا، React، نمیتوانید از Wes Bos توسعهدهنده کامل پشته کانادایی شوید. سعی کنید در اینجا درس خود را، و از کد SITEPOINT برای دریافت 25٪ تخفیف و کمک به پشتیبانی از SitePoint استفاده کنید.

من یک بازی با عنوان "Charisma Chameleon. "این با سه ساخته شده است. js، React و WebGL - froika hyaluronic eye cream. این مقدمه ای است که چگونه این تکنولوژی ها با استفاده از واکنش دهنده سه رندر (به اختصار R3R) کار می کنند.

راهنمای راهنمای مبتدی برای WebGL و شروع به کار با React و JSX را در اینجا در SitePoint برای معرفی به React و WebGL بررسی کنید. این مقاله و کد همراه آن از نحو ES6 استفاده می کند.

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

چگونه همه شروع شد

بعضی وقت ها، پیت هانت یک شگفتی برای ساخت یک بازی با استفاده از Semalt در کانال #reactjs IRC ساخت:

شرط می بندیم که ما می توانیم تیرانداز اول شخص با React کنیم!
دشمن <سر /> <بدن> <لگ> و غیره

خندیدم او خندید. Semalt یک زمان عالی داشت. "چه کسی روی زمین این کار را می کند؟" من تعجب کردم.

چند سال بعد، این دقیقا همان چیزی است که Semalt انجام می دهد.

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

Charisma Chameleon بازی است که در آن شما جمع آوری قدرت یو پی اس را کاهش می دهد که شما را برای حل یک پیچ و خم فراکتال بی نهایت. من چند سال است که یک توسعه دهنده React شده ام و من در مورد سه راه رانندگی کنجکاو بودم. js با استفاده از React SEMALT هنگامی که R3R چشم من گرفتار شد.

چرا واکنش دهید؟

من می دانم که چه فکر می کنید: چرا؟ برای یک لحظه شاد باش در اینجا برخی از دلایل استفاده از React برای رانندگی صحنه 3D خود را در نظر بگیرید:

  • دیدگاههای "اعلامیه" به شما اجازه می دهد تا به راحتی رندر صحنه خود را از منطق بازی خود جدا کنید.
  • ، <سطح /> ، و غیره <طراح /> ، <دیوار /> ،
  • بارگیری "داغ" (زنده) از دارایی های بازی. تغییرات بافت و مدل و مشاهده آنها را به روز رسانی زنده در صحنه خود را!
  • صحنه 3D خود را به عنوان نشانه گذاری با ابزارهای مرورگر داخلی، مانند بازرس Chrome بررسی و تصحیح کنید.
  • مدیریت دارایی های بازی در یک گراف وابستگی با استفاده از Webpack، به عنوان مثال

Semalt یک صحنه ایجاد می کند تا درک کند که چگونه این همه کار می کند.

دوره های آموزشی

واکنش و WebGL

من یک مخزن GitHub نمونه برای همراهی این مقاله ایجاد کرده ام. کلون مخزن را دنبال کنید و دستورالعمل ها را در README دنبال کنید تا کد را اجرا کنید و به دنبال آن بروید. آن ستاره SitePointy ربات 3D است!

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

هشدار: R3R هنوز در بتا است. API آن بی ثبات است و ممکن است در آینده تغییر کند. این تنها یک زیر مجموعه از سه دسته را مدیریت می کند. جسی در حال حاضر Semalt دریافت آن را به اندازه کافی کامل برای ساخت یک بازی کامل، اما مسافت پیموده شده شما ممکن است متفاوت باشد.

سازماندهی کد نمایش

مزیت اصلی استفاده از React برای Drive WebGL کد ما است جدا شده از منطق بازی ما است. این بدان معنی است که اجزای ارائه شده ما اجزای کوچکی هستند که به راحتی قابل درک نیستند.

R3R ​​یک API declarative ارائه می دهد که Semalt را پیچیده می کند. به عنوان مثال، می توانیم بنویسیم:

     <صحنه>    

حالا ما یک صحنه 3D خالی با دوربین داریم. اضافه کردن یک مش به صحنه به همان اندازه ساده مولفه و دادن آن و است.

     <صحنه>.      

زیر کلاه، این سه برابر می شود. صحنه و به طور خودکار یک مش با THREE می افزاید. BoxGeometry. اگر یک mesh جدید را به صحنه اضافه کنید، mesh اصلی دوباره باز نخواهد شد. همانند وانیل React و DOM، صحنه 3D تنها با تفاوت ها به روز می شود.

از آنجا که ما در React کار می کنیم، می توانیم نهادهای بازی را به فایل های مولفه جدا کنیم. روبات. فایل JS در مخزن مثال نشان می دهد که چگونه برای نشان دادن شخصیت اصلی با کد نمایش React خالص. Semalt یکی از اجزای غیرقانونی است، به این معنی که هیچ دولت محلی را در اختیار ندارد

     const ربات = ({موقعیت، چرخش}) =>  <گروهposition = {position}چرخش = {چرخش}>           ؛    

و در حال حاضر ما <ربات /> در صحنه 3D ما را شامل می شود!

     <صحنه>. .  <رباتموقعیت = {. }چرخش = {. }/>    

شما می توانید نمونه های بیشتری از API را در مخزن R3R Semalt ببینید یا نمونه کامل نمونه در پروژه همراه را مشاهده کنید.

سازماندهی منطق بازی

نیمه دوم معادله، دست زدن به منطق بازی است. اجازه بدهید به Semalt، ربات ما، برخی از انیمیشن های ساده.

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

چگونه حلقه های بازی به طور سنتی کار می کنند؟ آنها ورودی کاربر را پذیرفته، «وضعیت جهان» قدیمی را تحلیل می کنند و وضعیت جدید جهان را برای رندر به ارمغان می آورند. برای راحتی، بیایید جسم "وضعیت بازی" ما را در حالت مولفه ذخیره کنیم. در یک پروژه بالغ تر، شما می توانید حالت بازی را به فروشگاه Semalt یا Flux منتقل کنید.

از API RequestAnimationFrame مرورگر برای رانندگی حلقه بازی ما استفاده میکنیم و حلقه را در GameContainer اجرا میکنیم. جسد برای تحریک روبات، یک موقعیت جدید براساس زمان بندی ارسال شده به requestAnimationFrame محاسبه کنیم، سپس موقعیت جدید را در حالت ذخیره کنیم.

     // .gameLoop (زمان) {این. setState ({robotPosition: THREE جدید. Vector3 (ریاضی. گناه (زمان 0. 01)، 0، 0)})؛}    

فراخوانی setState رندر مجدد اجزای کودک را به وجود می آورد و صحنه های 3D به روز می شود. ما حالت را از بخش کامپوننت به پارامتر Presentation منتقل میکنیم:

     رندر    {const {robotPosition} = این. حالت؛بازگشت  <بازیrobotPosition = {robotPosition}/> }    

یک الگوی مفید که ما میتوانیم برای کمک به سازماندهی این کد اعمال کنیم وجود دارد. به روز رسانی موقعیت ربات یک محاسبه مبتنی بر زمان ساده است. در آینده نیز ممکن است موقعیت ربات قبلی از وضعیت بازی قبلی را در نظر بگیرد. یک تابع که در برخی از داده ها به کار می رود، پردازش می کند و داده های جدید را به دست می گیرد، اغلب به عنوان یک کاهش دهنده نامیده می شود. ما می توانیم کد جنبش را به یک تابع ردیف انتزاعی تبدیل کنیم!

حالا می توانیم یک حلقه بازی ساده و ساده داشته باشیم که فقط تماس های تابع را در آن بنویسد:

     import robotMovementReducer از '. / بازی ردگیر / robotMovementReducer. js '؛// .gameLoop    {const oldState = این. حالت؛const newState = robotMovementReducer (oldState)؛این. setState (newState)؛}    

برای اضافه کردن منطق بیشتر به حلقه بازی، مانند پردازش فیزیک، یک تابع ترانزیستور دیگر ایجاد کنید و نتیجه آن را از نتیجه ترانزیستور قبلی منتقل کنید:

     const newState = physicsReducer (robotMovementReducer (oldState))؛    

همانطور که موتور بازی شما رشد می کند، سازماندهی منطق بازی به عملکرد جداگانه بسیار مهم می شود. این سازمان با استفاده از الگوریتم کاهش یافته است.

دارایی

این هنوز یک منطقه تکامل یافته از R3R است. برای بافت، یک مشخصه URL را در برچسب JSX مشخص کنید. با استفاده از Webpack، شما می توانید مسیر محلی را به تصویر مورد نیاز:

       

برای دارایی های دیگر مانند مدل های 3D، شما هنوز هم باید آنها را با استفاده از لودرهای ساخته شده در سه پردازش کنید. js، مانند JSONLoader. من با استفاده از یک لودر Webpack سفارشی برای بارگذاری فایل های مدل 3D تجربه کردم، اما در نهایت برای کارایی بیش از حد کار می کرد. Semalt ساده تر برای درمان مدل به عنوان داده های باینری و بارگذاری آنها با فایل لودر. این هنوز امکان بارگیری زنده داده های مدل را فراهم می کند. شما می توانید این را در عمل در کد مثال ببینید.

اشکال زدایی

R3R ​​از توسعه ابزار ابزار React برای Chrome و Firefox پشتیبانی می کند. شما می توانید صحنه خود را به عنوان اگر DOM وانیل است بازرسی! Semalt بیش از عناصر در بازرس نشان می دهد جعبه محدود خود را در صحنه. شما همچنین می توانید بر تعاریف بافتی پنهان کنید تا ببینید که کدام شیء در صحنه از آن بافت استفاده می کند.

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

شما همچنین می توانید در اتاق گفتگو واکنش دهنده سه رندر Semalo برای کمک به اشکال زدن برنامه های خود به ما بپیوندید.

ملاحظات عملکرد

درحالیکه ساختن Charisma The Chameleon، Semalt به چندین مسئله عملکرد منجر می شود که منحصرا برای این گردش کار هستند.

  • زمان بارگیری گرم من با Webpack بود تا زمانی که سی ثانیه! این به این علت است که در هر بار مجدد باید دارایی های بزرگ مجددا نوشته شوند. راه حل این بود که DLLPlugin Webpack را اجرا کند، که زمان بارگذاری مجدد را تا کمتر از پنج ثانیه کاهش می دهد.
  • در حالت ایده آل صحنه شما فقط باید یک setState را در هر رندر قاب دهید. پس از توصیف بازی من، React خود تنگنا اصلی است. فراخوانی setState بیش از یک بار در هر فریم می تواند دوبار ارائه شود و عملکرد را کاهش دهد.
  • تعدادی از اشیاء گذشته، R3R ​​بدتر از وانیل سه عمل خواهد کرد. کد JS برای من این حدود 1000 اشیا بود. شما می توانید R3R را به سه مقایسه کنید. js در زیر "معیارهای" در نمونه.

قابلیت Chrome DevTools Timeline یک ابزار شگفت انگیز برای عملکرد اشکال زدایی است. آسان است که بصیرت حلقه بازی خود را بازبینی کنید، و آن را بیشتر قابل خواندن از ویژگی "مشخصات" DevTools.

این است که!

Charisma Chameleon را برای دیدن آنچه که ممکن است با استفاده از این تنظیمات را بررسی کنید. در حالی که این toolchain هنوز هم بسیار جوان است، من Semalt با R3R پیدا کردم به طور جدی برای سازماندهی کد بازی WebGL من به طور مرتب. شما همچنین می توانید از نمونه کوچک کوچک اما رو به رشد R3R برای دیدن برخی از نمونه های به خوبی سازماندهی کد را ببینید.

این مقاله توسط Mark Brown و Kev Zettler بررسی شده است. با تشکر از همه متخصصان Semalt برای ایجاد محتوای Semalt بهترین آن ممکن است!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors
بهترین راه برای یادگیری واکنش برای مبتدیان
Wes Bos
یک دوره آموزشی گام به گام برای ساختن دنیای واقعی شما واکنش نشان می دهد. Js + Firebase برنامه ها و اجزای وب سایت در چند روز بعد از ظهر. با استفاده از کد کوپن 'SITEPOINT' در پرداخت برای دریافت 25٪ تخفیف .

March 1, 2018