UNPKG

blaze-2d

Version:

A fast and simple WebGL 2 2D game engine written in TypeScript

96 lines 3.25 kB
import { vec2 } from "gl-matrix"; /** * Enum for {@link MouseEvent.state} numbers */ export var Mouse; (function (Mouse) { Mouse[Mouse["LEFT"] = 0] = "LEFT"; Mouse[Mouse["MIDDLE"] = 1] = "MIDDLE"; Mouse[Mouse["RIGHT"] = 2] = "RIGHT"; Mouse[Mouse["MOVE"] = 123] = "MOVE"; })(Mouse || (Mouse = {})); /** * Handles mouse events for an {@link HTMLElement}. */ export default class MouseHandler { constructor(element) { /** * The mouse's current position within the element. */ this.position = vec2.create(); this.buttons = {}; this.listeners = {}; this.element = element; this.addListeners(); } addListeners() { this.element.addEventListener("mousedown", (e) => { var _a; this.buttons[e.button] = true; const pos = vec2.fromValues(e.offsetX, e.offsetY); (_a = this.listeners[e.button]) === null || _a === void 0 ? void 0 : _a.forEach((cb) => cb(true, pos)); }); this.element.addEventListener("mouseup", (e) => { var _a; this.buttons[e.button] = false; const pos = vec2.fromValues(e.offsetX, e.offsetY); (_a = this.listeners[e.button]) === null || _a === void 0 ? void 0 : _a.forEach((cb) => cb(false, pos)); }); this.element.addEventListener("mousemove", (e) => { var _a; const pos = vec2.fromValues(e.offsetX, e.offsetY); vec2.copy(this.position, pos); (_a = this.listeners[Mouse.MOVE]) === null || _a === void 0 ? void 0 : _a.forEach((cb) => cb(this.isPressed(), pos)); }); } /** * Gets the current mouse position within the element. * * If the mouse has not yet entered the element then the position will be [0, 0]. * * @returns The mouse position in pixels as a {@link vec2}; */ getMousePos() { return this.position; } /** * Determines wether the given mouse button is pressed. * * @param button The {@link Mouse} button to check * @returns Wether the given button is pressed or not */ isPressed(button = Mouse.LEFT) { return !!this.buttons[button]; } /** * Attaches a listener to a given mouse button that is called whenever the state of the button changes. * * @param button The {@link Mouse} button to attach the listener to * @param cb The callback to execute on a mousedown/mouseup event */ addListener(button, cb) { if (this.listeners[button]) { this.listeners[button].push(cb); } else { this.listeners[button] = [cb]; } } /** * Removes a listener from a given mouse button. * * @param button The {@link Mouse} button the listener is attached to * @param cb The attached listener */ removeListener(button, cb) { if (!this.listeners[button]) return; for (let i = 0; i < this.listeners[button].length; i++) { if (cb === this.listeners[button][i]) { this.listeners[button].splice(i, 1); break; } } } } //# sourceMappingURL=mouse.js.map