aboutsummaryrefslogtreecommitdiff
path: root/static/src/engine/input.ts
diff options
context:
space:
mode:
Diffstat (limited to 'static/src/engine/input.ts')
-rw-r--r--static/src/engine/input.ts49
1 files changed, 49 insertions, 0 deletions
diff --git a/static/src/engine/input.ts b/static/src/engine/input.ts
new file mode 100644
index 0000000..c1728e9
--- /dev/null
+++ b/static/src/engine/input.ts
@@ -0,0 +1,49 @@
+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<string> = 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) {}
+}