import { Component, Director, director, EventTarget, js } from 'cc'; import { DEV, EDITOR } from 'cc/env'; import * as debug from './lib/debug/debug'; import logger from './lib/logger/logger'; import storage from './lib/storage/storage'; import task from './lib/task/task'; import EventManager from './manager/event/EventManager'; import LoaderManager from './manager/loader/LoaderManager'; import SoundManager from './manager/sound/SoundManager'; import TimerManager from './manager/timer/TimerManager'; import UIManager from './manager/ui/UIManager'; enum EventType { /**AppInit准备完毕 */ EVENT_APPINIT_FINISHED = 'EVENT_APPINIT_FINISHED', /**系统Manager初始化完毕 */ EVENT_SYS_MANAGER_INITED = 'EVENT_SYS_MANAGER_INITED', /**用户Manager初始化完毕 */ EVENT_USER_MANAGER_INITED = 'EVENT_USER_MANAGER_INITED', /**所有Manager初始化完毕 */ EVENT_MANAGER_INITED = 'EVENT_MANAGER_INITED', /**所有Manager准备完毕 */ EVENT_MANAGER_FINISHED = 'EVENT_MANAGER_FINISHED' } type IData = { [key in string]: any }; type IConfig = { [key in string]: any }; type IStore = { [key in string]: any }; type ICtrl = { [key in string]: any }; interface ITypeofManager { Loader: Omit, Event: Omit, Sound: Omit, Timer: Omit, UI: Omit } interface IManager { loader: Omit, event: Omit, sound: Omit, keyof Component>, timer: Omit, ui: Omit, keyof Component> } interface ICore { data: IData, config: IConfig, store: IStore, controller: ICtrl, Controller: ICtrl, manager: IManager, Manager: ITypeofManager } const Lib = { task, storage, debug, logger }; const Config = {}; const Data = {}; const Store = {}; const controller = {}; const Controller = {}; const Manager = {}; const manager = {}; const eventTarget = new EventTarget(); let EventMap = {}; director.on(Director.EVENT_RESET, () => { js.clear(Config); js.clear(Data); js.clear(Store); js.clear(controller); js.clear(Controller); js.clear(Manager); js.clear(manager); EventMap = {}; }); export default class Core { static EventType = EventType; protected static _inst: Core | undefined; static get inst() { if (!this._inst) this._inst = new Core(); return this._inst; } lib = Lib; config: T['config'] = null; data: T['data'] = null; store: T['store'] = null; Controller: T['Controller'] = null; controller: T['controller'] = null; Manager: T['Manager'] = null; manager: T['manager'] = null; constructor() { this.config = Config; this.data = Data; this.store = Store; this.Controller = Controller; this.controller = controller; this.Manager = Manager as any; this.manager = manager as any; if (!EDITOR || DEV) { if (this.constructor !== Core && !js.getClassById('App')) { js.setClassAlias(this.constructor as any, 'App'); } } } on(event: keyof typeof EventType, callback: (...any: any[]) => void, target?: any): any { if (EventMap[event]) callback.call(target); eventTarget.on(event, callback, target); } once(event: keyof typeof EventType, callback: Function, target?: any): any { if (EventMap[event]) { callback.call(target); } else { eventTarget.once(event, callback as any, target); } } off(event: keyof typeof EventType, callback: (...any: any[]) => void, target?: any): any { eventTarget.off(event, callback, target); } targetOff(target: any) { eventTarget.targetOff(target); } /** * 请不要手动调用 */ static emit(event: keyof typeof EventType, ...args: any[]): any { EventMap[event] = true; eventTarget.emit(event, ...args); } }