猫史档案馆


【代码岛三】重写EventEmitter

用户:ray_crazyray_crazy查看:26 回复:3 评论:26 创建时间:2022-03-15T20:46:45


由于岛三没有内置EventEmitter,于是我写了个EventEmitter类,帮助萌新直接使用

class EventEmitter {
    constructor() {
        this.listeners = {};
    }
    addListener(eventName, callback) {
        if (!this.listeners[eventName]) {
            this.listeners[eventName] = [];
        };
        this.listeners[eventName].push(callback);
    };

    emit(eventName, ...args) {
        if (this.listeners[eventName]) {
            this.listeners[eventName].forEach(callBack => {
                callBack(...args);
            })
        }
    };

    on(eventName, callback) {
        this.addListener(eventName, callback);
    };

    off(eventName, callback) {
        if (this.listeners[eventName]) {
            const targetIndex = this.listeners[eventName].findIndex(item => item === callback);
            if (targetIndex !== -1) {
                this.listeners[eventName].splice(targetIndex, 1);
            };
            if (this.listeners[eventName].length === 0) {
                delete this.listeners[eventName];
            };
        };
    };

    offAll(eventName) {
        if (this.listeners[eventName]) {
            delete this.listeners[eventName];
        };
    };

}

直接拿去用,基本常用的方法都实现了,这是个例子

// 创建EventEmitter
const worldEvent = new EventEmitter();
// 将事件对应过去
world.onPlayerJoin(event => {
    worldEvent.emit("onPlayerJoin", event);
});
world.onChat(event => {
    worldEvent.emit("onChat", event);
});
// 注册事件触发器
worldEvent.on("onPlayerJoin", ({ entity }) => {
    console.log("玩家加入:" + entity.player.name);
});
// 用addListener也可以
worldEvent.addListener("onChat", ({ message, entity }) => {
    console.log("玩家 " + entity.player.name + " 说了话: " + message);
});

非常简单好用


回复

上一页1 页 / 共 1下一页
该账号已停用该账号已停用

EventEmitter是啥子玩意儿

点赞2


评论


星星上的雪花星星上的雪花

多此一举。

正常人写的代码做出的效果,你却用了10倍的代码。除了冗杂就是累赘

点赞0


评论


ray_crazyray_crazy

将Entity的事件也注册好了,附赠一个写好的事件控制器和一个使用示例

// Events
class EventEmitter {
    constructor() {
        this.listeners = {};
        this.onceListeners = {};
    }
    addListener(eventName, callback) {
        if (!this.listeners[eventName]) {
            this.listeners[eventName] = [];
        };
        this.listeners[eventName].push(callback);
    };

    emit(eventName, ...args) {
        if (this.listeners[eventName]) {
            this.listeners[eventName].forEach(callBack => {
                callBack(...args);
            });
        };
        if (this.onceListeners[eventName]) {
            this.onceListeners[eventName].forEach((callBack, k) => {
                callBack(...args);
                delete this.onceListeners[eventName][k];
            });
        };
    };

    on(eventName, callback) {
        this.addListener(eventName, callback);
    };

    once(eventName, callback) {
        if (!this.onceListeners[eventName]) {
            this.onceListeners[eventName] = [];
        };
        this.onceListeners[eventName].push(callback);
    }

    off(eventName, callback) {
        if (this.listeners[eventName]) {
            const targetIndex = this.listeners[eventName].findIndex(item => item === callback);
            if (targetIndex !== -1) {
                this.listeners[eventName].splice(targetIndex, 1);
            };
            if (this.listeners[eventName].length === 0) {
                delete this.listeners[eventName];
            };
        };
    };

    offAll(eventName) {
        if (this.listeners[eventName]) {
            delete this.listeners[eventName];
        };
    };

}

class EventManager {
    constructor() {
        this.worldEvent = new EventEmitter();
        this.entityEvent = new EventEmitter();
        this.tick = 0;
        this.prevTick = 0;
        this.skip = false;
        this.elapsedTimeMS = 1 / 喵;

    }
    registerWorldEvent() {
        world.onPlayerJoin(event => {
            this.worldEvent.emit("onPlayerJoin", event);
        });
        world.onPlayerLeave(event => {
            this.worldEvent.emit("onPlayerLeave", event);
        });
        world.onChat(event => {
            this.worldEvent.emit("onChat", event);
        });
        world.onInteract(event => {
            this.worldEvent.emit("onInteract", event);
        });
        world.onPress(event => {
            this.worldEvent.emit("onPress", event);
        });
        world.onClick(event => {
            this.worldEvent.emit("onClick", event);
        });
        world.onRelease(event => {
            this.worldEvent.emit("onRelease", event);
        });
        world.onEntityCreate(event => {
            this.worldEvent.emit("onEntityCreate", event);
        });
        world.onEntityContact(event => {
            this.worldEvent.emit("onEntityContact", event);
        });
        world.onEntityDestroy(event => {
            this.worldEvent.emit("onEntityDestroy", event);
        });
        world.onEntitySeparate(event => {
            this.worldEvent.emit("onEntitySeparate", event);
        });
        world.onDie(event => {
            this.worldEvent.emit("onDie", event);
        });
        world.onRespawn(event => {
            this.worldEvent.emit("onRespawn", event);
        });
        setInterval(() => {
            this.tick += 1;
            this.worldEvent.emit("onTick", new Box3TickEvent(this.tick, this.prevTick, this.skip, this.elapsedTimeMS));
            this.prevTick += 1;
        }, 1 / 喵);
    }
    registerEntityEvent(entity) {
        entity.onClick(event => {
            this.entityEvent.emit("onClick", entity, event);
        });
        entity.onDestroy(event => {
            this.entityEvent.emit("onDestroy", entity, event);
        });
        entity.onDie(event => {
            this.entityEvent.emit("onDie", entity, event);
        });
        entity.onEntityContact(event => {
            this.entityEvent.emit("onEntityContact", entity, event);
        });
        entity.onEntitySeparate(event => {
            this.entityEvent.emit("onEntitySeparate", entity, event);
        });
        entity.onVoxelContact(event => {
            this.entityEvent.emit("onVoxelContact", entity, event);
        });
        entity.onVoxelSeparate(event => {
            this.entityEvent.emit("onVoxelSeparate", entity, event);
        });
        entity.onFluidEnter(event => {
            this.entityEvent.emit("onFluidEnter", entity, event);
        });
        entity.onFluidLeave(event => {
            this.entityEvent.emit("onFluidLeave", entity, event);
        });
    }
}
class WorldEventController extends EventManager {
    static instance;
    static GetInstance() {
        if (!this.instance) this.instance = new WorldEventController();
        return this.instance;
    }

    constructor() { 
        super();
        this.registerWorldEvent();
    }
}
class EntityEventController extends EventManager {
    constructor(entity) {
        super();
        this.registerEntityEvent(entity);
    }
}

// 示例
const worldEventController = WorldEventController.GetInstance();
worldEventController.worldEvent.on("onEntityCreate",({entity})=>{
    entity.eventManager = new EntityEventController(entity);
})

点赞0


评论