用户:ray_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);
});
非常简单好用
将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
评论