Skip to content

Mouse

Low-level mouse device. Tracks button state, position, movement delta, scroll wheel, pointer lock, and double-click.

Automatically connected and polled by Input, but can also be used standalone.

ts
import {
  Mouse,
  MouseEventButton
  } from "@jolly-pixel/engine";

const canvas = document.querySelector("canvas")!;
const mouse = new Mouse({ canvas });

mouse.connect();
mouse.on("down", (event) => console.log("button", event.button));
mouse.on("wheel", (event) => {
  const [dx, dy] = Mouse.getWheelDelta(event);
  console.log("scroll", dx, dy);
});

function gameLoop() {
  mouse.update();

  if (mouse.buttons[MouseEventButton.left].wasJustPressed) {
    console.log("Left click!");
  }

  requestAnimationFrame(gameLoop);
}

gameLoop();

Constructor

new Mouse(options)

ts
interface MouseOptions {
  canvas: CanvasAdapter;
  // Custom document adapter (defaults to BrowserDocumentAdapter)
  documentAdapter?: DocumentAdapter;
}

new Mouse(options: MouseOptions);

Types

ts
const MouseEventButton = {
  left: 0,
  middle: 1,
  right: 2,
  back: 3,
  forward: 4,
  scrollUp: 5,
  scrollDown: 6
} as const;

type MouseAction = keyof typeof MouseEventButton;

type MouseLockState = "locked" | "unlocked";

interface MouseButtonState {
  isDown: boolean;
  doubleClicked: boolean;
  wasJustPressed: boolean;
  wasJustReleased: boolean;
}

Events

ts
type MouseEvents = {
  lockStateChange: [MouseLockState];
  down: [event: MouseEvent];
  up: [event: MouseEvent];
  move: [event: MouseEvent];
  wheel: [event: WheelEvent];
};

Properties

ts
interface Mouse {
  // Per-button state indexed by MouseEventButton values
  buttons: MouseButtonState[];
  // Raw down state, written immediately on DOM events
  buttonsDown: boolean[];

  // Canvas-local position in pixels (read-only)
  readonly position: { x: number; y: number };
  // Movement delta since last update() (read-only)
  readonly delta: { x: number; y: number };

  readonly locked: boolean;
  readonly scrollUp: boolean;
  readonly scrollDown: boolean;
  readonly wasActive: boolean;
}

API

ts
interface Mouse {
  // Lifecycle
  connect(): void;
  disconnect(): void;
  reset(): void;
  update(): void;

  // Pointer lock
  lock(): void;
  unlock(): void;

  // Mirror primary touch into mouse state (left button + position)
  synchronizeWithTouch(
    touch: Touch,
    buttonValue?: boolean,
    position?: TouchPosition
  ): void;
}

// Normalize WheelEvent across browsers and platforms
static getWheelDelta(event: WheelEvent): [number, number];