Skip to main content

Images & Sprites

Learn how to load and display images in your p5.js games to create sprites, backgrounds, and visual elements.

Loading an Image​

Use preload() to load images before your game starts:

let playerImage;

function preload() {
playerImage = loadImage('player.png');
}

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

function draw() {
background(220);

// Display the image
image(playerImage, 150, 150);
}

Breaking it down​

  • preload() - Special function that runs BEFORE setup()
  • loadImage('filename.png') - Loads an image file
  • Store the image in a variable so you can use it later
  • image(img, x, y) - Draws the image at position (x, y)

Where to Put Image Files​

In p5.js Web Editor:​

  1. Click the > arrow next to "Sketch Files"
  2. Click "Upload file"
  3. Choose your image file
  4. Reference it by its filename: 'player.png'

Image URL:​

You can also load images from the web:

function preload() {
playerImage = loadImage('https://example.com/image.png');
}

Sizing Images​

Control the size of your displayed images:

let playerImage;

function preload() {
playerImage = loadImage('player.png');
}

function draw() {
background(220);

// Image with custom width and height
image(playerImage, 100, 100, 50, 50);
}

Breaking it down​

  • image(img, x, y, width, height) - Draws image at position with specific size
  • Width and height are in pixels
  • Image will stretch/shrink to fit the size

Moving Images​

Use variables to create moving sprites:

let playerImage;
let x = 200;
let y = 200;

function preload() {
playerImage = loadImage('player.png');
}

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

function draw() {
background(220);

// Move with arrow keys
if (keyIsDown(LEFT_ARROW)) {
x = x - 3;
}
if (keyIsDown(RIGHT_ARROW)) {
x = x + 3;
}
if (keyIsDown(UP_ARROW)) {
y = y - 3;
}
if (keyIsDown(DOWN_ARROW)) {
y = y + 3;
}

// Draw player image
image(playerImage, x, y, 50, 50);
}

Breaking it down​

  • Store position in x and y variables
  • Update position based on input
  • Draw image at updated position each frame
  • Creates smooth animated movement

Centered Images​

By default, images draw from their top-left corner. Center them instead:

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

function draw() {
background(220);

// Now (200, 200) is the CENTER of the image
image(playerImage, 200, 200, 50, 50);
}

Breaking it down​

  • imageMode(CENTER) - Makes x,y refer to the image's center
  • Default is imageMode(CORNER) - x,y is top-left corner
  • Call once in setup() to affect all images
  • Makes positioning and rotation easier

Multiple Images​

Load and use multiple images:

let playerImage;
let enemyImage;
let backgroundImage;

function preload() {
playerImage = loadImage('player.png');
enemyImage = loadImage('enemy.png');
backgroundImage = loadImage('background.png');
}

function draw() {
// Draw background first
image(backgroundImage, 0, 0, width, height);

// Then draw game objects
image(playerImage, 100, 200, 50, 50);
image(enemyImage, 300, 200, 50, 50);
}

Breaking it down​

  • Load multiple images in preload()
  • Each needs its own variable
  • Draw background images first (they appear behind)
  • Draw player/enemies last (they appear in front)
  • width and height are canvas dimensions

Flipping Images​

Flip images horizontally or vertically:

let playerImage;
let facingRight = true;

function draw() {
background(220);

push(); // Save current settings
translate(x + 25, y + 25); // Move to center of image

if (!facingRight) {
scale(-1, 1); // Flip horizontally
}

imageMode(CENTER);
image(playerImage, 0, 0, 50, 50);
pop(); // Restore settings
}

function keyPressed() {
if (keyCode === LEFT_ARROW) {
facingRight = false;
} else if (keyCode === RIGHT_ARROW) {
facingRight = true;
}
}

Breaking it down​

  • push() and pop() - Save and restore drawing settings
  • translate(x, y) - Move the drawing origin
  • scale(-1, 1) - Flip horizontally (negative x-scale)
  • scale(1, -1) - Flip vertically (negative y-scale)

Rotating Images​

Rotate images around their center:

let playerImage;
let angle = 0;

function draw() {
background(220);

angle = angle + 0.05; // Slowly increase angle

push();
translate(200, 200); // Move to center
rotate(angle); // Rotate by angle
imageMode(CENTER);
image(playerImage, 0, 0, 50, 50);
pop();
}

Breaking it down​

  • rotate(angle) - Rotates drawing by an angle (in radians)
  • Rotation happens around the origin (0, 0)
  • Use translate() to move origin to where you want rotation center
  • Angle increases = clockwise rotation

Image Animation (Sprite Sheets)​

Create animation by switching between images:

let walkImages = [];
let currentFrame = 0;

function preload() {
// Load multiple frames
for (let i = 0; i < 4; i++) {
walkImages[i] = loadImage('walk' + i + '.png');
}
}

function draw() {
background(220);

// Show current frame
image(walkImages[currentFrame], 200, 200, 50, 50);

// Change frame every 10 frames
if (frameCount % 10 === 0) {
currentFrame = (currentFrame + 1) % walkImages.length;
}
}

Breaking it down​

  • Store images in an array
  • currentFrame tracks which image to show
  • frameCount % 10 === 0 - True every 10 frames
  • % walkImages.length - Loops back to 0 after last frame

Transparency​

Images with transparent backgrounds (PNG files) work automatically:

function draw() {
background(220);

// PNG with transparency shows background through it
image(playerImage, 100, 100, 50, 50);
}

Breaking it down​

  • Use PNG files for images with transparency
  • JPG files don't support transparency
  • Transparent areas show whatever is drawn behind them

Image Tinting​

Change the color of an image:

function draw() {
background(220);

// Tint image red
tint(255, 0, 0);
image(playerImage, 100, 200, 50, 50);

// Tint image blue with transparency
tint(0, 0, 255, 150);
image(playerImage, 200, 200, 50, 50);

// Remove tint
noTint();
image(playerImage, 300, 200, 50, 50);
}

Breaking it down​

  • tint(r, g, b) - Multiplies image colors by this color
  • Fourth parameter is transparency (0-255)
  • noTint() - Removes tint effect
  • Tint affects all images drawn after it (until noTint())

Common Patterns​

Image as Background​

let bgImage;

function preload() {
bgImage = loadImage('background.png');
}

function draw() {
// Draw background filling entire canvas
image(bgImage, 0, 0, width, height);

// Draw other game elements
// ...
}

Particle Images​

let particles = [];
let starImage;

function preload() {
starImage = loadImage('star.png');
}

function mousePressed() {
particles.push({
x: mouseX,
y: mouseY,
speedY: -3,
alpha: 255
});
}

function draw() {
background(220);

for (let i = particles.length - 1; i >= 0; i--) {
let p = particles[i];

tint(255, p.alpha);
image(starImage, p.x, p.y, 20, 20);

p.y = p.y + p.speedY;
p.alpha = p.alpha - 3;

if (p.alpha <= 0) {
particles.splice(i, 1);
}
}
noTint();
}

Tips & Tricks​

  1. Use preload() - Always load images in preload(), not setup()
  2. Image formats - Use PNG for transparency, JPG for photos
  3. File size - Smaller images load faster
  4. imageMode(CENTER) - Makes positioning and rotation easier
  5. push/pop - Always pair these when using transformations
  6. Free assets - Sites like itch.io have free game sprites

Common Gotchas​

⚠️ Image not showing? - Check filename spelling and that file is uploaded
⚠️ Image in wrong place? - Remember: default position is top-left corner
⚠️ Rotation weird? - Use translate() before rotate()
⚠️ Load in setup? - No! Use preload() for loading images
⚠️ Slow loading? - Compress images or use smaller sizes

  • loadImage() - Load image file
  • image() - Display image
  • imageMode() - Change how position is interpreted
  • tint() - Color an image
  • noTint() - Remove tint effect
  • get() - Get pixel colors from an image
  • copy() - Copy part of an image

Finding Free Game Art​

Great websites for free game sprites:

  • OpenGameArt.org - Large collection, open source
  • itch.io - Many free asset packs
  • Kenney.nl - High quality, free to use
  • Pixabay - Free images and photos

Try It Yourself​

Experiment with these ideas:

  • Create a player character that walks around
  • Make a game with an animated background
  • Add coins or collectibles using images
  • Create an enemy that chases an image sprite
  • Build a simple sprite animation

Ready to learn about sound effects? Check out the Sound guide! 🔊