大侠
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

145 lines
5.0 KiB

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<string, string> = {
[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) {
// }
}