aircraft-war(四)

aircraft-war(四)

敵機分為三種類型,所以需要三種Prefab,分別有自己的爆炸動畫,可以共用一套腳本,要隨機出現X軸初始位置。
接下來先制作一個“可以被擊落的敵機”:

敵機Demo

從資源選擇器中拖拽素材到層級選擇器 → 添加碰撞組件 → 添加動畫組件(在資源管理器創建動畫資源) → 編寫腳本 → (將組建從層級選擇器拖拽到資源選擇器(Prefab資源))
碰撞組件之前剛做過,再次跳過,下圖為添加動畫組件:

image.png

接下來編寫腳本:

// enemy.js
cc.Class({
    extends: cc.Component,

    properties: {
        HP: {
            default: 0,
            type: cc.Integer,
            tooltip: '敵機血量',
        },
        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中零時使用,后續要使用對象池,參考bullet
        this.node.destroy();
    }
});

接下來需要給子彈Prefab添加碰撞組件。
在這里會遇到一個問題,各個組件都有碰撞組件,那敵機相互不就撞毀了嗎?有沒有什么辦法可以限制碰撞對象?

碰撞分組管理

使用碰撞分組管理

image.png

之后在組件的屬性檢查器中選擇分組:


image.png

接下來修改腳本:

cc.Class({
    extends: cc.Component,

    properties: {
        HP: {
            default: 0,
            type: cc.Integer,
            tooltip: '敵機血量',
        },
        speedMax: 0,
    },

    // use this for initialization
    onLoad: function () {
        // 速度隨機[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中零時使用,后續要使用對象池,參考bullet
        this.node.destroy();
    }
});

Bullet:

cc.Class({
   // ...
    //碰撞檢測
    onCollisionEnter: function(other, self){
        this.bulletGroup.destroyBullet(self.node);
    },
   // ...
});

第一步就算完成了,實現功能是第一步,接下來要做的就是使用對象池,制作大批敵機,處理敵機出現的位置:

image.png

代碼在這里

敵機組

先將其他兩種類型的敵機做成Prefab作為準備資源,然后創建參考bulletGroup的制作方式,來制作enemyGroup。


image.png

腳本代碼請參考——敵機組起飛代碼
現在敵機組也起飛了,但是有個問題,被銷毀的敵機回歸對象池后,下一次出場時,還保持著被銷毀時的狀態,所以需要初始化一下:

image.png

給enemy.js添加初始化函數:

// 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--;
        }
    },

然后在創建敵機的時候,要執行一遍初始化函數:

// enemyGroup.js
 // 生成敵機
    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;
        // 初始化敵機狀態
        newNode.getComponent('enemy').enemyInit();
    },

參考代碼在這里
到這里,整體主要功能都已經實現,接下來要完成的,是游戲的積分、開始暫停與音效。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • This article is a record of my journey to learn Game Deve...
    蔡子聰閱讀 3,871評論 0 9
  • 111. [動畫系統]如何將其他類型的動畫轉換成關鍵幀動畫? 動畫->點緩存->關鍵幀 112. [動畫]Unit...
    胤醚貔貅閱讀 13,179評論 3 89
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,223評論 4 61
  • 一個夕陽暖暖的午后,村中間‘井子彎’大橋的石墩上,坐著一簇簇的男男女女,老老少少,而路橋東頭的另一頭則聚集了一幫大...
    粉色的桃林閱讀 447評論 12 11
  • 她發現其他供應商在對員工做這項服務的鼓勵機制上是不同的。A又了解了其他同行做相近服務的做法,發現資金投入量是大大超...
    海若音閱讀 242評論 0 0