cocos對象池的使用


enemy.js

cc.Class({
    extends: cc.Component,

    properties: {

        enemySpeed: 0, //設置加速度
    },

    //初始化當前節點的y坐標
    init: function () { 
        this.node.y = 0;
    },
    onLoad () { 

    },

    start () {

    },

    update (dt) { 
        this.node.y += this.enemySpeed; //每幀運動
    },
});

game.js

cc.Class({
    extends: cc.Component,

    properties: {

        enemyPrefab: { 
            default: null,
            type: cc.Prefab,
        },
    },

    createEnemy: function (parentNode) {
        let enemy = null;
        if (this.enemyPool.size() > 0) { // 通過 size 接口判斷對象池中是否有空閑的對象
            enemy = this.enemyPool.get();
        } else { // 如果沒有空閑對象,也就是對象池中備用對象不夠時,我們就用 cc.instantiate 重新創建
            enemy = cc.instantiate(this.enemyPrefab);
        }
        enemy.parent = parentNode; // 將生成的敵人加入節點樹
        this.enemyNew = enemy;
        enemy.getComponent('enemy').init(); //接下來就可以調用 enemy 身上的腳本進行初始化,
        //如果不初始化enemy,在從對象池中獲取this.enemyPool.get();的時候,該enemy身上的腳本參數還接着上次調用的時候;
        //因為執行this.enemyPool.put();只是把enemy重新放回對象池,並不是真正銷毀;執行this.enemyPool.get()又可以重新獲取出來;
    },

    //監聽鍵盤
    setInputControl: function () { 
        cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
        
    },

    onKeyDown: function (event) {

        switch(event.keyCode) {
            case cc.KEY.t:
                this.enemyPool.put(this.enemyNew);    //點擊鍵盤T鍵銷毀敵人
                break;
            case cc.KEY.c:
                this.createEnemy(this.node);  //點擊C鍵創建敵人
                break;
        }
    },


    onLoad () { 
        this.enemyPool = new cc.NodePool(); //new一個對象池出來
        this.setInputControl();  //加載場景后持續監聽鍵盤

    },

    // start () {
    //     console.log(this.enemyPool.size());
    //     this.createEnemy(this.node);
        
    // },

    update (dt) { 
        console.log(this.enemyPool.size());
    },
});


免責聲明!

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



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