53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import { System } from "$/common/ecs/mod.ts";
|
|
import { Position } from "$/common/components/position.ts";
|
|
import { Sprite } from "../components/sprite.ts";
|
|
import { ClientWorld } from "../client_world.ts";
|
|
import { ClickableSprite } from "../components/clickable.ts";
|
|
import { point_inside_rec } from "$/common/utils.ts";
|
|
import { InputManager } from "../input_manager.ts";
|
|
import { Camera, screen_to_world } from "../components/camera.ts";
|
|
|
|
export class ClickableSystem extends System {
|
|
update(world: ClientWorld, _delta: number): void {
|
|
const [player] = world.get_tag("player")!;
|
|
const camera = player.get(Camera)!;
|
|
|
|
const mouse = InputManager.get_mouse_position();
|
|
|
|
const world_mouse = screen_to_world(
|
|
mouse.x,
|
|
mouse.y,
|
|
camera,
|
|
world.canvas.width,
|
|
world.canvas.height,
|
|
);
|
|
|
|
for (const entity of world.get_entities()) {
|
|
const position = entity.get(Position);
|
|
|
|
if (!position) {
|
|
continue;
|
|
}
|
|
|
|
const clickable_sprite = entity.get(ClickableSprite);
|
|
const sprite = entity.get(Sprite);
|
|
|
|
if (clickable_sprite && sprite) {
|
|
clickable_sprite.clicked = false;
|
|
const hovered = point_inside_rec(
|
|
world_mouse.x,
|
|
world_mouse.y,
|
|
position.x,
|
|
position.y,
|
|
sprite.width,
|
|
sprite.height,
|
|
);
|
|
if (hovered && InputManager.is_mouse_pressed(clickable_sprite.button)) {
|
|
InputManager.consume_mouse(clickable_sprite.button);
|
|
clickable_sprite.clicked = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|