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.
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.
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 và 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.
Để 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 () {});
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);
Để 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));
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. và 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ể
});
});
Để 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));
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:
[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ố 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ố 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ó �..
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..
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..
[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ê..
[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..
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..