這次加個水管,效果是生成水管,並且讓水管自動向左移動
源碼和素材可在公衆號獲取(發送FlappyBird):
製作水管預製
cocoscreator在生成節點的策略中,提供了預製節點的方案,就相當於把節點的默認值設定好,然後保存爲文件,在需要的時候利用腳本生成。
像素鳥中需要不停的生成水管,所以需要用到水管的預製節點。
cocoscreator中製作預製節點需要先用設置普通節點的方法設置節點,然後將節點拖入資源中。
設置單個節點
在我提供的素材中,有水管的上部分和下部分:
在層級管理器(就是遊戲存放節點的地方)中新建一個節點,名叫pipe,把上面兩個圖片拖入該節點生成該節點的子節點:
做好之後應該長這樣。
然後來編輯這兩個水管,首先先讓水管的x值都爲0,y值讓pipe_down爲580,pipe_up爲-580,寬度爲52,長度爲1000(長度1000是爲了讓他可以超出屏幕,不會被玩家看到尾部,y值爲580的目的是長度的一半是500,然後就會多80的間隙,兩個水管都這樣設置就會在中間有160的間隙,可以讓鳥通過):
上圖爲pipe_down的設置,pipe_up的值只有position的y是負的,其他都一樣。
設置好之後,你會發現圖變形了,水管頭部會被拉伸,就會很難看,這是因爲cocoscreator默認對圖像進行原來xy直接拉昇,這個需要設置一下,讓他不該拉伸的不拉伸。
這邊只設置pipe_down的,pipe_up記得自己設置下。
在左側層級管理器中點擊pipe_down節點,在右邊的屬性檢查器中點擊下圖的編輯。
然後應該會出現如下界面:
上圖中的值是設置好的,照着設置就行,pipe_up的區別是Bottom爲0,Top爲30。
解釋一下,這個東西是一個九宮格的圖像設置:
圖像設置之後,位於被拉的區域,在圖像大小改變之後就會被拉伸,位於不拉的區域,圖像大小改變之後就不會做改變。
將上下都設置好之後,水管應該是這個樣子的,整體的位置在哪無所謂,兩個水管的相對位置一樣就行:
製作預製:
把單個節點設置好之後,就可以做成預製節點(Prefab)了,在資源管理器中新建一個文件夾,名字叫Prefab,把層級管理器中的pipe節點拖入剛剛新建的文件夾中,結果應該是這樣的:
pipe是一個整體,注意將整個pipe拖入,拖入之後就可以在層級管理器中把pipe整個刪掉。
以後要修改水管的話,雙擊pipe的預製文件,就可以對它進行編輯。
開始整水管生成的邏輯
要生成水管的話,我們最好新建一個所有水管的父節點,以便對水管進行管理。在層級管理器中新建pipes:
之後生成的節點都會存放在這個文件夾中,我們生成節點和移動節點的腳本也會掛載在這個節點中。
開始寫腳本
在Script文件夾中新建一個javascripe腳本文件,名字叫做pipes:
雙擊打開,開始編寫代碼,在後面都有源碼,如果有看圖片看不懂的,可以直接看源碼:
首先,在我們需要在節點中應用到預製節點,這邊還加了一個水管速度的屬性:
pipePrefab就是水管的預製,pipe_speed就是水管移動的速度,後面需要在編輯器中對這兩個值進行設置。
取到預製節點之後,我們需要寫一個函數,利用預製生成一個節點,並讓這個腳本掛載的節點爲生成節點的父節點:
上面代碼中,41行是對函數的定義,括號中的position是傳入的變量。42行定義了一個變量,名字叫newPipe,用於表示生成的預製節點,等號後面的就是生成節點用的。43行把這個節點設置爲了這個腳本掛載節點的子節點。44行設置了新生成節點的位置。
寫好之後,我們需要在遊戲一開始的時候,生成一個水管,在onLoad函數中添加:
onLoad函數表示節點生成後加載的代碼,相當於初始化。17行調用了我們上面寫的函數,生成了一個節點,需要注意的是括號中的傳值,cc.v2()函數用於生成一個cocoscreator的二維座標,第一個參數爲x值,第二個參數爲y值,這邊y值調用了另一個函數,這個函數用於隨機生成一個固定範圍內的y值,函數具體如下:
上圖不做過多解釋了,不懂請自行百度。
最後,我們需要移動水管,代碼如下:
具體功能圖片中都寫了,需要提的是updata是每一個週期執行一次。
全部代碼:
cc.Class({
extends: cc.Component,
properties: {
pipePrefab:{
default: null,
type: cc.Prefab
},
pipe_speed: 0
},
// LIFE-CYCLE CALLBACKS:
onLoad () {
this.spawnNewPipe(cc.v2(150, this.spawnY()));
},
start () {
},
update (dt) {
//移動水管
for(let i = 0; i < this.pipe_speed; i++){
var children = this.node.children;
for(let j = 0; j < children.length; j++){
children[j].x--;
//生成新的水管
if(children[j].x == -50)
this.spawnNewPipe(cc.v2(350, this.spawnY()));
//銷燬水管
if(children[j].x <= -500)
children[j].destroy();
//todo 在鳥越過水管之後,分數++
}
}
},
spawnNewPipe: function(position){
var newPipe = cc.instantiate(this.pipePrefab);
this.node.addChild(newPipe);
newPipe.setPosition(position);
},
spawnY: function(){
//爲水管生成一個y座標,上下封頂分別爲350,-350
return (Math.random()*2-1)*350;
}
});
設置,運行
點擊pipes,把pipes腳本拖入右邊空白的地方,把pipe的預製拖入pipe prefab框框中,設置pipe speed爲2,保存,點擊上面的小三角運行,沒問題的話就可以看到生成了水管,並且不斷向左邊移動。