aircraft-war(四)
敵機(jī)分為三種類型浑玛,所以需要三種Prefab,分別有自己的爆炸動(dòng)畫噩咪,可以共用一套腳本顾彰,要隨機(jī)出現(xiàn)X軸初始位置。
接下來先制作一個(gè)“可以被擊落的敵機(jī)”:
敵機(jī)Demo
從資源選擇器中拖拽素材到層級(jí)選擇器 → 添加碰撞組件 → 添加動(dòng)畫組件(在資源管理器創(chuàng)建動(dòng)畫資源) → 編寫腳本 → (將組建從層級(jí)選擇器拖拽到資源選擇器(Prefab資源))
碰撞組件之前剛做過胃碾,再次跳過涨享,下圖為添加動(dòng)畫組件:
接下來編寫腳本:
// enemy.js
cc.Class({
extends: cc.Component,
properties: {
HP: {
default: 0,
type: cc.Integer,
tooltip: '敵機(jī)血量',
},
speedMax: 0,
},
// use this for initialization
onLoad: function () {
this.speed = cc.random0To1() * this.speedMax;
let manager = cc.director.getCollisionManager();
manager.enabled = true;
},
//碰撞檢測
onCollisionEnter: function(other, self){
},
// called every frame, uncomment this function to activate update callback
update: function (dt) {
this.node.y -= dt * this.speed;
},
onHandleDestroy: function () {
// Demo中零時(shí)使用,后續(xù)要使用對(duì)象池仆百,參考bullet
this.node.destroy();
}
});
接下來需要給子彈Prefab添加碰撞組件厕隧。
在這里會(huì)遇到一個(gè)問題,各個(gè)組件都有碰撞組件俄周,那敵機(jī)相互不就撞毀了嗎吁讨?有沒有什么辦法可以限制碰撞對(duì)象?
碰撞分組管理
使用碰撞分組管理:
之后在組件的屬性檢查器中選擇分組:
接下來修改腳本:
cc.Class({
extends: cc.Component,
properties: {
HP: {
default: 0,
type: cc.Integer,
tooltip: '敵機(jī)血量',
},
speedMax: 0,
},
// use this for initialization
onLoad: function () {
// 速度隨機(jī)[speedMax, speedMin]
this.speed = Math.random() * (this.speedMax - this.speedMin + 1) + this.speedMin;
let manager = cc.director.getCollisionManager();
manager.enabled = true;
},
//碰撞檢測
onCollisionEnter: function(other, self){
if (other.node.group !== 'bullet') {
return;
}
if (this.HP === 0) {
this.HP--;
let anim = this.getComponent(cc.Animation);
let animName = this.node.name + '_exploding';
anim.play(animName);
anim.on('finished', this.onHandleDestroy, this);
return;
}
if (this.HP > 0) {
this.HP--;
}
},
// called every frame, uncomment this function to activate update callback
update: function (dt) {
this.node.y -= dt * this.speed;
},
onHandleDestroy: function () {
// Demo中零時(shí)使用栈源,后續(xù)要使用對(duì)象池挡爵,參考bullet
this.node.destroy();
}
});
Bullet:
cc.Class({
// ...
//碰撞檢測
onCollisionEnter: function(other, self){
this.bulletGroup.destroyBullet(self.node);
},
// ...
});
第一步就算完成了竖般,實(shí)現(xiàn)功能是第一步甚垦,接下來要做的就是使用對(duì)象池,制作大批敵機(jī)涣雕,處理敵機(jī)出現(xiàn)的位置:
敵機(jī)組
先將其他兩種類型的敵機(jī)做成Prefab作為準(zhǔn)備資源艰亮,然后創(chuàng)建參考bulletGroup的制作方式,來制作enemyGroup挣郭。
腳本代碼請(qǐng)參考——敵機(jī)組起飛代碼
現(xiàn)在敵機(jī)組也起飛了迄埃,但是有個(gè)問題,被銷毀的敵機(jī)回歸對(duì)象池后兑障,下一次出場時(shí)侄非,還保持著被銷毀時(shí)的狀態(tài),所以需要初始化一下:
給enemy.js添加初始化函數(shù):
// enemy.js
enemyInit: function () {
// 初始化血量
this.enemyHp = this.HP;
// 找到node的Sprite組件
let nSprite = this.node.getComponent(cc.Sprite);
// 初始化spriteFrame
if (nSprite.spriteFrame != this.initSpriteFrame){
nSprite.spriteFrame = this.initSpriteFrame;
}
},
// 碰撞檢測
onCollisionEnter: function(other, self){
if (other.node.group !== 'bullet') {
return;
}
if (this.enemyHp === 0) {
this.enemyHp--;
let anim = this.getComponent(cc.Animation);
let animName = this.node.name + '_exploding';
anim.play(animName);
anim.on('finished', this.onHandleDestroy, this);
return;
}
if (this.enemyHp > 0) {
this.enemyHp--;
}
},
然后在創(chuàng)建敵機(jī)的時(shí)候流译,要執(zhí)行一遍初始化函數(shù):
// enemyGroup.js
// 生成敵機(jī)
genNewEnemy: function (enemyInfo) {
let poolName = enemyInfo.name + 'Pool';
let newNode = D.common.genNewNode(this[poolName], enemyInfo.prefab, this.node);
let pos = this.getNewEnemyPosition(newNode);
newNode.setPosition(pos);
newNode.getComponent('enemy').enemyGroup = this;
// 初始化敵機(jī)狀態(tài)
newNode.getComponent('enemy').enemyInit();
},
參考代碼在這里
到這里逞怨,整體主要功能都已經(jīng)實(shí)現(xiàn),接下來要完成的福澡,是游戲的積分叠赦、開始暫停與音效。