blaze-2d
Version:
A fast and simple WebGL 2 2D game engine written in TypeScript
96 lines • 3.25 kB
JavaScript
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