cocos creator制作微信抖音小游戲《黃金礦工》


微信小游戲,抖音小游戲,非常適合個人開發者創業,不用版號,門檻低,同時抖音小游戲的系統算法推薦,能讓好的游戲脫穎而出, 你要做的就是把游戲做好就可以了。

 

這個系列的文章,配套了視頻教程講解與課程資源,課程源碼。下面開始講解黃金礦工的具體制作流程。

這里有個cocos creator學習交流小組點擊可以直接加入,一起學習交流吧

1:開發工具的基本使用

教程的開發工具選用cocos creator, 開發語言選用TypeScript。首先我們創建項目,導入素材,素材如圖:

 

項目路徑不要使用中文和空格,使用英文或英文縮寫,項目工程里面的目錄結構要清晰,在Assets下面我們分成Res, Scene, Scripts,。

 

 

 

2: 搭建《黃金礦工》游戲場景

一般做一個2D游戲,我們會把一個游戲的場景分成下面幾個層次:

a: 游戲背景層 b: 游戲地圖層 c: 角色物品層, d: 游戲UI層,我們按照這個層次,把黃金礦工的游戲地圖分類進行放好,如圖:

 

 

BackGound: 背景層,

LogicMap: 邏輯地圖層,黃金礦工還有什么地圖呢?主要是要把邊緣表示出來, 我們使用了碰撞檢測系統, 所以把邊緣堵上牆,作為我們的邏輯地圖,也就是加Box碰撞器,如圖:

 

 

GoldRoot 黃金物品的跟節點,所有的黃金生成出來后都放這個根節點下。

 

 

Player: 游戲主角,就是我們的礦工的繩子和鈎子。這個制作的時候一個技巧,主角是由繩子,和繩子斷點上的金屬圓環組成。

 

 

Player的原點在繩子的一頭,所以繩子作為Player的孩子,錨點要為[0.5, 1], 繩子的長度可能會變化,我們修改body的高度就可以讓繩子有變化。比如繩子長度為200,我們把body這個節點的高度改成200,即可

 

金屬探測圓環,我們命名為header, header 的位置是與繩子的高度相關的,在最下面,我們觀察一下坐標,

 

得到一個結果, header的坐標: -(繩子長度 + 10)。

 

UIRoot層:用來放我們用戶的UI操作相關。

場景搭建就此搭建完畢。

 

3: Type Script代碼開發

Step1: 新建一個組件類,被引擎識別, 這個非常簡單,直接右鍵新建一個TS腳本即可

Step2: new 組件實例,到場景的節點上。這個有兩種方式,可以編輯器添加組按鈕來添加, 可以代碼addComponent(類型)添加, 本質 new 組件類的實例添加到節點上。

Step3: 游戲引擎特定時期,調用特定的入口, 我們寫代碼如果沒有人調用是不值錢的,所以必須要讓引擎調用到,引擎會在特定的時期,調用我們特定的入口,我們只要往特定的入口插入代碼即可,開始運行之前調用 組件實例.start();每次刷新的時候調用組件實例.update(),等這些規定的接口。引擎通過運行場景,找到場景的節點,找到節點上組件實例,來獲得組件實例,這也就是組件實例為什么一定要添加到節點上就是這個原因。

 

 

4: TypeScript 代碼模板介紹:

cc: cocos creator;

cc._decorator: 名字空間,定義了裝飾器/注解

ccclass: 裝飾/注解 一個類是一個組件類; property: 裝飾/注解 一個類的數據成員 綁定到編輯器;

@開頭表示裝飾注解

cc.Component: 組件類的基類;

export default: 外部要使用這個類,import default 來獲取這個類型;

@ccclass

export default class GameMgr extends cc.Component {

// 權限 名字: 類型 = 默認值;

@property

private isDebug: boolean = false;

}

5: 黃金礦工核心思路分析

黃金礦工游戲玩法中,要碰到黃金等物品,還有要碰到邊緣等物品,所以我們要利用碰撞檢測系統來做碰撞檢測。

Setp1: 開啟碰撞檢測, 分為兩個步驟,代碼如下:

// 開啟碰撞檢測,一定要在onLoad里面

onLoad () {

 

// step1: 開啟碰撞檢測系統, 默認是關閉;

cc.director.getCollisionManager().enabled = true;

 

// step2: 配置調試區域, debugDraw

if(this.is_debug) {

cc.director.getCollisionManager().enabledDebugDraw = true;

}

else {

cc.director.getCollisionManager().enabledDebugDraw = false;

}

}

 

Step2: 編輯碰撞區域。

黃金需要編輯碰撞區域,游戲地圖的3個邊需要編輯碰撞區域, 礦工的圓形金屬探測器需要添加碰撞器。

 

Step3: 類型配置與碰撞關系配置。

這個案例里面我們把物體分成了類型有:邊緣(BORD), 黃金Gold, 探測器Header。分別設置好對應節點的類型。

 

 

 

 

Step4: 碰撞檢測,我們讓金屬探測器Header來做碰撞,碰撞檢測記住一點,那個碰撞器檢測碰撞,就把碰撞檢測的代碼掛到那個碰撞器對應的節點上,所以新建一個代碼來做碰撞檢測,實現碰撞檢測的函數入口

const {ccclass, property} = cc._decorator;

@ccclass

export default class HeaderCtrl extends cc.Component {

onCollisionEnter(other, self): void {

}

}

 

Step5:配置好碰撞關系,哪些類型與哪些類型碰撞,如圖

 

 

 

黃金礦工會有多個游戲狀態,我們這里將其進行分類:

狀體1: 我們的鈎子擺來擺去; --->Idle

狀態2: 我們的鈎子發射出去 ---> Shoot

狀態3: 碰到邊緣我們就彈回來; ---> Back

狀態4: 如果狀態的是黃金我們就把黃金拖回來; BackWithGold

如果還有其他的狀態,你也可以定義好, 我們編寫一個GameMgr代碼,管理整個游戲,在這個代碼里面定義好狀態:

var State = {

Idle: 0,

Shoot: 1,

Back: 2,

BackWithGold: 3,

};

狀態定義完成以后,我們分析一下狀態變化的條件,整理如下:

狀態1---》狀態2: (用戶點擊了屏幕)

狀態2---》狀態3:(鈎子撞到了邊緣)

狀態2----》狀態4(碰到的是黃金)

狀態3/狀態4 ---》狀態1: 繩子拖回來以后,我們便回到狀態1

 

每個狀態的動畫,我們編寫一個函數,用來實現如下圖,在update里面:

 

 

 

// 1===============1===============1===============1=======dt========1

// dt: 迭代,100 * dt

update(dt: number): void {

if(this.state === State.Idle) {

this.idleUpdate(dt);

return;

}

else if (this.state === State.Shoot) {

this.shootUpdate(dt);

return;

}

else if(this.state === State.Back) {

this.backUpdate(dt);

return;

}

else if (this.state == State.BackWithGold) {

this.balckWithGoldUpdate(dt);

return;

}

}

把狀態顯示的接口完成后,接下來編寫狀態改變條件。

用戶點擊屏幕,idle-Shoot狀態,代碼如圖:

 

this.node.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);

 

 

private onTouchStart(): void {

if (this.state !== State.Idle) {

return;

}

 

this.state = State.Shoot;

}

狀態改變的代碼一定要加一個邏輯,就是當前狀態的判斷。

碰到物體后,狀態改變,所以,當金屬圓圈,檢測到碰撞的時候,調用GameMgr的接口,進入判斷檢測函數。

HeaderCtrl.ts 在碰撞函數里面添加

GameMgr.Instance.onGameCollisionEnter(other, self);

 

GameMgr.ts里面實現:

public onGameCollisionEnter(other, self): void {

if (this.state !== State.Shoot) {

return;

}

 

if (other.node.groupIndex === 2) { // 邊緣

this.state = State.Back;

}

else if (other.node.groupIndex === 3) { // 黃金

this.state = State.BackWithGold;

}

}

 

 

狀態遷移改變完成了以后,我們就是實現每種狀態的動畫了,這里我重點要介紹一個函數,

private setRopeLen(len: number): void {

this.ropeBody.height = len;

this.header.y = -(len + 10);

}

這個函數,可以修改繩子的長度,這樣,等繩子拋出去,與拖回來都可以用。

 

狀態遷移邏輯框架實現后,最后我們來往每種狀態里面加代碼。

Idle:

定義一個角速度,定義當前角度,update不斷累加,如果超過左邊,就轉變方向

如果超過右邊,也換個方向到左邊。

private idleUpdate(dt: number): void {

this.nowDegree += (this.wSpeed * dt);

this.player.angle = this.nowDegree;

if (this.nowDegree <= -60) {

this.wSpeed = -this.wSpeed;

}

else if(this.nowDegree >= 60) {

this.wSpeed = -this.wSpeed;

}

}

 

Shoot:

定一個繩子生長的速度,每次update, 繩子長度變化(速度*時間)

private shootUpdate(dt: number): void {

this.nowLen += (this.shootSpeed * dt);

this.setRopeLen(this.nowLen);

}

 

Back:

碰到邊緣返回,直接把繩子的長度,由Shoot的變長,變成變短,所以是減。

private backUpdate(dt: number): void {

this.nowLen -= (this.shootSpeed * dt);

if (this.nowLen <= 100) {

this.nowLen = 100;

this.state = State.Idle;

}

this.setRopeLen(this.nowLen);

}

 

BackWithGold:

勾上黃金的狀態,我就留給大家自己來寫了。

private balckWithGoldUpdate(dt: number): void {

 

}

 

 

這樣就實現了黃金礦工的核心玩法。本次課除了有文字,還配備有 完整視頻教程,游戲素材,課程代碼,需要的可以進入交流小組。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM