Skip to main content

Keyboard Input

Learn how to detect key presses and create keyboard controls for your games.

Basic Key Detection

The simplest way to detect keys is using the keyPressed() function:

function setup() {
createCanvas(400, 400);
}

function draw() {
background(220);

fill(0);
textAlign(CENTER, CENTER);
text("Press any key!", 200, 200);
}

function keyPressed() {
console.log("Key pressed:", key);
}

Breaking it down

  • keyPressed() - Automatically called once when any key is pressed
  • key - Stores the character of the key that was pressed (like 'a', 'B', '5')
  • Runs outside of draw() - it's a special p5.js function

Detecting Specific Keys

Check which key was pressed using the key variable:

function keyPressed() {
if (key === 'a') {
console.log("A key pressed!");
} else if (key === 'b') {
console.log("B key pressed!");
}
}

Breaking it down

  • Use === to compare the key with a character
  • Case sensitive - 'a' is different from 'A'
  • Works with letters, numbers, and some symbols

Arrow Keys & Special Keys

For arrow keys and special keys, use keyCode:

let x = 200;
let y = 200;

function draw() {
background(220);

fill(100, 150, 250);
circle(x, y, 50);

fill(0);
textAlign(CENTER);
text("Use arrow keys to move", 200, 380);
}

function keyPressed() {
if (keyCode === LEFT_ARROW) {
x = x - 10;
} else if (keyCode === RIGHT_ARROW) {
x = x + 10;
} else if (keyCode === UP_ARROW) {
y = y - 10;
} else if (keyCode === DOWN_ARROW) {
y = y + 10;
}
}

Breaking it down

  • keyCode - Stores a number representing special keys
  • LEFT_ARROW, RIGHT_ARROW, UP_ARROW, DOWN_ARROW - Built-in p5.js constants
  • Moving left/up decreases position
  • Moving right/down increases position

Smooth Movement (Continuous Input)

Make movement smoother by checking if keys are held down in draw():

let x = 200;
let y = 200;
let speed = 3;

function draw() {
background(220);

// Check which keys are currently pressed
if (keyIsDown(LEFT_ARROW)) {
x = x - speed;
}
if (keyIsDown(RIGHT_ARROW)) {
x = x + speed;
}
if (keyIsDown(UP_ARROW)) {
y = y - speed;
}
if (keyIsDown(DOWN_ARROW)) {
y = y + speed;
}

fill(100, 150, 250);
circle(x, y, 50);
}

Breaking it down

  • keyIsDown(keyCode) - Returns true if the key is currently held down
  • Checked in draw(), so it updates every frame (smooth movement)
  • Use separate if statements (not else if) to allow diagonal movement
  • Adjust speed to control how fast the object moves

WASD Controls

Create WASD controls as an alternative to arrow keys:

let x = 200;
let y = 200;
let speed = 3;

function draw() {
background(220);

// WASD movement
if (keyIsDown(65)) { // A key
x = x - speed;
}
if (keyIsDown(68)) { // D key
x = x + speed;
}
if (keyIsDown(87)) { // W key
y = y - speed;
}
if (keyIsDown(83)) { // S key
y = y + speed;
}

fill(100, 150, 250);
circle(x, y, 50);
}

Breaking it down

  • keyIsDown() accepts ASCII key codes
  • W = 87, A = 65, S = 83, D = 68
  • Standard gaming controls (left hand on WASD, right on mouse)

Better WASD Using Letters

Use character comparison for cleaner code:

let x = 200;
let y = 200;
let speed = 3;

function draw() {
background(220);

// Check lowercase keys
if (keyIsDown(LEFT_ARROW) || key === 'a') {
x = x - speed;
}
if (keyIsDown(RIGHT_ARROW) || key === 'd') {
x = x + speed;
}
if (keyIsDown(UP_ARROW) || key === 'w') {
y = y - speed;
}
if (keyIsDown(DOWN_ARROW) || key === 's') {
y = y + speed;
}

fill(100, 150, 250);
circle(x, y, 50);
}

Breaking it down

  • || means "or" - either condition can be true
  • Works with both arrow keys AND WASD
  • Use lowercase letters for consistency

Action Keys (Space, Enter)

Detect action keys like spacebar or enter:

let isJumping = false;
let y = 300;
let jumpSpeed = 0;

function draw() {
background(220);

// Apply gravity
if (isJumping) {
y = y + jumpSpeed;
jumpSpeed = jumpSpeed + 0.5; // Gravity

// Land on ground
if (y >= 300) {
y = 300;
isJumping = false;
jumpSpeed = 0;
}
}

fill(100, 150, 250);
circle(200, y, 50);

// Ground
line(0, 325, 400, 325);
}

function keyPressed() {
// Jump with spacebar
if (key === ' ' && !isJumping) {
isJumping = true;
jumpSpeed = -12;
}

// Alternative: ENTER key
if (keyCode === ENTER) {
console.log("Enter pressed!");
}
}

Breaking it down

  • Spacebar is represented by ' ' (a space character)
  • ENTER is a built-in keyCode constant
  • !isJumping prevents jumping while already in the air
  • Negative jumpSpeed moves upward initially

Preventing Default Behavior

Some keys have default browser actions (like spacebar scrolling the page):

function keyPressed() {
// Your game logic
if (key === ' ') {
console.log("Jump!");
}

// Prevent default browser behavior
return false;
}

Breaking it down

  • return false at the end of keyPressed() prevents default actions
  • Stops spacebar from scrolling the page
  • Stops arrow keys from scrolling
  • Important for games!

Common Patterns

Preventing Opposite Directions

Don't allow instant direction reversal (like in Snake):

let direction = 'right';
let newDirection = 'right';

function draw() {
// Update direction (do this before moving)
direction = newDirection;

// Move based on direction
// ... movement code ...
}

function keyPressed() {
if (keyCode === LEFT_ARROW && direction !== 'right') {
newDirection = 'left';
} else if (keyCode === RIGHT_ARROW && direction !== 'left') {
newDirection = 'right';
} else if (keyCode === UP_ARROW && direction !== 'down') {
newDirection = 'up';
} else if (keyCode === DOWN_ARROW && direction !== 'up') {
newDirection = 'down';
}

return false;
}

Key Combinations

Detect when multiple keys are pressed together:

function draw() {
background(220);

// Hold SHIFT to move faster
let speed = 3;
if (keyIsDown(SHIFT)) {
speed = 8;
}

// Movement with variable speed
if (keyIsDown(LEFT_ARROW)) {
x = x - speed;
}
// ... other directions
}

All Special Key Constants

BACKSPACE  // Backspace key
DELETE // Delete key
ENTER // Enter key
RETURN // Return key (same as ENTER)
TAB // Tab key
ESCAPE // Escape key
SHIFT // Shift key
CONTROL // Control key
OPTION // Option/Alt key
ALT // Alt key (same as OPTION)
UP_ARROW // ↑
DOWN_ARROW // ↓
LEFT_ARROW // ←
RIGHT_ARROW // →

Tips & Tricks

  1. Use keyIsDown() for movement - Gives smooth, continuous movement
  2. Use keyPressed() for actions - One-time events like jumping or shooting
  3. Return false - Prevent browser from reacting to game keys
  4. Variable speed - Store speed in a variable for easy adjustment
  5. Test on different keyboards - Some keyboards have different layouts

Common Gotchas

⚠️ Case sensitivity - 'a' and 'A' are different keys
⚠️ keyPressed vs keyIsDown - One is a function, one checks state!
⚠️ Held keys auto-repeat - keyPressed() fires multiple times if key is held
⚠️ Some keys trigger browser - Always return false in keyPressed()
⚠️ Diagonal movement - Use separate if statements, not else if

Keyboard Input Summary

Use CaseFunctionExample
One-time actionkeyPressed()Jumping, shooting, pausing
Continuous movementkeyIsDown()Walking, flying
Check which keykeyLetters, numbers
Special keyskeyCodeArrow keys, Enter, Shift
Prevent browser actionsreturn falseStop page scrolling

Try It Yourself

Experiment with these ideas:

  • Create a character that jumps with spacebar
  • Make a two-player game with different controls (WASD vs Arrows)
  • Add a "sprint" feature by holding Shift
  • Create a typing game that responds to letter keys

Ready to add images to your game? Check out the Images guide! 🖼️