Thực tế thì mình cũng chả đề xuất là một lập trình viên chăm game xuất xắc gì cả, chỉ là lần này mình có được trao làm cho một project game ngắn hạn từ bỏ anh sếp với được recomend áp dụng Cocos Creator. Sau một thời hạn không quá nhiều năm tiếp xúc với nó thì mình thấy nó cũng khá giỏi phải mong mỏi chia sẻ cho gần như tín đồ về engine này
Theo như bản thân đã đạt được biết thì trước đó Khi chưa có Cocos Creator thì đầy đủ tín đồ vẫn thực hiện Cocos2d-x code bởi C++. Nhược điểm của thằng này là không tồn tại giao diện người lập trình sẵn buộc phải trường đoản cú tưởng tượng code và rồi chạy lên new thấy được hiệu quả. Để khắc chế vấn đề này, có tác dụng tăng công suất và đuổi kịp được cùng với Unity, thì Cocos Creator đã có thành lập. Hiện tại thì thằng này chỉ cung cấp trên MAC cùng Window đề xuất anh em nào cần sử dụng Ubuntu thì có thể vẫn tương đối bi đát.Quý khách hàng sẽ xem: Cocos2d-x là gì
Vậy Cocos2d-x là gì thì Cocos2d-x là 1 trong Engine cung ứng thiết kế Game nhiều căn cơ : sản phẩm điện thoại ( IOS, ANDROID, Blackberry, TIZEN, WP) Window, MacOS, HTML5,.. đại loại là đủ cả. Theo wikipedia thì tác giả của Cocos2d-x là 1 trong những bạn china có tên là Zhe Wang.
Bạn đang xem: Cocos2d-x là gì


2012, at Zynga. With Rolanbởi vì Abarca and Zhe Wang discussing Cocos2d-x’s & cocos2d-iphone’s roadmaps
Lúc Này thì nó vẫn được hầu như bạn trơn giếng cách tân và phát triển hơi là mạnh mẽ và không xong xuôi triển khai xong để biến Unity phiên bạn dạng không tính tiền, tuy thế chặng đường vững chắc vẫn còn đấy khá nhiều năm.
Thực Hành Tạo Và Deploy GameMình thì ko mê thích dài cái mà mình thấy các tốt nhất để học tập một chiếc gì là cứ cho vào làm luôn nó new nhanh khô vỡ lẽ ra được, chứ đọng cứ lý thuyết suông thì siêu khó tưởng tượng.

Đây là Home nhằm download cocos creator : https://www.cocos.com/en/creator
Sau lúc tải về với thiết lập (tải đặc điểm này khá là thọ nha) thì đồ họa chủ yếu của creator đang như vậy này

Giờ họ vẫn đi luôn vào làm cho game trước tiên nhỏng trong docs của cocos giải đáp. Dưới đấy là mối cung cấp assets làm game cùng game vẫn hoàn thành
Assets
Sau khi cài Assets ban sơ về chúng ta vẫn import nó vào creator, siêu đơn giản và dễ dàng chỉ cần kéo thả vào thôi

Scene
Sau Khi đã có Assets ta sẽ khởi tạo các Scene. Scene là 1 trong những bản người yêu 2 chiều và hoàn toàn có thể mlàm việc cơ chế 3 chiều, giúp chúng ta kéo tả, đổi khác tạo nên UI. Mỗi Scene vẫn là một trong màn hình hiển thị hình dáng như là trên web bọn họ sẽ có được trang home page, trang detail, trang about thì scene chính là những view đó. Ta có thể tạo ra những scene cùng đổi khác giữa chúng trong game.
Tại đây ta có thể tùy kéo kéo chỉnh, thay đổi địa điểm của những thực thể thế nào cho bản thân thấy ổn định tuyệt nhất. Có những chế độ kéo thả
Di gửi theo chiều X - Y trước tiên lựa chọn bên góc trái kế tiếp rất có thể di chuyển địa chỉ của thực thểvới biến đổi kích thước
Tại bên trên scene ta chỉ cần cố gắng núm thôi là rất có thể kéo thả, thay đổi kích cỡ cùng dic đưa mọi bản đồ
Properties
Thì ngoại trừ bài toán kéo thả sinh hoạt scene bọn họ cũng có thể biến hóa vị trí, biến hóa độ trong suốt, thêm những script, thêm animation và rất nhiều thức không giống ở trong phần này
Node Tree
Đây lúc Quanh Vùng để ta khẳng định được đâu là thành phần thân phụ con của nhau hoặc thằng làm sao ở lớp trên, thằng như thế nào sống lớp bên dưới.
thằng nào càng sinh sống bên dưới Tức là nó vẫn bên trên lớp cao nhất. Kiểu như ở trong css tất cả nằm trong tính z-index khi ta thực hiện position vậy. Càng sinh sống dưới thì z-index càng tốt và rất có thể che lớp thằng kia. Giống nhỏng cái ground đang bít đi cả thằng PurpleMonster.
Timeline
phần này dùng làm tạo ra những animation đơn giảm chị bắt buộc biến đổi góc nghiêng xuất xắc thay đổi địa điểm 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ờ đồng hồ sau khi đã hiểu hết những phần cùng tác dụng của chính nó bọn họ sẽ lấn sân vào có tác dụng game trước tiên nha
Trước tiên họ nên kéo những nguyên tố của game vào để có một cái UI tổng quát
Sau lúc sử dụng không còn những kiến thức sống trên để kéo thả ra một UI nlỗi trong hình, thì hiện giờ quá trình buộc phải có tác dụng là add thêm những script nhằm bắt sự kiện trong game. Tạo một thư mục scripts --> với new một file Player.js.
Tạo folder
// Player.js cc.Class( extends: cc.Component, properties: // foo: // // ATTRIBUTES: // default: null, // The default value will be used only when the component attaching // // to a node for the first time // type: cc.SpriteFrame, // optional, mặc định is typeof default // serializable: true, // optional, default is true // , // bar: // get () // return this._bar; // , // phối (value) // this._bar = value; // // , , // LIFE-CYCLE CALLBACKS: // onLoad () , start () , // update (dt) , );Giờ thêm những 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 mang lại ta đang gắn js này cho thằng thực thể PurpleMonster để lát nữa đã cách xử trí sự khiếu nại trong file js này. Quay về màn hình hiển thị vào phần Node Tree nãy mình đã nói, lựa chọn thực thể PurpleMonster tiếp đến lưu ý sang trọng phần properties của nó. Ta đang xuống button Add Component lựa chọn Custom component và lựa chọn Player
// 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ẽ gồm hàm nhảy rồi ta đang mix hàm kia vào onLoad(). Điều này còn có công dụng là nó vẫn chạy ngay sau thời điểm thực thể lại được load ra// Player.js onLoad: function () // initialize jump action this.jumpkích hoạt = this.setJumpAction(); this.node.runAction(this.jumpAction); ,Ok demo coi chạy không nha. Chọn vào nút ít
Xem thêm: Nghĩa Của Từ Assault Là Gì Trong Tiếng Việt? Từ Điển Anh Việt Assault
// Player.js setJumpAction: function () //... , onKeyDown (event) // set 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) // unmix 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ó một switch sống trong để đánh giá coi ta bấm phím nào ngơi nghỉ keydown cùng nhả phím làm sao làm việc keyup. Sau đó mix phía mang đến nó sinh hoạt keydown đến hướng đấy thành true với lúc 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 cảm nhận ác tín lệnh đó của bản thân thì bạn cần khởi sinh sản bàn phím bằng cách như 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 velođô thị this.xSpeed = 0; // Initialize the keyboard input đầu vào listening cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this); cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this); , onDestroy () // Cancel keyboard đầu vào monitoring cc.systemEvent.off(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this); cc.systemEvent.off(cc.SystemEvent.EventType.KEY_UPhường, this.onKeyUp, this); ,Khởi chế tạo ra lắng nghe bàn phím lúc load và bỏ lắng tai khi thực thể kia bị phá hủy
Cuối cùng là phần update địa điểm của nhân vật dụng khi ta bnóng nút// Player.js update: function (dt) // update tốc độ of each frame according to the current acceleration direction if (this.accLeft) this.xSpeed -= this.accel * dt; else if (this.accRight) this.xSpeed += this.accel * dt; // restrict the movement tốc độ of the main character lớn the maximum movement speed 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 đã từng test thì thấy thằng update() này cứ đọng 0,01 giây nó đã hotline một lần
update(dt) console.log("Run in function update() time : ", dt);
Tức là nó đã điện thoại tư vấn hàm gần như 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 đang đánh giá xem người tiêu dùng sẽ bắt nhân thứ chạy về phía như thế nào. Sau này sẽ chuyển đổi địa điểm nhân đồ vật theo phía đó bằng phương pháp trừ giỏi công tọa đọ X với cùng một vận tốc tăng theo thời hạn. Nhưng nhằm phòng ngôi trường hòa hợp tăng tốc độ thừa nhanh khô thì 1 phần giới hạn vận tốc được thiết lập cấu hình ngơi nghỉ ngay lập tức phía 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 à set vị trí mang đến 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 lúc đã triển khai xong xuôi mang lại nhân đồ tiếp nối chúng ta sẽ triển khai đến ngôi sao 5 cánh. Do ngôi sao đã xuất hiện thêm cùng không đủ Khi nhân thứ chạm với nó. Tức là nó sẽ tiến hành tạo thành cùng tiêu diệt đi liên lục vì vậy tại chỗ này ta đã cồn chạm mang đến một khái niệm Prefab. Prefab là phần đa node gần như thực thể ta đã tạo thành dẫu vậy nên áp dụng đi sử dụng lại những lần, nó y như có mang component nghỉ ngơi trong các framework React giỏi Vue vậy.Thì hiện thời ta sẽ tạo ra những Prefab những điều đó bằng cách kéo ngôi sao sáng vào Scene cùng sinh sản một file script rồi add vào mang đến nó.// Star.js properties: // When the distance between the star and main character is less than this value, collection of the point will be completed pickRadius: 0, ,
Rồi sau thời điểm đã add script mang lại nó ta phát triển thành nó thành 1 một Prefab bằng cách. Kéo nó từ bỏ Scene xuống ô Assets vậy là xong
// 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 và controlling the movement switch of the main character player: default: null, type: cc.Node ,starPrefab ta nhằm type là Prefab. bây giờ add script này đến thằng Canvas đẩy lên phần Node Tree --> chọn Canvas --> rồi Properties lựa chọn Add Component và chọn file script Game
Rồi giờ cho phần Generate sao bằng phương pháp random vị trí// trò chơi.js onLoad: function () // obtain the anchor point of ground cấp độ 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 preset template var newStar = cc.instantiate(this.starPrefab); // put the newly added node under the Canvas node this.node.addChild(newStar); // phối 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 level và 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 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 to lớn the anchor point of the star return cc.v2(randX, randY); ,Test nào
// trò chơi.js spawnNewStar: function() // ... // Staging a reference of Game object on a star component newStar.getComponent("Star").game = this; ,// Star.js getPlayerDistance: function () // judge the distance according lớn 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 lớn 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 và 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ò đùa bắt đầu. 1 điểm sẽ tiến hành thêm lúc một sao được thu thập. Để hiển thị điểm số, trước tiên chúng ta buộc phải sản xuất một node Label. Chọn Canvas vào Node Tree , nhấn vào bắt buộc với lựa chọn Create -> Create Renderer Nodes -> Node With Label. Một node label mới sẽ được tạo bên dưới node Canvas. Tiếp theo, công ty chúng tôi đang sử dụng công việc sau nhằm cấu hình thiết lập node label này:Txuất xắc đổi tên node thành scoreChọn node score và tùy chỉnh position thành (0, 180)Chỉnh sửa trực thuộc tính String thành Score: 0Đặt Font Size là 50Kéo assets/mikado_outline_shadow(crúc ý! Biểu tượng làThêm 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 mang lại là khởi tạo thành điểm vào onLoad()
// trò chơi.js onLoad: function () // ... // initialize scoring this.score = 0; ,Sau kia thêm 1 cách làm mới chọn cái tên gainScore :
// Game.js gainScore: function () this.score += 1; // update the words of the scoreDisplay Label this.scoreDisplay.string = "Score: " + this.score; ,
Invoke ghi điểm của trò chơi trong Star
// Star.js onPicked: function() // when the stars are being collected, invoke the interface in the Game script lớn generate a new star this.game.spawnNewStar(); // invoke the scoring method of the trò chơi 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 nhìn sang trọng Properties với chú ý phần Game sẽ có những ngôi trường nhu sauĐây đó là những properties ta vẫn tư tưởng trong file trò chơi.js. Tiếp theo ta đề nghị kéo các nhân tố cần thiết vào đó.
Sau khi đã kéo những nhân tố vào properties thì ta cần xóa node star bên trên Node Tree đi. Vì sau đây ta đã generate những star bằng Prefab cần thằng node này sẽ không cần thiết nữa. Nếu không xóa đi nó có khả năng sẽ bị hiện tượng lạ cơ hội như thế nào cũng có thể có 2 ngôi sao cùng một ngôi sao 5 cánh ko lúc nào biến mất như vậy này. À tiện thể thể thử nghiệm coi công dụng luôn nhá
Kết quả đang ok
trò chơi Over
Ta vẫn thiết lập cấu hình thời gian mở ra của ngôi sao 5 cánh để triển khai sao từ bỏ khi ngôi sao 5 cánh được xuất hiện thêm mà lại 60s sau chẳng hạn, mà lại nó ko được thu thập thì sẽ game over. Vây trước tiên đề nghị thêm đổi thay đếm thời gian
// Game.js onLoad: function () // ... // initialize timer this.timer = 0; this.starDuration = 0; // generate a new star this.spawnNewStar(); // initialize scoring this.score = 0; ,Sau kia thêm lô ghích đặt lại cỗ định thời vào cuối spawnNewStar cách tiến hành, trong số ấy this.minStarDuration với this.maxStarDuration là các thuộc tính của Game được khai báo sống đầu. Chúng được sử dụng để giải pháp tỷ lệ hốt nhiên của thời gian sao:
// trò chơi.js spawnNewStar: function() // ... // reset 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 update cỗ đếm thời gian với phán đoán thù vượt quá thời lượng đến phương thức update:
// Game.js update: function (dt) // update timer for each frame, when a new star is not generated after exceeding duration // invoke the 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 làm gameOver
// trò chơi.js gameOver: function () this.player.stopAllActions(); //stop the jumping action of the player node cc.director.loadScene("game"); Để người chơi hiểu được ngồi sao sắp tới biến mất ta cần phải có cho nó một hiệu ứng bằng cách bớt opacity của nó xuống làm nó mờ dần đi.
// Star.js update: function() // ... // update the transparency of the star according to the timer in the Game script var opacityRatio = 1 - this.game.timer/this.game.starDuration; var minOpađô thị = 50; this.node.opađô thị = minOpacity + Math.floor(opacityRatio * (255 - minOpacity));
Thêm hiệu ứng âm thanh mang lại Player
trò chơi nhưng vắng lặng thì vô cùng ráo mát, hiện thời họ sẽ thêm cho nó hiệu ứng âm tkhô hanh lúc nó tiến hành những hành động.trước hết, thêm cảm giác âm thanh hao dancing. Msinh hoạt Player.js với thêm ở trong tính tđắm đuối jumpAudio// Player.js properties: // ... // jumping sound effect resource jumpAudio: default: null, type: cc.Audiođoạn phim , ,Sau đó viết lại phương thức setJumpkích hoạt cnhát cuộc hotline lại để phân phát cảm giác âm thanh hao với phát âm tkhô cứng bằng cách thêm phương thứ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 xã = cc.callFunc(this.playJumpSound, this); // repeat unceasingly, and invoke callbaông chồng to 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 thanh khô Khi ghi điểm
Thêm thuộc tính âm tkhô cứng ghi điểm vào Game.js// trò chơi.js properties: // ... // scoring sound effect resource scoreAudio: default: null, type: cc.Audiovideo clip ,Sau kia cnhát vào cách làm 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 đến làm tương tự như nlỗi kéo cá nguyên tố, giờ ta vẫn kéo những file audio vào ô thuộc tính tương xứng.
Đã hoàn chỉnh giờ đồng hồ bọn họ demo trả nghiệm thôi
Build cùng DeployBuild
Phần Build của chính nó khôn cùng đơn giản và dễ dàng. Chọn Project -> lựa chọn Build
Vậy là sẽ build chấm dứt giờ đồng hồ hoàn toàn có thể kiểm tra kết quả build bằng phương pháp lựa chọn Play
Deploy
Để dễ dàng và đơn giản hóa vấn đề deploy bọn họ đã thực hiện surge: https://surge.sh/
npm install --global surgesau khoản thời gian vẫn cài đặt ta đã vào thư mục mà vừa nãy ta build ra cùng mlàm việc terminal
Và đây là kết quả :http://gamestar.surge.sh/
Tổng kếtĐến phía trên chắc rằng rất nhiều tín đồ đã biết cách làm thế nào để triển khai số đông game dễ dàng và đơn giản với Cocos Creator rồi. Còn nếu còn muốn sản xuất rất nhiều game phức tạp hơn nữa thì cần phải phát âm docs và xem thêm tự gần như sản phẩm đi trước tương đối nhiều nữa. Cảm ơn chúng ta đã quyên tâm mang lại bàì viết, rất vui cùng hứa chạm mặt lại nghỉ ngơi hầu hết nội dung bài viết tiếp theo.
Nếu các bạn tất cả hứng trúc cùng với game socket rất có thể tìm hiểu thêm game nhưng mà bản thân cùng bạn trong team đã có tác dụng. Nó có tích hòa hợp thực hiện cả websocket nhằm chơi cùng blockchain để lưu lại hiệu quả yêu cầu, mặc dù hơi sơ dùng tuy thế chắc là để giúp được ai kia trường hợp đề nghị. 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ỏng docs của chính nó bao gồm 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 cùng cần phải có ví metamask bắt đầu chơi được nha:https://github.com/ngovannghia1997kma/HeadBall2