import { DebouncePublisher } from "./debounce_publisher"; import { EntityPositionUpdateEvent, EventPublisher, EventType } from "./events"; import { Game } from "./game"; import { System, SystemType } from "./system"; export class InputSystem extends System { private readonly controllable_entities: Set = new Set(); private readonly mouse_movement_debouncer: DebouncePublisher<{ x: number; y: number; }>; constructor( private readonly message_publisher: EventPublisher, target: HTMLElement, ) { super(SystemType.INPUT); this.mouse_movement_debouncer = new DebouncePublisher((data) => this.publish_mouse_movement(data), ); target.addEventListener("mousemove", (event) => { this.mouse_movement_debouncer.update({ x: event.clientX, y: event.clientY, }); }); } private publish_mouse_movement({ x, y }: { x: number; y: number }) { console.log(`publishing mouse movement at (${x}, ${y})`); for (const entity_id of this.controllable_entities) { this.message_publisher.add({ event_type: EventType.ENTITY_POSITION_UPDATE, data: { id: entity_id, position: { x, y }, }, } as EntityPositionUpdateEvent); } } public add_controllable_entity(entity_id: string) { this.controllable_entities.add(entity_id); } public update(_dt: number, _game: Game) {} }