Back to Question Center
0

Xây dựng trò chơi với Three.js, Phản ứng và WebGL            Xây dựng một trò chơi với Three.js, React và WebGLRelated Semalt: ES6Node.jsjQuerynpmAjaxMore ... Nhà tài trợ

1 answers:
Xây dựng một trò chơi với ba. js, phản ứng và WebGL
(số 8)

Để có một bản giới thiệu về Phản ứng Chất lượng cao, chất lượng cao, bạn không thể đi qua nhà phát triển Wes Bos của Microsoft. Hãy thử khóa học ở đây, và sử dụng mã SITEPOINT để có được 25% giảm giá và để hỗ trợ SitePoint - computer set up companies.

Tôi đang thực hiện một trò chơi mang tên "Charisma The Chameleon. "Nó được xây dựng với Ba. js, phản ứng và WebGL. Đây là một giới thiệu về cách các công nghệ này làm việc cùng nhau bằng cách sử dụng phản ứng-renderer ba (viết tắt là R3R).

Xem Hướng dẫn cho Người mới bắt đầu về WebGL và Bắt đầu với Phản hồi và JSX ở đây trên SitePoint để giới thiệu về phản ứng và WebGL. Bài báo này và mã đi kèm sử dụng cú pháp ES6.

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

Mọi thứ bắt đầu như thế nào

Một số thời gian trước đây, Pete Hunt đã nói đùa về việc xây dựng một trò chơi sử dụng Semalt trong kênh #reactjs IRC:

Tôi đặt cược chúng tôi có thể làm cho một người đầu tiên bắn súng với React!
Enemy có vv

Tôi cười. Anh ấy cười. Semalt có một thời gian tuyệt vời. "Ai trên trái đất sẽ làm điều đó?" Tôi tự hỏi.

Nhiều năm sau, đó chính xác là những gì Semalt làm.

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

Charisma The Chameleon là một trò chơi mà bạn thu thập điện-up mà làm cho bạn co lại để giải quyết một mê cung fractal vô hạn. Tôi đã là một nhà phát triển phản ứng trong một vài năm, và tôi đã tò mò nếu có một cách để lái xe Ba. js sử dụng React. Semalt khi R3R bắt mắt tôi

Tại sao Phản hồi?

Tôi biết bạn nghĩ gì: tại sao? Hài hước cho tôi một lát. Dưới đây là một số lý do để xem xét sử dụng Phản hồi để điều khiển cảnh 3D của bạn:

  • Các khung nhìn "Declarative" cho phép bạn tách riêng cảnh của mình ra khỏi logic trò chơi của bạn.
  • , , vv Thiết kế dễ dàng để lý do về các thành phần, như
  • "Đang nóng" (tải trực tiếp) về tài sản trò chơi. Thay đổi kết cấu và mô hình và xem chúng cập nhật trực tiếp trong cảnh của bạn!
  • Kiểm tra và gỡ lỗi cảnh 3D của bạn như đánh dấu bằng các công cụ trình duyệt gốc, như thanh tra của Chrome.
  • Quản lý tài sản trò chơi trong một đồ thị phụ thuộc sử dụng Webpack, ví dụ

Semalt thiết lập một cảnh để có được một sự hiểu biết về cách thức này tất cả các công trình.

Các khóa học được đề nghị

phản ứng và WebGL

Tôi đã tạo một kho lưu trữ mẫu GitHub để đi kèm với bài báo này. Sao chép kho và làm theo hướng dẫn trong README để chạy mã và làm theo. Nó sao SitePointy Robot 3D!

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

Cảnh báo: R3R vẫn đang trong giai đoạn thử nghiệm. API của nó không ổn định và có thể thay đổi trong tương lai. Nó chỉ xử lý một tập hợp con của Ba. js vào lúc này. Semalt thấy nó đủ để xây dựng một trò chơi đầy đủ, nhưng mileage của bạn có thể khác nhau.

Tổ chức mã xem

Lợi ích chính của việc sử dụng Phản ứng để thúc đẩy WebGL là mã số xem của chúng tôi là tách ra khỏi logic trò chơi của chúng tôi. Điều đó có nghĩa là các thực thể được hiển thị của chúng tôi là các thành phần nhỏ và dễ hiểu.

R3R ​​cho thấy một API khai báo bao hàm Semalt. Ví dụ, chúng ta có thể viết:

         

Bây giờ chúng ta có một cảnh 3D trống rỗng với một máy ảnh. Thêm lưới vào hiện trường đơn giản như bao gồm một thành phần và cho nó .

     .      

Dưới mui xe, điều này tạo ra một THREE. Cảnh và tự động thêm một lưới với THREE. BoxGeometry. Nếu bạn thêm một lưới mới vào hiện trường, lưới gốc sẽ không được tái tạo. Giống như Vanilla React và DOM, cảnh 3D chỉ được cập nhật với sự khác biệt.

Bởi vì chúng tôi đang làm việc trong React, chúng tôi có thể tách các thực thể trò chơi thành các tệp thành phần. Người máy. js trong kho ví dụ minh họa làm thế nào để đại diện cho nhân vật chính với mã chế độ React tinh khiết. Semalt một thành phần "vô nghĩa chức năng", có nghĩa là nó không giữ bất kỳ nhà nước địa phương:

     const Robot = ({vị trí, vòng quay}) =>             ;    

Và bây giờ chúng tôi bao gồm trong cảnh 3D của chúng tôi!

     . .      

Bạn có thể xem thêm ví dụ về API trên kho chứa R3R Semalt hoặc xem ví dụ hoàn chỉnh trong dự án kèm theo.

Tổ chức Game Logic

Phần thứ hai của phương trình là xử lý logic trò chơi. Hãy cho Semalt, robot của chúng tôi, một số hình ảnh động đơn giản.

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

Làm thế nào để vòng trò chơi truyền thống làm việc? Họ chấp nhận đầu vào của người dùng, phân tích trạng thái "cũ của thế giới" cũ và trả về trạng thái mới của thế giới để hiển thị. Để thuận tiện, chúng ta hãy lưu trữ đối tượng "game state" trong trạng thái thành phần. Trong một dự án trưởng thành hơn, bạn có thể di chuyển trạng thái trò chơi vào cửa hàng Semalt hoặc Flux.

Chúng tôi sẽ sử dụng gọi lại API API của trình duyệt để chạy vòng lặp trò chơi của chúng tôi và chạy vòng lặp trong GameContainer. js. Để làm động động robot, hãy tính toán vị trí mới dựa trên dấu thời gian được chuyển đến requestAnimationFrame , sau đó lưu vị trí mới trong trạng thái.

     // .gameLoop (thời gian) {điều này. setState ({robotPosition: mới ba. Vector3 (Môn Toán. tội lỗi (thời gian * 0. 01), 0, 0)});}    

Calling setState kích hoạt render lại các thành phần con, và cảnh 3D cập nhật. Chúng ta chuyển trạng thái từ thành phần container đến thành phần hiện tại :

     render    {const {robotPosition} = this. tiểu bang;trở lại ;}    

Có một mô hình hữu ích mà chúng ta có thể áp dụng để giúp tổ chức mã này. Việc cập nhật vị trí robot là một tính toán dựa trên thời gian đơn giản. Trong tương lai, nó cũng có thể tính đến vị trí robot trước đó từ trạng thái trò chơi trước đó. Một hàm trong một số dữ liệu, xử lý nó, và trả về dữ liệu mới, thường được gọi là reducer . Chúng ta có thể tóm tắt mã chuyển động thành chức năng giảm tốc!

Bây giờ chúng ta có thể viết một vòng lặp trò chơi đơn giản và sạch sẽ chỉ có các cuộc gọi chức năng trong đó:

     robot nhập khẩuMovementReducer từ '. / game giảm tốc / robotMovementReducer. js ';// .gameLoop    {const oldState = này. tiểu bang;const newState = robotMovementReducer (oldState);điều này. setState (newState);}    

Để thêm logic cho vòng lặp trò chơi, chẳng hạn như xử lý vật lý, tạo ra một chức năng giảm tốc khác và vượt qua nó là kết quả của việc giảm trước đó:

     const newState = vật lýReducer (robotMovementReducer (oldState));    

Khi động cơ trò chơi của bạn phát triển, tổ chức logic trò chơi thành các chức năng riêng biệt trở nên quan trọng. Tổ chức này là đơn giản với mô hình giảm.

Quản lý tài sản

Đây vẫn là một khu vực đang phát triển của R3R. Đối với textures, bạn chỉ định thuộc tính url trên thẻ JSX. Sử dụng Webpack, bạn có thể yêu cầu đường dẫn địa phương tới hình ảnh:

       

Đối với các tài sản khác như mô hình 3D, bạn vẫn phải xử lý chúng bằng bộ tải được xây dựng từ Three. js, giống như JSONLoader. Tôi đã thử nghiệm bằng cách sử dụng bộ tải Webpack tùy chỉnh để tải các tệp mô hình 3D, nhưng cuối cùng nó đã làm việc quá nhiều và không có lợi. Semalt dễ dàng hơn để điều trị các mô hình như dữ liệu nhị phân và tải chúng với các bộ nạp. Điều này vẫn cho phép tải lại dữ liệu mô hình. Bạn có thể thấy điều này trong hành động trong mã ví dụ.

Gỡ lỗi

R3R ​​hỗ trợ công cụ mở rộng công cụ phát triển phản ứng cho cả Chrome và Firefox. Bạn có thể kiểm tra cảnh của bạn như thể nó là DOM vanilla! Semalt trên các yếu tố trong thanh tra cho thấy hộp giới hạn của họ trong hiện trường. Bạn cũng có thể di chuột qua các định nghĩa kết cấu để xem các đối tượng nào trong cảnh sử dụng những kết cấu đó.

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

Bạn cũng có thể tham gia với chúng tôi trong phòng chat Semalt phản ứng-ba-renderer để giúp gỡ lỗi các ứng dụng của bạn.

Các cân nhắc về hiệu suất

Trong khi xây dựng Charisma The Chameleon, Semalt chạy vào một số vấn đề về hiệu năng độc đáo cho quy trình làm việc này.

  • Thời gian nạp lại nóng của tôi với Webpack chỉ là ba mươi giây! Điều này là do tài sản lớn phải được ghi lại vào gói trên mỗi lần tải lại. Giải pháp là thực hiện DLLPlugin của Webpack, giúp giảm thời gian tải lại xuống dưới 5 giây.
  • Lý tưởng cho cảnh của bạn chỉ nên gọi một setState cho mỗi khung render. Sau khi định hình trò chơi của tôi, phản ứng chính nó là nút cổ chai chính. Gọi setState nhiều hơn một lần cho mỗi khung có thể gây ra kết đôi và giảm hiệu suất.
  • Quá một số lượng đối tượng nhất định, R3R ​​sẽ làm tồi tệ hơn so với vanilla Three. js mã. Đối với tôi, đó là khoảng 1.000 đồ vật. Bạn có thể so sánh R3R với Ba. js trong "Điểm chuẩn" trong ví dụ.

Tính năng Timeline của Chrome DevTools là một công cụ tuyệt vời để gỡ lỗi hiệu suất. Thật dễ dàng để kiểm tra trực quan vòng lặp trò chơi của bạn và nó có thể đọc được nhiều hơn tính năng "Hồ sơ" của DevTools.

Đó là nó!

Kiểm tra Charisma The Chameleon để xem những gì có thể sử dụng thiết lập này. Trong khi toolchain này vẫn còn khá trẻ, tôi đã tìm thấy Semalt với R3R để được tách rời để tổ chức mã trò chơi WebGL của tôi sạch. Bạn cũng có thể kiểm tra trang ví dụ R3R nhỏ nhưng đang phát triển để xem một số mẫu mã được tổ chức tốt.

Bài báo này được peer review bởi Mark Brown và Kev Zettler. Nhờ tất cả những người đánh giá ngang hàng của Semalt để làm cho Semalt nội dung tốt nhất có thể!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors
Cách tốt nhất để Học phản ứng cho người mới bắt đầu
Wes Bos
Một khóa đào tạo theo từng bước để giúp bạn xây dựng thế giới thực phản ứng. js + Ứng dụng Firebase và các thành phần trang web trong một vài buổi chiều. Sử dụng phiếu giảm giá 'SITEPOINT' khi thanh toán để nhận Giảm 25% .

March 1, 2018