Giới Thiệu

Thực tế thì mình cũng chả yêu cầu là 1 trong thiết kế viên chăm game xuất xắc gì cả, chỉ cần lần này mình tất cả được nhận làm một project game thời gian ngắn trường đoản cú anh sếp và được recomkết thúc áp dụng Cocos Creator. Sau một thời hạn không thật lâu năm xúc tiếp cùng với nó thì bản thân thấy nó cũng rất giỏi phải mong chia sẻ cho đầy đủ tín đồ về engine này

Theo như bản thân giành được biết thì trước đây khi chưa xuất hiện Cocos Creator thì phần lớn fan vẫn thực hiện Cocos2d-x code bằng C++. Nhược điểm của thằng này là không có giao diện tín đồ xây dựng cần tự tưởng tượng code với rồi chạy lên mới thấy được hiệu quả. Để khắc phục và hạn chế vấn đề này, có tác dụng tăng hiệu suất cùng bắt kịp được với Unity, thì Cocos Creator đã được Thành lập và hoạt động. Lúc Này thì thằng này chỉ hỗ trợ bên trên MAC cùng Window buộc phải đồng đội làm sao sử dụng Ubuntu thì dĩ nhiên đang hơi bi quan.Bạn sẽ xem: Cocos2d-x là gì

Vậy Cocos2d-x là gì thì Cocos2d-x là một trong Engine cung ứng thiết kế Game đa nền tảng : thiết bị di động ( IOS, ANDROID, Blackberry, TIZEN, WP) Window, MacOS, HTML5,.. đại loại là đủ cả. Theo wikipedia thì người sáng tác của Cocos2d-x là một trong những tín đồ china mang tên là Zhe Wang.

Bạn đang xem: Cocos2d-x là gì


*

*

2012, at Zynga. With Rolanvì chưng Abarca và Zhe Wang discussing Cocos2d-x’s & cocos2d-iphone’s roadmaps

Lúc Này thì nó vẫn được phần nhiều các bạn nhẵn giếng cách tân và phát triển hơi là mạnh mẽ cùng không xong xuôi hoàn thành để trở nên Unity phiên bản không tính tiền, nhưng mà chặng đường chắc vẫn tồn tại hơi dài.

Thực Hành Tạo Và Deploy Game

Mình thì không thích lâu năm dòng nhưng bản thân thấy các tốt nhất có thể nhằm học tập một chiếc gì là cđọng cho vô làm cho luôn nó mới nkhô cứng vỡ vạc ra được, chđọng cứ triết lý suông thì vô cùng khó khăn hình dung.


*

Đây là trang chủ để sở hữu cocos creator : https://www.cocos.com/en/creator

Sau lúc download về với setup (cài đặt cái này tương đối là lâu nha) thì hình ảnh chính của creator đã như thế này


*

Giờ họ đã đi luôn luôn vào làm game thứ nhất nhỏng trong docs của cocos trả lời. Dưới đây là mối cung cấp assets có tác dụng game cùng game đã trả thành

Assets

Sau Lúc mua Assets ban đầu về họ sẽ import nó vào creator, hết sức đơn giản chỉ việc kéo thả vào thôi


*

Scene

Sau Lúc đã gồm Assets ta sẽ khởi tạo những Scene. Scene là một trong những phiên bản bồ 2 chiều với rất có thể mnghỉ ngơi cơ chế 3D, giúp chúng ta kéo tả, thay đổi tạo ra UI. Mỗi Scene vẫn là một trong những màn hình mẫu mã như là trên website chúng ta sẽ sở hữu trang home, trang detail, trang about thì scene chính là những view đó. Ta rất có thể tạo nhiều scene cùng đổi khác thân bọn chúng vào game.


Tại trên đây ta có thể tùy kéo kéo chỉnh, đổi khác vị trí của các thực thể sao cho mình thấy ổn định độc nhất vô nhị. Có những cơ chế kéo thả

Di chuyển theo hướng X - Y thứ nhất lựa chọn bên góc trái sau đó có thể di chuyển địa điểm của thực thể


Ttuyệt thay đổi góc xoay của thực thể. Chọn và ra scene đổi khác góc quay


Rsize size thực thể chọn
và chuyển đổi kích thước


Ở trên scene ta chỉ cần nỗ lực cố thôi là có thể kéo thả, đổi khác form size cùng dic đưa mọi phiên bản đồ

Properties

Thì kế bên việc kéo thả làm việc scene họ cũng có thể biến đổi vị trí, biến hóa độ trong veo, thêm những script, thêm animation cùng rất nhiều thức không giống ở trong phần này


Position chính là địa điểm của thực thể kia bên trên scene tính theo trục tọa đọ X-YRotaion là góc nghiêngScale là kiểu dáng pngóng to lớn theo 2 chiều x hoặc yAnchor là để thay đổi địa chỉ của thực thể đối với nơi bắt đầu tọa độ của chính nóSize chính là thay đổi kích cỡ width-Height của thực thểmàu sắc là màu của thực thểOpathành phố độ nhìn trong suốt...

Node Tree

Đây khi Quanh Vùng nhằm ta xác minh được đâu là yếu tắc phụ thân bé của nhau hoặc thằng làm sao sinh sống lớp trên, thằng như thế nào ngơi nghỉ lớp bên dưới.


thằng làm sao càng sống bên dưới Có nghĩa là nó sẽ trên lớp cao nhất. Kiểu nhỏng ngơi nghỉ trong css tất cả trực thuộc tính z-index Lúc ta sử dụng position vậy. Càng nghỉ ngơi bên dưới thì z-index càng tốt với rất có thể bịt lớp thằng tê. Giống nhỏng chiếc ground đã bít đi cả thằng PurpleMonster.

Timeline

phần này dùng làm tạo nên các animation 1-1 bớt chị buộc phải biến hóa góc nghiêng xuất xắc biến đổi vị trí của thực thể. Đây là ví dụ về 1 animation nhảy


Tạo Hình Và Bắt Sự Kiện Cho Nhân Vật

Bây giờ sau thời điểm vẫn đọc hết những phần và tính năng của chính nó họ vẫn lấn sân vào có tác dụng game đầu tiên nha

Trước tiên họ cần kéo những yếu tố của game vào để sở hữu một chiếc UI tổng quát

Sau lúc sử dụng hết những kỹ năng và kiến thức sinh sống bên trên để kéo thả ra một UI nhỏng trong hình, thì hiện nay quá trình bắt buộc làm cho là add thêm những script nhằm bắt sự kiện trong game. Tạo một folder scripts --> cùng new một tệp tin Player.js.

Tạo folder


Click double vào file Player ta sẽ thấy một size js có sẵn

// Player.js cc.Class( extends: cc.Component, properties: // foo: // // ATTRIBUTES: // default: null, // The mặc định value will be used only when the component attaching // // khổng lồ a node for the first time // type: cc.SpriteFrame, // optional, default is typeof mặc định // serializable: true, // optional, mặc định is true // , // bar: // get () // return this._bar; // , // phối (value) // this._bar = value; // // , , // LIFE-CYCLE CALLBACKS: // onLoad () , start () , // update (dt) , );Giờ thêm các properties // Player.js //... properties: // main character"s jump height jumpHeight: 0, // main character"s jump duration jumpDuration: 0, // maximal movement speed maxMoveSpeed: 0, // acceleration accel: 0, , //...Tiếp cho ta vẫn lắp js này mang lại thằng thực thể PurpleMonster để lát nữa sẽ cách xử lý sự khiếu nại trong tệp tin js này. Quay về màn hình vào phần Node Tree nãy tôi đã nói, chọn thực thể PurpleMonster tiếp nối lưu ý thanh lịch phần properties của nó. Ta sẽ xuống button Add Component chọn Custom component và lựa chọn Player

Sau lúc đã add được js vào vào nó vẫn hiển thị các ở trong tính ta vừa khái niệm vào tệp tin Player làm việc bên trên với ta đang điền các thông số kỹ thuật vào đây.


Bây giờ ta sẽ viết một cái hàm nhảy cho thằng này

// Player.js properties: //... , setJumpAction: function () // jump up var jumpUp = cc.moveBy(this.jumpDuration, cc.v2(0, this.jumpHeight)).easing(cc.easeCubicActionOut()); // jump down var jumpDown = cc.moveBy(this.jumpDuration, cc.v2(0, -this.jumpHeight)).easing(cc.easeCubicActionIn()); // repeat return cc.repeatForever(cc.sequence(jumpUp, jumpDown)); ,Sau Lúc sẽ có hàm dancing rồi ta đã mix hàm đó vào onLoad(). Điều này có tính năng là nó đã chạy ngay lập tức sau thời điểm thực thể lại được load ra// Player.js onLoad: function () // initialize jump action this.jumpAction = this.setJumpAction(); this.node.runAction(this.jumpAction); ,Ok kiểm tra xem chạy ko nha. Chọn vào nút

Đã tạo được hàm nhảy, tiếp nối chúng ta sẽ tạo nên hành động dịch chuyển thanh lịch trái, thanh lịch phải mang lại nhân thiết bị.

Xem thêm: Kaskus Message - Jual Dlcd Boot 2015 / Hiren'S Bootcd

// Player.js setJumpAction: function () //... , onKeyDown (event) // mix a flag when key pressed switch(sự kiện.keyCode) case cc.macro.KEY.a: this.accLeft = true; break; case cc.macro.KEY.d: this.accRight = true; break; , onKeyUp (event) // unset a flag when key released switch(sự kiện.keyCode) case cc.macro.KEY.a: this.accLeft = false; break; case cc.macro.KEY.d: this.accRight = false; break; ,onKeyDown là khi ta nhấm phím, cònonKeyUp là lúc ta nhả phím ra. Sẽ có 1 switch làm việc trong để chất vấn coi ta bấm phím như thế nào ở keydown cùng nhả phím làm sao ở keyup. Sau kia set hướng mang lại nó nghỉ ngơi keydown đến hướng đấy thành true với Khi nhả phím thì phối lại thành false chỉ đơn giản và dễ dàng vậy thôi.

Nhưng bận mong muốn game nhận thấy ác tín lệnh đó của mình thì bạn cần khởi chế tác keyboard bằng phương pháp nlỗi sau

// Player.js onLoad: function () // Initialize the jump action this.jumpkích hoạt = this.setJumpAction(); this.node.runAction(this.jumpAction); // Acceleration direction switch this.accLeft = false; this.accRight = false; // The main character"s current horizontal velocity this.xSpeed = 0; // Initialize the keyboard đầu vào listening cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this); cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UPhường, this.onKeyUp, this); , onDestroy () // Cancel keyboard input đầu vào monitoring cc.systemEvent.off(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this); cc.systemEvent.off(cc.SystemEvent.EventType.KEY_UP., this.onKeyUp, this); ,Khởi tạo ra lắng tai bàn phím Lúc load và bỏ lắng tai lúc thực thể kia bị phá hủy

Cuối cùng là phần cập nhật địa điểm của nhân thứ Khi ta bấm nút

// Player.js update: function (dt) // update speed of each frame according to lớn the current acceleration direction if (this.accLeft) this.xSpeed -= this.accel * dt; else if (this.accRight) this.xSpeed += this.accel * dt; // restrict the movement speed of the main character lớn the maximum movement tốc độ if ( Math.abs(this.xSpeed) > this.maxMoveSpeed ) // if speed reach limit, use max speed with current direction this.xSpeed = this.maxMoveSpeed * this.xSpeed / Math.abs(this.xSpeed); // update the position of the main character according to the current speed this.node.x += this.xSpeed * dt; ,Mình đã thử thử nghiệm thì thấy thằng update() này cứ đọng 0,01 giây nó đã call một lần

update(dt) console.log("Run in function update() time : ", dt);
Tức là nó đã gọi hàm gần như là liên tục

if (this.accLeft) this.xSpeed -= this.accel * dt; else if (this.accRight) this.xSpeed += this.accel * dt; Phần này đã chất vấn coi người tiêu dùng vẫn bắt nhân đồ dùng chạy về phía làm sao. Sau đó sẽ biến đổi vị trí nhân đồ gia dụng theo phía đó bằng cách trừ hay công tọa đọ X với cùng một tốc độ tăng theo thời hạn. Nhưng nhằm phòng trường vừa lòng tăng vận tốc vượt nhanh khô thì 1 phần số lượng giới hạn vận tốc được cấu hình thiết lập ngơi nghỉ tức thì bên dưới.

if ( Math.abs(this.xSpeed) > this.maxMoveSpeed ) // if tốc độ reach limit, use max tốc độ with current direction this.xSpeed = this.maxMoveSpeed * this.xSpeed / Math.abs(this.xSpeed); Phần cuối của hàm l à phối địa chỉ cho nhân vật

this.node.x += this.xSpeed * dt;

Tạo Hình Và Bắt Sự Kiện Cho Ngôi Sao

Sau Khi vẫn triển khai dứt mang đến nhân vật kế tiếp bọn họ sẽ thực hiện đến ngôi sao. Do ngôi sao sáng đã lộ diện cùng không đủ khi nhân trang bị tiếp xúc với nó. Tức là nó sẽ tiến hành tạo ra với phá hủy đi liên lục thế nên tại đây ta sẽ động đụng mang lại một định nghĩa Prefab. Prefab là đa số node mọi thực thể ta đang tạo nên nhưng lại cần áp dụng đi áp dụng lại các lần, nó giống hệt như có mang component sinh sống trong các framework React giỏi Vue vậy.

Thì hiện thời ta sẽ khởi tạo ra những Prefab điều đó bằng cách kéo ngôi sao vào Scene cùng tạo nên một file script rồi add vào mang đến nó.


// Star.js properties: // When the distance between the star & main character is less than this value, collection of the point will be completed pickRadius: 0, ,

Rồi sau thời điểm sẽ add script mang đến nó ta đổi mới nó thành 1 một Prefab bằng phương pháp. Kéo nó từ bỏ Scene xuống ô Assets vậy là xong


Tiếp đến là tạo thành sự kiện nhằm mix địa điểm cho ngôi sao sáng lúc nó lộ diện. Tạo một file Game.js

// Game.js properties: // this property quotes the PreFab resource of stars starPrefab: default: null, type: cc.Prefab , // the random scale of disappearing time for stars maxStarDuration: 0, minStarDuration: 0, // ground node for confirming the height of the generated star"s position ground: default: null, type: cc.Node , // player node for obtaining the jump height of the main character and controlling the movement switch of the main character player: default: null, type: cc.Node ,starPrefab ta để type là Prefab. hiện nay add script này mang lại thằng Canvas vuốt lên phần Node Tree --> chọn Canvas --> rồi Properties chọn Add Component cùng chọn file script Game

Rồi tiếng cho phần Generate sao bằng phương pháp random vị trí

// Game.js onLoad: function () // obtain the anchor point of ground level on the y axis this.groundY = this.ground.y + this.ground.height/2; // this.ground.top may also work // generate a new star this.spawnNewStar(); , spawnNewStar: function() // generate a new node in the scene with a premix template var newStar = cc.instantiate(this.starPrefab); // put the newly added node under the Canvas node this.node.addChild(newStar); // mix up a random position for the star newStar.setPosition(this.getNewStarPosition()); , getNewStarPosition: function () var randX = 0; // According khổng lồ the position of the ground màn chơi and the main character"s jump height, randomly obtain an anchor point of the star on the y axis var randY = this.groundY + Math.random() * this.player.getComponent("Player").jumpHeight + 50; // according to lớn the width of the screen, randomly obtain an anchor point of star on the x axis var maxX = this.node.width/2; randX = (Math.random() - 0.5) * 2 * maxX; // return khổng lồ the anchor point of the star return cc.v2(randX, randY); ,Test nào


Rồi tiếng đính sao vào với tổng thể và toàn diện game

// Game.js spawnNewStar: function() // ... // Staging a reference of trò chơi object on a star component newStar.getComponent("Star").game = this; ,// Star.js getPlayerDistance: function () // judge the distance according to the position of the player node var playerPos = this.game.player.getPosition(); // calculate the distance between two nodes according to lớn their positions var dist = this.node.position.sub(playerPos).mag(); return dist; , onPicked: function() // When the stars are being collected, invoke the interface in the trò chơi script khổng lồ generate a new star this.game.spawnNewStar(); // then destroy the current star"s node this.node.destroy(); , update: function (dt) // judge if the distance between the star & main character is less than the collecting distance for each frame if (this.getPlayerDistance() this.pickRadius) // invoke collecting behavior this.onPicked(); return; ,

Add score

Điểm sẽ bắt đầu trường đoản cú 0 Lúc trò nghịch ban đầu. 1 điều sẽ được thêm lúc 1 sao được tích lũy. Để hiển thị điểm số, trước tiên họ cần chế tác một node Label. Chọn Canvas vào Node Tree , click chuột phải và lựa chọn Create -> Create Renderer Nodes -> Node With Label. Một node label new sẽ được tạo nên bên dưới node Canvas. Tiếp theo, công ty chúng tôi vẫn áp dụng quá trình sau nhằm tùy chỉnh thiết lập node label này:

Ttuyệt thay tên node thành scoreChọn node score và tùy chỉnh cấu hình position thành (0, 180)Chỉnh sửa ở trong tính String thành Score: 0Đặt Font Size là 50Kéo assets/mikado_outline_shadow(chụ ý! Biểu tượng là

Thêm ngắn gọn xúc tích ghi điểm vào script Game

// trò chơi.js properties: // ... // reference of score label scoreDisplay: default: null, type: cc.Label ,Tiếp đến là khởi chế tạo ra điểm trong onLoad()

// Game.js onLoad: function () // ... // initialize scoring this.score = 0; ,Sau đó thêm một cách làm mới được lấy tên gainScore :

// trò chơi.js gainScore: function () this.score += 1; // update the words of the scoreDisplay Label this.scoreDisplay.string = "Score: " + this.score; ,

Invoke ăn điểm của trò đùa vào Star

// Star.js onPicked: function() // when the stars are being collected, invoke the interface in the trò chơi script to generate a new star this.game.spawnNewStar(); // invoke the scoring method of the Game script this.game.gainScore(); // then destroy the current star"s node this.node.destroy(); ,

Kéo những nguyên tố vào xúc tích game

Chọn Canvas chú ý quý phái Properties và xem xét phần trò chơi sẽ sở hữu những trường nhu sau


Đây chính là những properties ta vẫn có mang trong tệp tin trò chơi.js. Tiếp theo ta buộc phải kéo các nhân tố cần thiết vào đây.


Sau khi đã nâng những yếu tố vào properties thì ta bắt buộc xóa node star trên Node Tree đi. Vì về sau ta sẽ generate những star bằng Prefab phải thằng node này sẽ không còn cần thiết nữa. Nếu không xóa đi nó có khả năng sẽ bị hiện tượng kỳ lạ thời điểm như thế nào cũng đều có 2 ngôi sao sáng cùng một ngôi sao không bao giờ biến mất như thế này. À nhân thể thể test coi công dụng luôn nhá


Kết quả đã ok

Game Over

Ta sẽ thiết lập thời gian mở ra của ngôi sao để triển khai sao từ bỏ Khi ngôi sao được lộ diện mà 60s sau chẳng hạn, nhưng mà nó ko được thu thập thì sẽ game over. Vây đầu tiên bắt buộc thêm đổi mới đếm thời gian

// trò chơi.js onLoad: function () // ... // initialize timer this.timer = 0; this.starDuration = 0; // generate a new star this.spawnNewStar(); // initialize scoring this.score = 0; ,Sau đó thêm súc tích đặt lại cỗ định thời vào cuối spawnNewStar thủ tục, trong đó this.minStarDuration với this.maxStarDuration là những ở trong tính của Game được knhì báo nghỉ ngơi đầu. Chúng được sử dụng để quy định Tỷ Lệ tự dưng của thời gian sao:

// Game.js spawnNewStar: function() // ... // remix timer, randomly choose a value according the scale of star duration this.starDuration = this.minStarDuration + Math.random() * (this.maxStarDuration - this.minStarDuration); this.timer = 0; ,Thêm xúc tích cập nhật cỗ đếm thời gian với phán đoán thừa thừa thời lượng cho cách thức update:

// trò chơi.js update: function (dt) // update timer for each frame, when a new star is not generated after exceeding duration // invoke the ngắn gọn xúc tích of game failure if (this.timer > this.starDuration) this.gameOver(); return; this.timer += dt; ,Cuối thuộc, thêm cách thức gameOver

// Game.js gameOver: function () this.player.stopAllActions(); //stop the jumping action of the player node cc.director.loadScene("game"); Để fan đùa biết rằng ngồi sao sắp đến biến mất ta cần có mang đến nó một cảm giác bằng cách sút opacity của chính nó xuống làm nó mờ dần dần đi.

// Star.js update: function() // ... // update the transparency of the star according lớn the timer in the Game script var opacityRatio = 1 - this.game.timer/this.game.starDuration; var minOpacity = 50; this.node.opathành phố = minOpacity + Math.floor(opacityRatio * (255 - minOpacity));

Thêm cảm giác âm tkhô cứng cho Player

Game mà lại im thin thít thì vô cùng khô mát, bây chừ bọn họ vẫn thêm vào cho nó cảm giác âm thanh hao Khi nó thực hiện các hành vi.

Trước tiên, thêm hiệu ứng âm tkhô cứng nhảy đầm. Msinh hoạt Player.js với thêm trực thuộc tính tmê say jumpAudio

// Player.js properties: // ... // jumping sound effect resource jumpAudio: default: null, type: cc.Audiovideo clip , ,Sau kia viết lại thủ tục setJumpkích hoạt cnhát cuộc Hotline lại nhằm phạt cảm giác âm tkhô cứng cùng phân phát âm thanh bằng phương pháp thêm thủ tục playJumpSound

// Player.js setJumpAction: function () // jump up var jumpUp = cc.moveBy(this.jumpDuration, cc.v2(0, this.jumpHeight)).easing(cc.easeCubicActionOut()); // jump down var jumpDown = cc.moveBy(this.jumpDuration, cc.v2(0, -this.jumpHeight)).easing(cc.easeCubicActionIn()); // add a callbaông xã function to lớn invoke other defined methods after the action is finished var callbaông chồng = cc.callFunc(this.playJumpSound, this); // repeat unceasingly, và invoke callbaông chồng lớn play sound after landing each time return cc.repeatForever(cc.sequence(jumpUp, jumpDown, callback)); , playJumpSound: function () // invoke sound engine to play the sound cc.audioEngine.playEffect(this.jumpAudio, false); ,

Hiệu ứng âm tkhô hanh Khi ghi điểm

Thêm nằm trong tính âm thanh hao ăn điểm vào Game.js

// trò chơi.js properties: // ... // scoring sound effect resource scoreAudio: default: null, type: cc.Audiođoạn phim ,Sau đó chèn vào phương thức gainScore

// trò chơi.js gainScore: function () this.score += 1; // update the words of the scoreDisplay Label this.scoreDisplay.string = "Score: " + this.score.toString(); // play the scoring sound effect cc.audioEngine.playEffect(this.scoreAudio, false); ,Tiếp cho làm tựa như như kéo cá thành phần, giờ đồng hồ ta đang kéo các tệp tin audio vào ô nằm trong tính khớp ứng.


Đã hoàn tất tiếng họ test trả nghiệm thôi

Build với Deploy

Build

Phần Build của chính nó vô cùng đơn giản dễ dàng. Chọn Project -> lựa chọn Build



Vậy là vẫn build kết thúc giờ đồng hồ có thể demo tác dụng build bằng cách chọn Play

Deploy

Để đơn giản dễ dàng hóa việc deploy bọn họ sẽ sử dụng surge: https://surge.sh/


insttall cực kỳ 1-1 giản

npm install --global surgesau khi sẽ setup ta vẫn vào thỏng mục mà vừa nãy ta build ra và msinh sống terminal

Và đây là công dụng :http://gamestar.surge.sh/

Tổng kết

Đến đây chắc hẳn hầu hết bạn đã hiểu phương pháp làm sao để gia công đa số game đơn giản dễ dàng với Cocos Creator rồi. Còn nếu muốn tạo ra những game tinh vi hơn vậy thì rất cần được đọc docs với xem thêm từ bỏ đông đảo thành phầm đi trước không ít nữa. Cảm ơn các bạn sẽ quyên tâm cho bàì viết, siêu vui và hẹn gặp lại nghỉ ngơi hầu như nội dung bài viết tiếp sau.

Nếu chúng ta có hứng thú với game socket có thể tìm hiểu thêm game nhưng mà mình với bạn vào team sẽ làm. Nó bao gồm tích hòa hợp áp dụng cả websocket để đùa cùng blockchain để lưu lại tác dụng phải, Tuy khá sơ sài nhưng chắc chắn rằng sẽ giúp được ai kia nếu như yêu cầu. Và nhất là thằng này chưa hỗ chợ SocketIO nếu như muốn tích phù hợp sẽ rất khó khăn theo như docs của chính nó tất cả nói vậy, yêu cầu bản thân đành bùi ngùi áp dụng Websocket. Đây là link game và cần phải có ví metamask mới nghịch được nha:https://github.com/ngovannghia1997kma/HeadBall2

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *