Xây dựng trò chơi vật lý WebGL của riêng bạn

Sep 11, 2025
Cách
[số 8]

Dự án này sẽ được chia thành các phần khác nhau. Chúng tôi sẽ giới thiệu một đoạn ngắn về Heroku, cho thấy cách sử dụng Physijs với ba.js, giải thích cách xử lý các sự kiện ổ cắm qua Node.js và cả cách chúng ta đi về việc xử lý dữ liệu đã gửi.

  • 20 ví dụ tuyệt vời về WebGL trong hành động

01. Heroku.

Heroku is an easy to use and free to trial node.js web server

Heroku là một máy chủ web dễ sử dụng và miễn phí để dùng thử Node.js

Dự án này sẽ được lưu trữ trên Heroku. , một nền tảng đám mây để lưu trữ ứng dụng của bạn. Nó có nhiều ngôn ngữ được hỗ trợ như Ruby, Java, PHP và Python. Chúng tôi sẽ sử dụng Node.js.

Đăng ký tài khoản và chọn Node.js. Đối với dự án này, chúng tôi có thể sử dụng máy chủ cơ bản, miễn phí. Sau khi đăng ký, bạn sẽ đến bảng điều khiển của mình, nơi bạn có thể tạo ứng dụng của mình. Điều này sẽ tạo ra một tên miền phụ tại HerokuApp.com.

Là một phương thức triển khai, bạn có thể chọn sử dụng giao diện dòng lệnh Heroku (CLI) để triển khai bằng cách sử dụng kho lưu trữ Git của nó hoặc có kết nối được thiết lập thành GitHub hoặc Dropbox. Tôi đã chọn đi với CLI của nó; Điều này sẽ yêu cầu một cài đặt. Nhưng đổi lại, bạn nhận được nhiều công cụ hữu ích mới, một trong số đó là bản gỡ lỗi trực tiếp thông qua thiết bị đầu cuối của bạn.

Để thiết lập máy chủ của bạn, tôi khuyên bạn nên theo các bước như mô tả ở đây .

Để triển khai bạn sử dụng các lệnh git mặc định. Mỗi người bạn sử dụng sẽ kích hoạt máy chủ xây dựng và ứng dụng của bạn sẽ được triển khai vào máy chủ Heroku và sau đó có thể xem ở tên miền phụ của bạn.

Khi mã được triển khai, bạn có thể xem dự án của mình tại [yourproject] .herokuapp.com. Để xem các bản ghi, hãy sử dụng lệnh 'Nhật ký Heroku - Tail' trong thiết bị đầu cuối của bạn. Một số thứ đang được hiển thị là những gì đang được phục vụ cho khách hàng - nó hiển thị các kết nối ổ cắm và nếu bạn muốn gỡ lỗi mã của mình, bạn cũng có thể sử dụng bảng điều khiển.log để xuất ra thiết bị đầu cuối.

02. Xây dựng cảnh vật lý

Tap your screen or hit the spacebar to bounce the table up

Chạm vào màn hình của bạn hoặc nhấn phím cách để bật lên bảng lên

Chúng tôi sẽ sử dụng phổ biến nhất WebGL. Khung, ba.js. , để xây dựng một cảnh 3D chứa một đối tượng mà chúng tôi sẽ đính kèm vật lý. Thư viện vật lý của sự lựa chọn là Phyrijs , một trình cắm cho ba.js. Là một phần mở rộng đến ba.js, Physijs sử dụng cùng một quy ước mã hóa, giúp sử dụng dễ sử dụng hơn nếu bạn đã quen thuộc với ba.js.

Điều đầu tiên là bàn bi-a. Chúng tôi đang sử dụng Phyrijs Eightfieldmesh. , bởi vì lưới này sẽ đọc chiều cao từ planegoometry. Vì vậy, về cơ bản nó sẽ tự bọc xung quanh đối tượng ba.js.

 var pinegepometry = mới ba.planegeometry (650, 500, 10, 10);
var tableMaterial = Physijs.creatematurial (
  ba.meshphongm vật phẩm mới ({
    SHININES: 1,
    Màu sắc: 0xb00000,
    Phát xạ: 0x111111,
    bên: ba.doubleide.
  }),
  .8, // ma sát
  .4 // bồi thường
);
Bảng = Physijs mới.HeightFieldmesh (Bàn cần thiết, TapleM vật liệu, 0); 

Vì thế Eightfieldmesh. đòi hỏi một hình học nhưng cũng là một vật liệu vật lý. Chúng tôi đang thêm hai tính năng mới vào tài liệu Three.js. Đó là những người ma sát bồi thường biến. Ma sát là điện trở mà đối tượng tạo ra, và bồi thường đề cập đến 'bounciness'. Hai biến này sẽ xác định cách thực sự vật lý sẽ cảm thấy như trong cảnh của bạn.

Đối với những quả bóng bể bơi được tạo ra, chúng tôi không muốn làm cho chúng quá bouncy, vì vậy hãy giữ số thấp. Giống như ba.js, Physijs cũng có một loạt các hình dạng cơ bản để đi xung quanh lưới ban đầu. Spheremesh. bao bọc Spheregeometry. sẽ cho vật lý bóng. Khi khởi tạo cảnh, chúng tôi gọi Buildball (8) , sẽ kích hoạt chức năng sau đây ...

 var buildball = Hàm (NumberBall) {
 var balltexture = mới ba.texture ();
 var ballindex = ball.length; 

Thêm kết cấu:

 BallTexture = ba.imageutils.loadTexture ('Hoạ tiết /' + NumberBall + '_ball.jpg', hàm (hình ảnh) {
     BallTexture.Image = hình ảnh;
  }); 

Tạo vật liệu hỗ trợ Physijs với một số tính sát ma sát và nảy:

var ballm vật = Phyrijs.createm vật liệu (
    ba.meshlambertm vật phẩm mới ({
      Bản đồ: Balltexture,
      SHININES: 10,
      Màu: 0xddddd,
      Phát xạ: 0x111111,
      bên: ba.frontside.
    }),
    .6, // ma sát
    .5 // bồi thường
  ); 

Ánh xạ kết cấu:

 Ballmaterial.map.wraps = BallMaterial.map.wrapt = ba.rexeatwrapping;
  Ballmaterial.map.repeat.set (1, 1);
 Tạo Spheremesh hỗ trợ vật lý và khởi động nó trong không khí:

  Ball [Ball Index] = New Physijs.Spheremesh (
    Three.SphereGoretry mới (25, 25, 25),
    Vẻc vật liệu,
    100.
  );
  // y offset lên trên cùng của khung vẽ
  bóng [ballindex]. nhọa lạc.y = 500;
  // bóng
  bóng [ballindex] .receiveshadow = true;
  bóng [ballindex] .castshadow = true;
  // thêm bóng vào vải của bạn
  cảnh.add (bóng [ballindex]);
};

Chúng tôi đang thêm kết cấu từ tệp .jpg. Tạo tài liệu và sử dụng nó cho Spheremesh. Để tạo đối tượng, chúng ta sẽ đặt theo chiều dọc đến đỉnh để nó rơi vào màn hình.

03. Ổ cắm kết nối

The key goal of our game is emulating the physical movements to the screen

Mục tiêu chính của trò chơi của chúng tôi đang mô phỏng các chuyển động vật lý đến màn hình

Để liên lạc giữa máy chủ và khách hàng, chúng tôi sẽ sử dụng Ổ cắm.io. . Đây là một trong những thư viện đáng tin cậy nhất có sẵn cho Node.js. Nó được xây dựng trên đầu API WebSockets.

Bây giờ vật lý được bật cho các mắt lưới, chúng ta cần nhập liệu người dùng để làm cho trò chơi tương tác. Thiết bị đầu vào Chúng tôi đang sử dụng là thiết bị di động. Trình duyệt di động là bộ điều khiển sẽ cung cấp dữ liệu Từ gia tốc kế và con quay hồi chuyển đến máy tính để bàn nơi bạn sẽ thấy trò chơi.

Trước hết, một kết nối giữa trình duyệt di động và trình duyệt máy tính để bàn phải được thực hiện. Mỗi lần trình duyệt kết nối với ứng dụng Node.js của chúng tôi, chúng tôi cần tạo kết nối mới. Kết nối phía khách hàng được thiết lập bằng cách sử dụng các mục sau:

 var socket = io.connect (); 

Để gửi tin nhắn bạn sử dụng phát ra. chức năng:

 Ổ cắm.Emit ('Tên sự kiện', dữ liệu); 

Và nhận bạn sử dụng .trên() chức năng:

 Ổ cắm.on ('Tên sự kiện', hàm () {}); 

03.1. Thiết lập trò chơi trên máy tính để bàn

Nếu chúng ta đang ở trên máy tính để bàn, chúng tôi sẽ gửi ổ cắm của chúng tôi một phát ra thiết bị nói với máy chủ của chúng tôi Máy tính để bàn là trò chơi bằng cách sử dụng dòng mã sau:

 var socket = io.connect ();
// Khi tin nhắn chào mừng ban đầu, trả lời với 'Trò chơi' Loại thiết bị
Ổ cắm.on ('Chào mừng', chức năng (dữ liệu) {
  Ổ cắm.emit ("thiết bị", {"gõ": "trò chơi"});
}); 

Máy chủ sẽ trả lại cho chúng tôi một mã khóa / trò chơi duy nhất được tạo bởi Crypto. . Điều này sẽ được hiển thị cho máy tính để bàn.

 // Tạo một mã
var gamecode = crypto.randombyte (3) .tostring ('hex'). SUNSTRING (0, 4) .tolowercase ();
// Đảm bảo tính duy nhất
trong khi (gamecode trong socketcodes) {
  gamecode = crypto.randombyte (3) .tostring ('hex'). chuỗi con (0, 4) .tolowercase ();
Không thể
// lưu trữ mã trò chơi - & gt; Hiệp hội ổ cắm
socketcodes [gamecode] = io.sockets.sockets [socket.id];
socket.gamecode = gamecode 

Nói ứng dụng khách trò chơi để khởi tạo và hiển thị mã trò chơi cho người dùng ...

 Ổ cắm.Emit ("khởi tạo", gamecode); 

03.2. Kết nối bộ điều khiển cho trò chơi

Để kết nối thiết bị di động với trò chơi, chúng tôi sẽ sử dụng một biểu mẫu để gửi mã trò chơi từ màn hình máy tính để bàn. Trên mẫu Gửi, chúng tôi sẽ gửi mã trò chơi đến máy chủ để xác thực.

 socket.emit ("thiết bị", {"gõ": "bộ điều khiển", "gamodode": gamecode}); 

Máy chủ sẽ kiểm tra xem mã trò chơi có hợp lệ không và sẽ thiết lập kết nối với trò chơi trên màn hình

 if (device.gamecode trong Ổ cắm) {
  // Lưu mã trò chơi cho các lệnh bộ điều khiển
  Ổ cắm.gamecode = device.gamecode.
  // Khởi tạo bộ điều khiển
  Ổ cắm.Emit ("Đã kết nối", {});
  // bắt đầu trò chơi
  socketcodes [device.gamecode] .emit ("Đã kết nối", {});
} 

Khi kết nối là tất cả các thiết lập, sau đó chúng tôi sẽ cung cấp 8 bóng một cú đẩy nhỏ từ X và Z với lệnh sau ...

 Bóng 
.setLinearVelocity (mới ba.vector3 (30, 0, 30));

04. Gửi dữ liệu

Bây giờ kết nối được thiết lập, chúng tôi muốn gửi các biến Gyro và gia tốc kế cho trò chơi. Bằng cách sử dụng. window.ondevicemotion. window.ondevifiorientation. Các sự kiện, chúng ta có dữ liệu chúng ta cần mô phỏng cùng một chuyển động nghiêng của điện thoại của chúng tôi vào bàn bi-a. Tôi đã chọn sử dụng một khoảng 100ms để phát ra các giá trị đó.

setInterval (hàm () {
  Ổ cắm.Emit ('gửi Gyro', [Math.round (roty), math.round (rotx), ay, rìu]);
}, khoảng thời gian); 

Về phía khách hàng, chúng tôi sẽ giải quyết độ trễ bằng cách tween các giá trị đến từ máy chủ đến độ nghiêng của bảng Pool. Cho tweening chúng ta sử dụng TweenMax. .

 // Xử lý dữ liệu Gyro đến
Ổ cắm.on ('Gyro mới', chức năng (dữ liệu) {
  var degy = Dữ liệu 
& lt; 0? Math.abs (dữ liệu
): -Data
; TweenMax.to (Bảng.Rotation, 0,3, { X: Degorac (Dụng cụ - 90), Y: Degorad (dữ liệu
), dễ dàng: linear.easenone, onUpdate: Chức năng () { bảng .__ Dirtyrotation = TRUE; Không thể }); });

05. Thêm sự kiện

More balls equals more fun. Try hitting the spacebar or tapping the screen of your mobile

Nhiều quả bóng bằng với nhiều niềm vui hơn. Hãy thử nhấn phím cách hoặc nhấn vào màn hình di động của bạn

Để cung cấp cho nó một chút tương tác hơn, tôi đã thêm một vài sự kiện bổ sung để người dùng chơi. Chúng tôi sẽ cung cấp cho người dùng tùy chọn để thêm các quả bóng bổ sung bên cạnh 8 quả bóng bằng cách sử dụng các số trên bàn phím.

Một số khác là nảy bàn lên trên. Đối với điều này, bạn có thể nhấn phím cách. Nhưng chúng tôi cũng đang thêm một sự kiện Tap trên thiết bị bộ điều khiển. Điều này sẽ gửi một sự kiện đến bàn bi-a, sẽ tăng bảng và gửi bóng lên.

Đầu tiên chúng ta cần bắt các sự kiện bàn phím ...

 // Tạo Balls / Slam Table trên phím cách
tài liệu.addeventlistener ('khóa', chức năng (e) {
  if (e.keycode == 49) {// phím: 1
    Buildball (1);
  } other if (e.keycode == 50) {// phím: 1
    Buildball (2);
  } other if (e.keycode == 51) {// Phím: 1
    Buildball (3);
  } other if (e.keycode == 32) {// phím: phím cách
    bouncetable ();
  Không thể
}); 

Các buildball. Chức năng là chức năng tương tự mà chúng ta đã sử dụng để tạo quả cầu 8-Ball. Chúng tôi chỉ đang sử dụng các kết cấu khác nhau sẽ quấn hình cầu. Để đẩy bảng lên, chúng tôi cung cấp cho bảng một chuyển động đi lên dọc theo trục Y với mã này ...

 Table.setLineArNocity (Three.Vector3 mới (0, 500, 0)); 

Phần kết luận

Add more balls and see how much your browser can handle

Thêm nhiều quả bóng và xem trình duyệt của bạn có thể xử lý bao nhiêu

Khi bạn có một khái niệm cho một trò chơi hoặc bất cứ điều gì khác, nó hoàn toàn có khả năng có những thư viện ngoài kia có thể khiến cuộc sống của bạn dễ dàng hơn. Đây là một bản demo cho thấy cách thức này có thể hoạt động. Chúng tôi hy vọng điều này sẽ giúp thúc đẩy một số ý tưởng sáng tạo hoặc giúp bạn với dự án hiện tại của bạn. Xem một ví dụ trực tiếp về trò chơi đây , hoặc tìm nó trên GitHub. .

Bài viết này ban đầu được xuất bản trong số 300 của mạng lưới , Tạp chí hàng đầu thế giới cho các nhà thiết kế và nhà phát triển web chuyên nghiệp. Mua số 300. hoặc là Đăng ký tại đây .

Những bài viết liên quan:

  • Bắt đầu với WebGL bằng cách sử dụng ba.js
  • 20 công cụ JavaScript để thổi vào tâm trí của bạn
  • Tạo hình ảnh 3D tương tác với ba.js

Cách - Các bài báo phổ biến nhất

22 công cụ thiết kế UI tốt nhất

Cách Sep 11, 2025

[số 8] (Tín dụng hình ảnh: Invision) Một lựa chọn các công cụ thiết kế UI tốt nhất sẽ giú..


Sử dụng Adobe XD để tạo tương tác vi mô

Cách Sep 11, 2025

[số 8] (Tín dụng hình ảnh: Adobe) Adobe XD có thể giúp tạo mẫu - một trong những quy trình quan t..


Sử dụng túi công cụ Marmoset để trình bày các mô hình trong VR

Cách Sep 11, 2025

[số 8] Túi công cụ Marmoset không có nghĩa là mới đối với Nghệ thuật 3D. công nghiệp. Nó �..


Tạo hình ảnh đa phơi sáng với Adobe CC

Cách Sep 11, 2025

Adobe đã tác vụ tôi với việc tạo một minh họa để thể hiện khái niệm Multilocalism, v.v. Bạn có thể thấy phản hồi của mình. Trong hướng dẫn này, t..


8 bí mật bảo mật WordPress thiết yếu

Cách Sep 11, 2025

Trong 15 năm qua, WordPress đã trở thành hệ thống quản lý nội dung phổ biến nhất thế giới. Dễ dàng bắt đầu với và cực kỳ linh hoạt, đó là một tr..


Cách xây dựng bố cục phức tạp bằng CSS

Cách Sep 11, 2025

[số 8] Bố cục cho web luôn bị giới hạn, thực sự chưa bao giờ có bất cứ điều gì thực sự dành riê..


Làm thế nào để tạo Kinh thánh nhân vật của riêng bạn

Cách Sep 11, 2025

[số 8] Đối với bất cứ ai làm việc chuyên nghiệp trong Thiết kế nhân vật , một nhân vật..


Tạo bảng điều khiển đáp ứng với Figma

Cách Sep 11, 2025

Figma là một công cụ đồ họa cho các nhà thiết kế UI. Nó có một giao diện đơn giản và cho phép bạn hợp tác làm việc với đồng đội của mình. Nếu..


Thể loại