Files
oops-plugin-framework/assets/module/common/view/GameKeyboardModule.ts
dgflash 58d145b7dc 优化
2026-05-22 22:22:33 +08:00

86 lines
2.6 KiB
TypeScript

/*
* @Author: dgflash
* @Date: 2022-04-14 17:08:01
* @LastEditors: dgflash
*/
import type { EventKeyboard } from 'cc';
import { Input, input } from 'cc';
import { GameViewModule } from './GameViewModuleBase';
/** 键盘事件回调 */
export interface KeyboardCallbacks {
onKeyDown?: (event: EventKeyboard) => void;
onKeyUp?: (event: EventKeyboard) => void;
onKeyPressing?: (event: EventKeyboard) => void;
}
/** 键盘输入 */
export class GameKeyboardModule extends GameViewModule {
private _enabled = false;
private _callbacks: KeyboardCallbacks | null = null;
/**
* 键盘事件开关
* @param on 是否开启
* @param callbacks 开启时传入对应键事件回调(可只传需要的项)
*/
setKeyboard(on: boolean, callbacks?: KeyboardCallbacks): void {
if (on) {
if (callbacks) {
this._callbacks = callbacks;
}
if (!this._callbacks) {
console.warn('[OopsFramework]', 'setKeyboard(true) 需传入 callbacks');
return;
}
this._register(this._callbacks);
this._enabled = true;
}
else {
if (this._enabled && this._callbacks) {
this._unregister(this._callbacks);
}
this._enabled = false;
this._callbacks = null;
}
}
/** 销毁键盘模块 */
override destroy(): void {
if (this._enabled && this._callbacks) {
this._unregister(this._callbacks);
this._enabled = false;
this._callbacks = null;
}
}
/** 注册键盘事件
* @param callbacks 键盘事件回调
*/
private _register(callbacks: KeyboardCallbacks): void {
if (callbacks.onKeyDown) {
input.on(Input.EventType.KEY_DOWN, callbacks.onKeyDown, this.comp);
}
if (callbacks.onKeyUp) {
input.on(Input.EventType.KEY_UP, callbacks.onKeyUp, this.comp);
}
if (callbacks.onKeyPressing) {
input.on(Input.EventType.KEY_PRESSING, callbacks.onKeyPressing, this.comp);
}
}
/** 注销键盘事件
* @param callbacks 键盘事件回调
*/
private _unregister(callbacks: KeyboardCallbacks): void {
if (callbacks.onKeyDown) {
input.off(Input.EventType.KEY_DOWN, callbacks.onKeyDown, this.comp);
}
if (callbacks.onKeyUp) {
input.off(Input.EventType.KEY_UP, callbacks.onKeyUp, this.comp);
}
if (callbacks.onKeyPressing) {
input.off(Input.EventType.KEY_PRESSING, callbacks.onKeyPressing, this.comp);
}
}
}