Input Keyboard Mouse Touch
Use this skill when handling user input in Phaser 4. Covers keyboard keys, mouse clicks and movement, touch events, pointer handling, drag and drop, hit areas, interactive objects, and gamepad support. Triggers on: keyboard, mouse, touch, pointer, drag, drop, click, input, gamepad, cursor keys.
- Skill ID
- phaserjs/phaser/input-keyboard-mouse-touch
- Publisher
- phaserjs
- Repository
- phaser
- Installs
- 0
- Files
- 2
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
phaserjs/phaser/input-keyboard-mouse-touchInstalls these files- SKILL.md
- references/REFERENCE.md
What this skill tells the agent
Input: Keyboard, Mouse, Touch, and Gamepad
Phaser provides a unified input system accessed via this.input in any Scene. It supports keyboard polling and events, mouse/pointer interaction with Game Objects (click, hover, drag), multi-touch, mouse wheel, and gamepad input. Input can be handled through event listeners or by polling state each frame.Key source paths: src/input/InputPlugin.js, src/input/Pointer.js, src/input/keyboard/KeyboardPlugin.js, src/input/keyboard/keys/Key.js, src/input/keyboard/keys/KeyCodes.js, src/input/keyboard/combo/KeyCombo.js, src/input/gamepad/GamepadPlugin.js, src/input/gamepad/Gamepad.js, src/input/events/, src/input/keyboard/events/ Related skills: ../sprites-and-images/SKILL.md, ../events-system/SKILL.md, ../scenes/SKILL.md
Quick Start (basic keyboard + pointer input)
class MyScene extends Phaser.Scene {
create() {
// Keyboard: create cursor keys (up, down, left, right, space, shift)
this.cursors = this.input.keyboard.createCursorKeys();
// Keyboard: listen for a specific key event
this.input.keyboard.on('keydown-SPACE', (event) => {
console.log('Space pressed');
});
// Pointer: listen for click/tap anywhere on the game canvas
this.input.on('pointerdown', (pointer) => {
console.log('Clicked at', pointer.x, pointer.y);
});
// Pointer: make a Game Object interactive and clickable
const sprite = this.add.sprite(400, 300, 'player');
sprite.setInteractive();
sprite.on('pointerdown', (pointer, localX, localY, event) => {
console.log('Sprite clicked at local', localX, localY);
});
}
update() {
// Poll cursor keys each frame
if (this.cursors.left.isDown) {
// move left
}
if (this.cursors.right.isDown) {
// move right
}
if (Phaser.Input.Keyboard.JustDown(this.cursors.space)) {
// fire once per press
}
}
}Core Concepts
The Input Plugin (this.input)
Accessed via this.input in any Scene. It is an EventEmitter that handles all input for that Scene.
Key properties:
this.input.enabled(boolean) - toggle input processing for the Scenethis.input.topOnly(boolean, defaulttrue) - only emit events from the top-most Game Object under the pointerthis.input.keyboard- the KeyboardPlugin instancethis.input.gamepad- the GamepadPlugin instancethis.input.mouse- the MouseManager referencethis.input.activePointer- the most recently active Pointerthis.input.mousePointer- the mouse Pointer (pointers[0], distinct from pointer1 which is the first touch)this.input.pointer1throughthis.input.pointer10- individual pointer referencesthis.input.dragDistanceThreshold(number, default 0) - pixels a pointer must move before drag startsthis.input.dragTimeThreshold(number, default 0) - ms a pointer must be held before drag startsthis.input.pollRate(number, default -1) - how often pointers are polled; 0 = every frame, -1 = only on movement
Key methods:
addPointer(quantity)- add extra pointers for multi-touch (default is 2; max 10)setHitArea(gameObjects, hitArea, hitAreaCallback)- set custom hit area on Game ObjectssetHitAreaCircle(gameObjects, x, y, radius, callback)setHitAreaEllipse(gameObjects, x, y, width, height, callback)setHitAreaRectangle(gameObjects, x, y, width, height, callback)setHitAreaTriangle(gameObjects, x1, y1, x2, y2, x3, y3, callback)setHitAreaFromTexture(gameObjects, callback)- use the texture frame dimensionssetDraggable(gameObjects, value)- enable or disable draggingmakePixelPerfect(alphaTolerance)- returns a callback for pixel-perfect hit testing
Pointers
A Pointer object encapsulates both mouse and touch input. By default Phaser creates 2 pointers. Use this.input.addPointer(quantity) for more (up to 10 total).
Key properties:
x,y- position in screen space (read fromposition.x,position.y)worldX,worldY- position translated through the most recent CameradownX,downY- position when button was pressedupX,upY- position when button was releasedisDown(boolean) - true if any button is heldprimaryDown(boolean) - true if primary button (left click / touch) is heldbutton(number) - which button was pressed/released (0=left, 1=middle, 2=right)buttons(number) - bitmask of currently held buttons (1=left, 2=right, 4=middle, 8=back, 16=forward)wasTouch(boolean) - true if input came from touchvelocity(Vector2) - smoothed velocity of pointer movementangle(number) - angle of movement in radiansdistance(number) - smoothed distance moved per framemovementX,movementY- relative movement when pointer is lockeddeltaX,deltaY,deltaZ- mouse wheel scroll amountslocked(boolean) - whether pointer lock is activecamera- the Camera this Pointer last interacted with
Key methods:
leftButtonDown(),rightButtonDown(),middleButtonDown(),backButtonDown(),forwardButtonDown()- check specific buttonsleftButtonReleased(),rightButtonReleased(),middleButtonReleased()- check recent releasegetDistance()- distance between down position and current/up positiongetDistanceX(),getDistanceY()- horizontal/vertical distancegetDuration()- ms between down and current time or up timegetAngle()- angle between down and current/up positionupdateWorldPoint(camera)- recalculate worldX/worldY for a given camerapositionToCamera(camera, output)- translate pointer position through a camera
Interactive Game Objects (setInteractive)
Call gameObject.setInteractive() to enable input on a Game Object. This uses the texture frame as the hit area by default.
// Default hit area from texture
sprite.setInteractive();
// Custom shape hit areas (Rectangle, Circle, Ellipse, Triangle, Polygon)
sprite.setInteractive(new Phaser.Geom.Circle(32, 32, 32), Phaser.Geom.Circle.Contains);
sprite.setInteractive(new Phaser.Geom.Ellipse(50, 50, 100, 60), Phaser.Geom.Ellipse.Contains);
sprite.setInteractive(new Phaser.Geom.Triangle(0,64,32,0,64,64), Phaser.Geom.Triangle.Contains);
sprite.setInteractive(new Phaser.Geom.Polygon(points), Phaser.Geom.Polygon.Contains);
// Pixel-perfect hit testing (expensive — use sparingly)
sprite.setInteractive({ pixelPerfect: true, alphaTolerance: 1 });
sprite.setInteractive(this.input.makePixelPerfect());
// With alpha tolerance (default 1):
sprite.setInteractive(this.input.makePixelPerfect(150));
// Config object with multiple options
sprite.setInteractive({
draggable: true,
dropZone: false,
useHandCursor: true,
cursor: 'pointer',
pixelPerfect: true,
alphaTolerance: 1
});
// Containers must specify a shape or call setSize first
container.setSize(200, 200);
container.setInteractive();Common Patterns
Keyboard Input (cursors, addKey, isDown, JustDown)
Cursor keys return an object with up, down, left, right, space, shift Key objects:
this.cursors = this.input.keyboard.createCursorKeys();
// In update():
if (this.cursors.up.isDown) { /* held */ }
if (this.cursors.space.isDown) { /* held */ }addKey creates a Key object for any key:
// By string name
const keyW = this.input.keyboard.addKey('W');
// By key code
const keySpace = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE);
// With options: addKey(key, enableCapture, emitOnRepeat)
const keyA = this.input.keyboard.addKey('A', true, false);addKeys creates multiple keys at once:
// Comma-separated string returns { W, S, A, D } Key objects
const keys = this.input.keyboard.addKeys('W,S,A,D');
if (keys.W.isDown) { /* ... */ }
// Object form with custom names
const keys = this.input.keyboard.addKeys({More from phaserjs
Use this skill in a project
Open any RiverX project, search the Skills panel for phaserjs/phaser/input-keyboard-mouse-touch, and install it in one click.
