/
difight
/
ruEngine
Обзор
Документация
Войти
/
difight
/
ruEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
client/src/engine/utils/InputManager.ts
134 строки
5 KB
Andrey Bashkirev
Немного переделал архитектуру
05 авг 2025, 17:15
05 авг 2025, 17:15
144f0db
Код
Авторство
О чём код?
// src/engine/utils/InputManager.ts import { Logger } from "../utils/Logger"; import type { IInteractable } from "../core/ui/IInteractable"; import { Button } from "../core/ui/Button"; import { KeyboardEvents } from "./KeyboardEvents"; /** * Менеджер ввода. Singleton для обработки событий мыши и взаимодействия с интерактивными элементами. */ export class InputManager { private static instance: InputManager; private canvas: HTMLCanvasElement | null = null; private interactables: IInteractable[] = []; private keydownHandlers: Array<(e: KeyboardEvent) => void> = []; private keyupHandlers: Array<(e: KeyboardEvent) => void> = []; private constructor() {} /** Получить singleton-экземпляр InputManager */ public static getInstance(): InputManager { if (!InputManager.instance) { InputManager.instance = new InputManager(); } return InputManager.instance; } /** * Инициализировать менеджер с канвасом * @param canvas HTML-канвас для отслеживания событий */ public init(canvas: HTMLCanvasElement): void { this.canvas = canvas; Logger.debug('[InputManager] init with canvas:', canvas); this.addEventListeners(); this.addKeyboardListeners(); } /** Зарегистрировать обработчик нажатия клавиши */ public onKeyDown(handler: (e: KeyboardEvent) => void): void { this.keydownHandlers.push(handler); } /** Зарегистрировать обработчик отпускания клавиши */ public onKeyUp(handler: (e: KeyboardEvent) => void): void { this.keyupHandlers.push(handler); } private readonly keydownHandler = (e: KeyboardEvent) => { Logger.debug('Key down:', e.code, e.key); KeyboardEvents.emit(`keydown:${e.code}`, e); KeyboardEvents.emit(`keydown:${e.key}`, e); for (const handler of this.keydownHandlers) handler(e); }; private readonly keyupHandler = (e: KeyboardEvent) => { Logger.debug('Key up:', e.code, e.key); KeyboardEvents.emit(`keyup:${e.code}`, e); KeyboardEvents.emit(`keyup:${e.key}`, e); for (const handler of this.keyupHandlers) handler(e); }; private addKeyboardListeners(): void { window.addEventListener('keydown', this.keydownHandler); window.addEventListener('keyup', this.keyupHandler); } /** * Зарегистрировать интерактивный элемент * @param interactable Элемент UI */ public registerInteractable(interactable: IInteractable): void { Logger.debug('[InputManager] registerInteractable:', interactable); this.interactables.push(interactable); } /** Очистить все интерактивные элементы */ public clearInteractables(): void { this.interactables = []; } /** Добавить слушатели событий мыши */ private readonly clickHandler = (e: MouseEvent) => { if (!this.canvas) return; const rect = this.canvas.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; Logger.debug('[InputManager] clickHandler:', { x, y, interactables: this.interactables.length }); for (const interactable of this.interactables) { if (interactable.contains(x, y)) { Logger.debug("Clicked on interactable:", interactable); interactable.onClick?.(); break; } } }; private readonly mouseMoveHandler = (e: MouseEvent) => { if (!this.canvas) return; const rect = this.canvas.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; for (const interactable of this.interactables) { const wasHovered = interactable instanceof Button && (interactable as Button).isHovered; const isHoveredNow = interactable.contains(x, y); if (wasHovered !== isHoveredNow) { if (isHoveredNow) { interactable.onMouseOver?.(); } else { interactable.onMouseOut?.(); } } } }; private addEventListeners(): void { if (!this.canvas) return; this.canvas.addEventListener("click", this.clickHandler); this.canvas.addEventListener("mousemove", this.mouseMoveHandler); } /** * Уничтожить менеджер, очистить элементы и слушателей */ public destroy(): void { if (!this.canvas) return; this.clearInteractables(); this.canvas.removeEventListener("click", this.clickHandler); this.canvas.removeEventListener("mousemove", this.mouseMoveHandler); window.removeEventListener('keydown', this.keydownHandler); window.removeEventListener('keyup', this.keyupHandler); this.keydownHandlers = []; this.keyupHandlers = []; } }