mirror of
https://github.com/Gongxh0901/kunpolibrary
synced 2025-07-04 15:24:20 +00:00
拆分事件模块,之后使用npm install kunpoocc-event
This commit is contained in:
parent
c25c1554f3
commit
6953f738b0
@ -37,4 +37,8 @@
|
|||||||
* 仓库地址: https://github.com/Gongxh0901/kunpo-quadtree
|
* 仓库地址: https://github.com/Gongxh0901/kunpo-quadtree
|
||||||
|
|
||||||
- 拆分行为树模块,使用 `npm install kunpocc-behaviortree` 安装
|
- 拆分行为树模块,使用 `npm install kunpocc-behaviortree` 安装
|
||||||
* 仓库地址: https://github.com/Gongxh0901/kunpocc-behaviortree
|
* 仓库地址: https://github.com/Gongxh0901/kunpocc-behaviortree
|
||||||
|
|
||||||
|
## 1.1.4 事件模块拆分
|
||||||
|
- 拆分事件模块,使用 `npm install kunpocc-event` 安装
|
||||||
|
* 仓库地址: https://github.com/Gongxh0901/kunpocc-event
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "kunpocc",
|
"name": "kunpocc",
|
||||||
"version": "1.1.3",
|
"version": "1.1.4",
|
||||||
"description": "基于creator3.0+的kunpocc库",
|
"description": "基于creator3.0+的kunpocc库",
|
||||||
"main": "./dist/kunpocc.cjs",
|
"main": "./dist/kunpocc.cjs",
|
||||||
"module": "./dist/kunpocc.mjs",
|
"module": "./dist/kunpocc.mjs",
|
||||||
@ -43,7 +43,8 @@
|
|||||||
"registry": "https://registry.npmjs.org/"
|
"registry": "https://registry.npmjs.org/"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fairygui-cc": "^1.2.2"
|
"fairygui-cc": "^1.2.2",
|
||||||
|
"kunpocc-event": "^0.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@cocos/creator-types": "^3.8.0",
|
"@cocos/creator-types": "^3.8.0",
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { _decorator, Component, director, game, JsonAsset, macro, sys } from "cc";
|
import { _decorator, Component, director, game, JsonAsset, macro, sys } from "cc";
|
||||||
import { GlobalEvent } from "../global/GlobalEvent";
|
|
||||||
import { GlobalTimer } from "../global/GlobalTimer";
|
import { GlobalTimer } from "../global/GlobalTimer";
|
||||||
import { enableDebugMode, FrameConfig } from "../global/header";
|
import { enableDebugMode, FrameConfig } from "../global/header";
|
||||||
import { InnerTimer } from "../global/InnerTimer";
|
import { InnerTimer } from "../global/InnerTimer";
|
||||||
@ -47,7 +46,6 @@ export abstract class CocosEntry extends Component {
|
|||||||
this.node.setSiblingIndex(this.node.children.length - 1);
|
this.node.setSiblingIndex(this.node.children.length - 1);
|
||||||
PropsHelper.setConfig(this.uiConfig?.json);
|
PropsHelper.setConfig(this.uiConfig?.json);
|
||||||
this.initPlatform();
|
this.initPlatform();
|
||||||
this.initEvent();
|
|
||||||
this.initTime();
|
this.initTime();
|
||||||
this.initAdapter();
|
this.initAdapter();
|
||||||
this.initModule();
|
this.initModule();
|
||||||
@ -108,14 +106,6 @@ export abstract class CocosEntry extends Component {
|
|||||||
debug(`platform: ${PlatformType[Platform.platform]}`);
|
debug(`platform: ${PlatformType[Platform.platform]}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化事件
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
private initEvent(): void {
|
|
||||||
GlobalEvent._initGlobalEvent();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 初始化时间
|
* 初始化时间
|
||||||
* @internal
|
* @internal
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
/**
|
|
||||||
* @Author: Gongxh
|
|
||||||
* @Date: 2024-12-21
|
|
||||||
* @Description:
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @internal */
|
|
||||||
export class Event {
|
|
||||||
public id: number;
|
|
||||||
public name: string;
|
|
||||||
public target: any;
|
|
||||||
public once: boolean = false;
|
|
||||||
public callback: (...arg: any[]) => void;
|
|
||||||
public _destroy: boolean = false;
|
|
||||||
public _reset(): void {
|
|
||||||
this._destroy = false;
|
|
||||||
}
|
|
||||||
public _recycle(): void {
|
|
||||||
this._destroy = true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
/**
|
|
||||||
* @Author: Gongxh
|
|
||||||
* @Date: 2024-12-21
|
|
||||||
* @Description:
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { Event } from "./Event";
|
|
||||||
|
|
||||||
/** @internal */
|
|
||||||
export class EventFactory {
|
|
||||||
private _id: number = 0;
|
|
||||||
private _stack: Event[] = [];
|
|
||||||
private _maxCapacity: number = 64;
|
|
||||||
private _msgClass: new () => Event;
|
|
||||||
|
|
||||||
get id(): number {
|
|
||||||
return this._id++;
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(capacity: number, objectClass: new () => Event) {
|
|
||||||
this._maxCapacity = capacity;
|
|
||||||
this._msgClass = objectClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
public allocate<T extends Event>(): T {
|
|
||||||
if (this._stack.length == 0) {
|
|
||||||
const ret = new this._msgClass() as T;
|
|
||||||
ret.id = this.id;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
const ret = this._stack.pop() as T;
|
|
||||||
ret._reset();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
public recycle(ret: Event): boolean {
|
|
||||||
if (this._maxCapacity > 0 && this._stack.length < this._maxCapacity) {
|
|
||||||
ret._recycle();
|
|
||||||
this._stack.push(ret);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,219 +0,0 @@
|
|||||||
/**
|
|
||||||
* @Author: Gongxh
|
|
||||||
* @Date: 2024-12-21
|
|
||||||
* @Description:
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { Event } from "./Event";
|
|
||||||
import { EventFactory } from "./EventFactory";
|
|
||||||
|
|
||||||
export class EventManager {
|
|
||||||
/** @internal */
|
|
||||||
private _idToEvent: Map<number, Event> = new Map<number, Event>();
|
|
||||||
/** @internal */
|
|
||||||
private _nameToIds: Map<string, Set<number>> = new Map<string, Set<number>>();
|
|
||||||
/** @internal */
|
|
||||||
private _targetToIds: Map<any, Set<number>> = new Map<any, Set<number>>();
|
|
||||||
/** @internal */
|
|
||||||
private _factroy: EventFactory = new EventFactory(64, Event);
|
|
||||||
/**
|
|
||||||
* 添加事件监听器。
|
|
||||||
* @param name - 事件名称。
|
|
||||||
* @param callback - 回调函数,当事件触发时执行。
|
|
||||||
* @param target - 可选参数,指定事件监听的目标对象。
|
|
||||||
* 该方法将事件和回调函数注册到事件管理器中,以便在事件触发时执行相应的回调函数。
|
|
||||||
*/
|
|
||||||
public addEvent(name: string, callback: (...args: any[]) => void, target?: any): void {
|
|
||||||
this._addEvent(name, callback, false, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 添加一个只触发一次的事件监听器。
|
|
||||||
* @param name - 事件名称。
|
|
||||||
* @param callback - 事件触发时要执行的回调函数。
|
|
||||||
* @param target - 可选参数,指定事件监听器的目标对象。
|
|
||||||
*/
|
|
||||||
public addEventOnce(name: string, callback: (...args: any[]) => void, target?: any): void {
|
|
||||||
this._addEvent(name, callback, true, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 发送事件给所有注册的监听器。
|
|
||||||
* @param name - 事件名称。
|
|
||||||
* @param target - 可选参数,指定目标对象,只有目标对象匹配时才会触发监听器。 (制定目标对象 效率更高)
|
|
||||||
* @param args - 传递给监听器回调函数的参数。
|
|
||||||
*/
|
|
||||||
public send(name: string, target?: any, ...args: any[]): void {
|
|
||||||
let nameToIds = this._nameToIds;
|
|
||||||
if (!nameToIds.has(name)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let ids = nameToIds.get(name);
|
|
||||||
let listenerMap = this._idToEvent;
|
|
||||||
|
|
||||||
let needRemoveIds: number[] = [];
|
|
||||||
let triggerList: Event[] = [];
|
|
||||||
for (const id of ids.values()) {
|
|
||||||
if (!listenerMap.has(id)) {
|
|
||||||
throw new Error(`消息ID:【${id}】不存在`);
|
|
||||||
}
|
|
||||||
let listener = listenerMap.get(id);
|
|
||||||
if (!listener._destroy && (!target || target == listener.target)) {
|
|
||||||
triggerList.push(listener);
|
|
||||||
if (listener.once) {
|
|
||||||
listener._destroy = true;
|
|
||||||
needRemoveIds.push(listener.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (const listener of triggerList) {
|
|
||||||
listener.callback(...args);
|
|
||||||
}
|
|
||||||
if (needRemoveIds.length > 0) {
|
|
||||||
for (const id of needRemoveIds) {
|
|
||||||
this._remove(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 移除指定名称的事件监听器。
|
|
||||||
* @param name - 事件名称。
|
|
||||||
* @param callback - 要移除的回调函数。
|
|
||||||
* @param target - 回调函数绑定的目标对象。
|
|
||||||
* 该方法会遍历与指定名称关联的所有监听器ID,检查每个监听器的回调函数和目标对象,
|
|
||||||
* 如果匹配则将其ID添加到待移除列表中,最后统一移除这些监听器。
|
|
||||||
*/
|
|
||||||
public remove(name: string, callback: () => void, target: any): void {
|
|
||||||
let nameToIds = this._nameToIds;
|
|
||||||
if (!nameToIds.has(name)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let ids = nameToIds.get(name);
|
|
||||||
if (ids.size == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let needRemoveIds: number[] = [];
|
|
||||||
for (const id of ids.values()) {
|
|
||||||
let listener = this._idToEvent.get(id);
|
|
||||||
let needRemove = true;
|
|
||||||
if (callback && listener.callback != callback) {
|
|
||||||
needRemove = false;
|
|
||||||
}
|
|
||||||
if (target && listener.target != target) {
|
|
||||||
needRemove = false;
|
|
||||||
}
|
|
||||||
needRemove && needRemoveIds.push(id);
|
|
||||||
}
|
|
||||||
if (needRemoveIds.length > 0) {
|
|
||||||
for (const id of needRemoveIds) {
|
|
||||||
this._remove(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public removeByNameAndTarget(name: string, target: any): void {
|
|
||||||
this.remove(name, null, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
public removeByNameAndCallback(name: string, callback: () => void): void {
|
|
||||||
this.remove(name, callback, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 移除与指定目标关联的所有监听器。
|
|
||||||
* 如果目标不存在或关联的监听器ID集合为空,则不执行任何操作。
|
|
||||||
* 对于每个监听器ID,从_idToEvent映射中删除监听器,并将其回收到工厂中。
|
|
||||||
* 同时,更新_nameToIds映射,确保名称到ID集合的映射保持最新。
|
|
||||||
* @param target - 要移除监听器的目标对象。
|
|
||||||
*/
|
|
||||||
public removeList(target: any): void {
|
|
||||||
let targetToIds = this._targetToIds;
|
|
||||||
if (!targetToIds.has(target)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let ids = targetToIds.get(target);
|
|
||||||
if (ids.size == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (const id of ids.values()) {
|
|
||||||
let listener = this._idToEvent.get(id);
|
|
||||||
let name = listener.name;
|
|
||||||
|
|
||||||
this._idToEvent.delete(id);
|
|
||||||
this._factroy.recycle(listener);
|
|
||||||
|
|
||||||
let nameToIds = this._nameToIds;
|
|
||||||
if (nameToIds.has(name)) {
|
|
||||||
nameToIds.get(name).delete(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ids.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public destroyAll(): void {
|
|
||||||
let listeners = this._idToEvent;
|
|
||||||
for (const listener of listeners.values()) {
|
|
||||||
this._factroy.recycle(listener);
|
|
||||||
}
|
|
||||||
this._idToEvent.clear();
|
|
||||||
this._nameToIds.clear();
|
|
||||||
this._targetToIds.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @internal */
|
|
||||||
public _addEvent(name: string, callback: (...arg: any[]) => void, once: boolean, target: any): void {
|
|
||||||
let listener = this._factroy.allocate<Event>();
|
|
||||||
listener.name = name;
|
|
||||||
listener.target = target;
|
|
||||||
listener.once = once;
|
|
||||||
listener.callback = callback;
|
|
||||||
this._idToEvent.set(listener.id, listener);
|
|
||||||
|
|
||||||
let nameToIds = this._nameToIds;
|
|
||||||
let ids: Set<number>;
|
|
||||||
if (nameToIds.has(name)) {
|
|
||||||
ids = nameToIds.get(name);
|
|
||||||
} else {
|
|
||||||
ids = new Set<number>();
|
|
||||||
nameToIds.set(name, ids);
|
|
||||||
}
|
|
||||||
ids.add(listener.id);
|
|
||||||
if (target) {
|
|
||||||
let targetToIds = this._targetToIds;
|
|
||||||
if (!targetToIds.has(target)) {
|
|
||||||
let ids = new Set<number>();
|
|
||||||
ids.add(listener.id);
|
|
||||||
targetToIds.set(target, ids);
|
|
||||||
} else {
|
|
||||||
let ids = targetToIds.get(target);
|
|
||||||
ids.add(listener.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @internal */
|
|
||||||
private _remove(id: number): void {
|
|
||||||
if (!this._idToEvent.has(id)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let ids = this._idToEvent.get(id);
|
|
||||||
let name = ids.name;
|
|
||||||
let target = ids.target;
|
|
||||||
|
|
||||||
this._idToEvent.delete(id);
|
|
||||||
this._factroy.recycle(ids);
|
|
||||||
|
|
||||||
let nameToIds = this._nameToIds;
|
|
||||||
if (nameToIds.has(name)) {
|
|
||||||
nameToIds.get(name).delete(id);
|
|
||||||
}
|
|
||||||
if (target) {
|
|
||||||
let targetToIds = this._targetToIds;
|
|
||||||
if (targetToIds.has(target)) {
|
|
||||||
targetToIds.get(target).delete(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -5,9 +5,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { ResolutionPolicy, view } from "cc";
|
import { ResolutionPolicy, view } from "cc";
|
||||||
|
import { GlobalEvent } from "kunpocc-event";
|
||||||
import { debug } from "../tool/log";
|
import { debug } from "../tool/log";
|
||||||
import { WindowManager } from "../ui/WindowManager";
|
import { WindowManager } from "../ui/WindowManager";
|
||||||
import { GlobalEvent } from "./GlobalEvent";
|
|
||||||
import { Screen } from "./Screen";
|
import { Screen } from "./Screen";
|
||||||
import { size } from "./header";
|
import { size } from "./header";
|
||||||
|
|
||||||
|
@ -1,46 +0,0 @@
|
|||||||
/**
|
|
||||||
* @Author: Gongxh
|
|
||||||
* @Date: 2024-12-22
|
|
||||||
* @Description: 全局事件
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { EventManager } from "../event/EventManager";
|
|
||||||
|
|
||||||
export class GlobalEvent {
|
|
||||||
/** @internal */
|
|
||||||
private static _globalEvent: EventManager = null;
|
|
||||||
public static add(eventName: string, callback: (...args: any[]) => void, target: any): void {
|
|
||||||
this._globalEvent.addEvent(eventName, callback, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static addOnce(eventName: string, callback: (...args: any[]) => void, target: any): void {
|
|
||||||
this._globalEvent.addEventOnce(eventName, callback, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static send(eventName: string, ...args: any[]): void {
|
|
||||||
this._globalEvent.send(eventName, null, ...args);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static sendToTarget(eventName: string, target: any, ...args: any[]) {
|
|
||||||
this._globalEvent.send(eventName, target, ...args);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static remove(eventName: string, callback: (...args: any[]) => void, target?: any): void {
|
|
||||||
this._globalEvent.remove(eventName, callback, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static removeByNameAndTarget(eventName: string, target: any) {
|
|
||||||
this._globalEvent.removeByNameAndTarget(eventName, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static removeByTarget(target: any): void {
|
|
||||||
this._globalEvent.removeList(target);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @internal */
|
|
||||||
public static _initGlobalEvent(): void {
|
|
||||||
if (!this._globalEvent) {
|
|
||||||
this._globalEvent = new EventManager();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,4 @@
|
|||||||
/** 一些全局工具 */
|
/** 一些全局工具 */
|
||||||
export { GlobalEvent } from "./global/GlobalEvent";
|
|
||||||
export { GlobalTimer } from "./global/GlobalTimer";
|
export { GlobalTimer } from "./global/GlobalTimer";
|
||||||
export { enableDebugMode, FrameConfig, KUNPO_DEBUG } from "./global/header";
|
export { enableDebugMode, FrameConfig, KUNPO_DEBUG } from "./global/header";
|
||||||
export { Platform, PlatformType } from "./global/Platform";
|
export { Platform, PlatformType } from "./global/Platform";
|
||||||
@ -12,8 +11,6 @@ export * from "./tool/log";
|
|||||||
export { MathTool } from "./tool/Math";
|
export { MathTool } from "./tool/Math";
|
||||||
export { md5 } from "./tool/MD5";
|
export { md5 } from "./tool/MD5";
|
||||||
export { Time } from "./tool/Time";
|
export { Time } from "./tool/Time";
|
||||||
/** 消息监听 */
|
|
||||||
export { EventManager } from "./event/EventManager";
|
|
||||||
|
|
||||||
/** Http */
|
/** Http */
|
||||||
export * from "./net/http/HttpManager";
|
export * from "./net/http/HttpManager";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user