import { _decorator, Component, director, EventKeyboard, Input, input, KeyCode, Node, UIOpacity } from 'cc'; import MesMgr from '../MesEvent/MesMgr'; import { EGlobalEvent } from '../MesEvent/EGlobalEvent'; //#region 键盘按键管理 // 该脚本主要处理 键盘按键输入事件 //#endregion const { ccclass, property } = _decorator; @ccclass('InputMgr') export class InputMgr extends Component { private static _ins: InputMgr; /** 单例 */ public static get ins(): InputMgr { if (this._ins == null) { let audio = new Node("InputMgr"); director.addPersistRootNode(audio); audio.addComponent(UIOpacity).opacity = 0; this._ins = audio.addComponent(InputMgr); } return this._ins; } /**点击的按键符号*/ private _KeyDownList: KeyCode[] = []; /**按键类型 */ private _KeyType: Record = { [Input.EventType.KEY_DOWN]: `${EGlobalEvent.E_INPUT_KEY}_${Input.EventType.KEY_DOWN}`, [Input.EventType.KEY_UP]: `${EGlobalEvent.E_INPUT_KEY}_${Input.EventType.KEY_UP}`, } /**组合按键事件 */ private getKeyType(type:Input.EventType,code:KeyCode = null){ const key = `${type}_${code ? code : ""}`; if (!this._KeyType[key]) { this._KeyType[key] = `${EGlobalEvent.E_INPUT_KEY}_${key}` } return this._KeyType[key]; } protected onLoad(): void { input.on(Input.EventType.KEY_DOWN, this.onKeyDown, this); input.on(Input.EventType.KEY_UP, this.onKeyUp, this); } protected onDestroy(): void { input.off(Input.EventType.KEY_DOWN, this.onKeyDown, this); input.off(Input.EventType.KEY_UP, this.onKeyUp, this); InputMgr._ins = null; MesMgr.offAllCaller(this); } /**注册 多次触发的点击按键事件 */ onKey(type:Input.EventType,listener:(...any: any[]) => void, target?: any,code:KeyCode[] | KeyCode = null){ if(code){ if(Array.isArray(code)){ for (let i = 0; i < code.length; i++) { const tCode = code[i]; MesMgr.on(this.getKeyType(type,tCode),listener,target); } }else{ MesMgr.on(this.getKeyType(type,code),listener,target); } }else{ MesMgr.on(this.getKeyType(type),listener,target); } } /**注册 一次触发的点击按键事件 */ onceKey(type:Input.EventType,listener:(...any: any[]) => void, target?: any,code:KeyCode[] | KeyCode = null){ if (code) { if (Array.isArray(code)) { for (let i = 0; i < code.length; i++) { const tCode = code[i]; MesMgr.once(this.getKeyType(type, tCode), listener, target); } } else { MesMgr.once(this.getKeyType(type, code), listener, target); } } else { MesMgr.once(this.getKeyType(type), listener, target); } } /**取消注册 多次触发的点击按键事件 */ offKey(type:Input.EventType,listener:(...any: any[]) => void, target?: any,code:KeyCode[] | KeyCode = null){ if (code) { if (Array.isArray(code)) { for (let i = 0; i < code.length; i++) { const tCode = code[i]; MesMgr.off(this.getKeyType(type, tCode), listener, target); } } else { MesMgr.off(this.getKeyType(type, code), listener, target); } } else { MesMgr.off(this.getKeyType(type), listener, target); } } /**取消注册 所有的触发的点击按键事件 */ offAll(type:Input.EventType,code:KeyCode[] | KeyCode = null){ if (code) { if (Array.isArray(code)) { for (let i = 0; i < code.length; i++) { const tCode = code[i]; MesMgr.offAll(this.getKeyType(type, tCode)); } } else { MesMgr.offAll(this.getKeyType(type, code)); } } else { MesMgr.offAll(this.getKeyType(type)); } } /**取消注册 某个目标的所有按键事件 */ offAllCaller(caller: any){ MesMgr.offAllCaller(caller); } protected onKeyDown(event: EventKeyboard) { if (!this._KeyDownList.includes(event.keyCode)) { this._KeyDownList.push(event.keyCode); } MesMgr.event(this.getKeyType(Input.EventType.KEY_DOWN)); MesMgr.event(this.getKeyType(Input.EventType.KEY_DOWN,event.keyCode)); } protected onKeyUp(event: EventKeyboard) { let idx = this._KeyDownList.indexOf(event.keyCode); if (idx >= 0) { this._KeyDownList.splice(idx, 1) } MesMgr.event(this.getKeyType(Input.EventType.KEY_UP),event.keyCode); MesMgr.event(this.getKeyType(Input.EventType.KEY_UP,event.keyCode),event.keyCode); } // protected update(deltaTime: number) { // } }