cocos creator 事件队列

let Queue = require('./Queue');
cc.Class({
    extends: cc.Component,

    properties: {
        eventCount: 0,  //被观察者总数目
        count: 0,
    },

    onLoad() {
        window.GameEvent = this;
        this.observerDic = new Array(3);
        for(let i = 0; i < 3; i++){
            this.observerDic[i] = {};
        }
        this.eventDic = new Array(3);
        for(let i = 0; i < 3; i++){
            this.eventDic[i] = new Queue();
        }

        this.maxPerFrame = 3;
    },

    update(dt) {
        this.eventCount = this.eventDic[0].size() + this.eventDic[1].size() + this.eventDic[2].size();
        if (this.eventCount <= 0) return;

        this.count = 0;
        for (let i = 0; i < this.eventCount; i++) {
            if (this.eventDic[0].size() > 0) {
                let event = this.eventDic[0].dequeue();
                if (this.observerDic[0][event.eventType]) {
                    this.observerDic[0][event.eventType](event.data);
                    this.count++;
                }
            } else if (this.eventDic[1].size() > 0) {
                let event = this.eventDic[1].dequeue();
                if (this.observerDic[1][event.eventType]) {
                    this.observerDic[1][event.eventType](event.data);
                    this.count++;
                }
            } else {
                let event = this.eventDic[2].dequeue();
                if (this.observerDic[2][event.eventType]) {
                    this.observerDic[2][event.eventType](event.data);
                    this.count++;
                }
            }
            if (this.count >= this.maxPerFrame) {
                break;
            }
        }
    },

    addObserver(eventType, observer, priority = 0) {
        this.observerDic[priority][eventType] = observer;
    },

    removeObserver(eventType, priority = 0) {
        this.observerDic[priority][eventType] = null;
        delete this.observerDic[priority][eventType];
    },

    addEvent(eventType, data, priority = 0) {
        this.eventDic[priority].enqueue({
            eventType: eventType,
            data: data
        });
    },
});
let Queue = function () {
    this.dataStore = [];
}

//向队末尾添加一个元素
Queue.prototype.enqueue = function (element) {
    // console.log("element"+element);
    this.dataStore.push(element)
}

Queue.prototype.dequeue = function () { 
    return this.dataStore.shift();
}
Queue.prototype.clear = function () {
    return this.dataStore =[];
}
Queue.prototype.front = function () { //读取队首和队末的 元素
    return this.dataStore[0];
}
Queue.prototype.back = function () { 读取队首和队末的元素
    return this.dataStore[this.dataStore.length - 1]
}
//显示队列内的所有元素
Queue.prototype.toString = function () {
    var retStr = "";
    for (var i = 0; i < this.dataStore.length; ++i) {
        retStr += this.dataStore[i] + "\n";
    }
    return retStr
}

//队列是否为空
Queue.prototype.empty = function () {
    if (this.dataStore.length == 0) {
        return true;
    } else {
        return false;
    }
}

Queue.prototype.size = function () {
    return this.dataStore.length;
}
module.exports = Queue;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值