onsight
Version:
Interactive, easy to use JavaScript game framework.
87 lines (77 loc) • 3.93 kB
JavaScript
import { Matrix2 } from '../math/Matrix2.js';
import { Pointer } from './input/Pointer.js';
import { Vector2 } from '../math/Vector2.js';
const _cameraPoint = new Vector2();
const _localPoint = new Vector2();
const _translate = new Matrix2();
class EventManager {
static pointerEvents(renderer, objects) {
const camera = renderer.camera;
const pointer = renderer.pointer;
// Pointer in World Coordinates
_cameraPoint.copy(renderer.screenToWorld(pointer.position));
// Pointer Events
let currentCursor = null;
for (const object of objects) {
// Process?
if (object.pointerEvents && object.inViewport) {
// Local Pointer Position
object.inverseGlobalMatrix.applyToVector(_localPoint.copy(_cameraPoint));
const isInside = object.isInside(_localPoint);
// Pointer Inside?
if (isInside) {
// Mouse Cursor
if (!currentCursor && object.cursor) setCursor(object);
// Pointer Events
if (renderer.dragObject == null) {
if (!object.pointerInside && typeof object.onPointerEnter === 'function') object.onPointerEnter(renderer);
if (typeof object.onPointerOver === 'function') object.onPointerOver(renderer);
if (pointer.buttonDoubleClicked(Pointer.LEFT) && typeof object.onDoubleClick === 'function') object.onDoubleClick(renderer);
if (pointer.buttonPressed(Pointer.LEFT) && typeof object.onButtonPressed === 'function') object.onButtonPressed(renderer);
if (pointer.buttonJustReleased(Pointer.LEFT) && typeof object.onButtonUp === 'function') object.onButtonUp(renderer);
if (pointer.buttonJustPressed(Pointer.LEFT)) {
if (typeof object.onButtonDown === 'function') object.onButtonDown(renderer);
if (object.draggable) {
renderer.setDragObject(object);
if (typeof object.onPointerDragStart === 'function') object.onPointerDragStart(renderer);
}
}
}
object.pointerInside = true;
// Pointer Leave
} else if (renderer.dragObject !== object && object.pointerInside) {
if (typeof object.onPointerLeave === 'function') object.onPointerLeave(renderer);
object.pointerInside = false;
}
}
// Being Dragged?
if (renderer.dragObject === object) {
// Stop Dragging
if (pointer.buttonJustReleased(Pointer.LEFT)) {
if (object.pointerEvents && typeof object.onPointerDragEnd === 'function') {
object.onPointerDragEnd(renderer);
}
// object.isDragging = false; /* also set in 'renderer.setDragObject()' below */
renderer.setDragObject(null);
// Still Dragging, Update
} else {
if (object.pointerEvents && typeof object.onPointerDrag === 'function') {
object.onPointerDrag(renderer);
}
// Mouse Cursor
setCursor(object);
}
}
}
// Update Cursor
function setCursor(object) {
if (object.cursor) {
currentCursor = (typeof object.cursor === 'function') ? object.cursor(camera) : object.cursor;
} else {
currentCursor = 'move';
}
}
document.body.style.cursor = currentCursor ?? 'default';
}
}
export { EventManager };