Skip to content
Frontend
Skill

/curves-and-paths

Use this skill when working with curves and paths in Phaser 4. Covers splines, bezier curves, lines, ellipses, path followers, and mathematical curve types. Triggers on: curve, path, spline, bezier, path follower.

From plugin
phaser
40k28 skills
Install
$ npx -y skills add phaserjs/phaser --skill curves-and-paths --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/curves-and-paths

Context preview

The summary Claude sees to decide when to auto-load this skill.

Use this skill when working with curves and paths in Phaser 4. Covers splines, bezier curves, lines, ellipses, path followers, and mathematical curve types. Triggers on: curve, path, spline, bezier, path follower.

SKILL.md

curves-and-paths.SKILL.md
name: curves-and-paths
description: "Use this skill when working with curves and paths in Phaser 4. Covers splines, bezier curves, lines, ellipses, path followers, and mathematical curve types. Triggers on: curve, path, spline, bezier, path follower."

Curves and Paths

> Creating paths from curves, getting points along them, drawing them with Graphics, and making sprites follow paths automatically using PathFollower in Phaser 4.

**Key source paths:** `src/curves/`, `src/curves/path/`, `src/gameobjects/pathfollower/`, `src/gameobjects/components/PathFollower.js` **Related skills:** ../sprites-and-images/SKILL.md, ../graphics-and-shapes/SKILL.md, ../tweens/SKILL.md

Quick Start

// In a Scene's create() method:

// 1. Create a Path starting at (50, 300)
const path = this.add.path(50, 300);

// 2. Add curves to the path
path.lineTo(200, 100);
path.splineTo([ new Phaser.Math.Vector2(300, 400), new Phaser.Math.Vector2(500, 200) ]);
path.lineTo(700, 300);

// 3. Draw the path using Graphics
const graphics = this.add.graphics();
graphics.lineStyle(2, 0xffffff, 1);
path.draw(graphics, 64);

// 4. Create a PathFollower sprite that moves along the path
const follower = this.add.follower(path, 50, 300, 'ship');
follower.startFollow({
    duration: 5000,
    rotateToPath: true,
    repeat: -1,
    yoyo: true
});

Core Concepts

Path

A `Phaser.Curves.Path` is a container that combines multiple Curves into one continuous compound curve. Curves in a Path do not need to be connected end-to-end. Only the order of curves affects point calculations along the path.

Created via factory: `this.add.path(x, y)` where x/y is the starting point.

Key properties:

  • `curves` -- array of `Phaser.Curves.Curve` objects in the Path
  • `startPoint` -- `Vector2`, the defined starting position
  • `autoClose` -- boolean, if true `getPoints()` appends the first point at the end
  • `defaultDivisions` -- number (default: 12), divisions per curve when calling `getPoints()`
  • `name` -- string, empty by default, for developer use

Curves

All curve types extend `Phaser.Curves.Curve` (the base class). Every curve supports:

  • `getPoint(t, out)` -- get a point at position t (0-1) based on curve parameterization
  • `getPointAt(u, out)` -- get a point at position u (0-1) based on arc length (evenly spaced)
  • `getPoints(divisions, stepRate, out)` -- array of points along the curve
  • `getSpacedPoints(divisions, stepRate, out)` -- array of equidistant points by arc length
  • `getDistancePoints(distance)` -- points spaced by pixel distance
  • `getLength()` -- total arc length in pixels
  • `getBounds(out, accuracy)` -- bounding Rectangle
  • `getTangent(t, out)` / `getTangentAt(u, out)` -- unit tangent vector
  • `getStartPoint(out)` / `getEndPoint(out)` -- first/last points
  • `getRandomPoint(out)` -- random point on the curve
  • `draw(graphics, pointsTotal)` -- render the curve onto a Graphics object
  • `active` -- boolean, when false the parent Path skips this curve

PathFollower

A `Phaser.GameObjects.PathFollower` is a Sprite with the `Components.PathFollower` mixin. It uses an internal Tween (a number counter from 0 to 1) to advance along a Path each frame.

Created via factory: `this.add.follower(path, x, y, texture, frame)`

The PathFollower component provides:

  • `path` -- the `Phaser.Curves.Path` being followed
  • `pathTween` -- the internal Tween driving movement
  • `pathOffset` -- `Vector2`, offset added to path coordinates
  • `pathVector` -- `Vector2`, current position on the path
  • `pathDelta` -- `Vector2`, distance traveled since last frame
  • `rotateToPath` -- boolean, auto-rotate to face path direction
  • `pathRotationOffset` -- number (degrees), added to auto-rotation

Common Patterns

Creating Paths with Chained Curves

Path has convenience methods that create curves starting from the previous end point:

const path = this.add.path(100, 500);

path.lineTo(300, 100);                          // straight line
path.cubicBezierTo(500, 100, 350, 50, 450, 50); // cubic bezier (endX, endY, cp1X, cp1Y, cp2X, cp2Y)
path.quadraticBezierTo(700, 400, 600, 100);     // quadratic bezier (endX, endY, cpX, cpY)
path.splineTo([                                  // spline through points
    new Phaser.Math.Vector2(750, 300),
    new Phaser.Math.Vector2(600, 500)
]);
path.ellipseTo(50, 80, 0, 270, false, 0);       // ellipse arc (xRadius, yRadius, startAngle, endAngle, clockwise, rotation)
path.circleTo(40);                               // shortcut for ellipseTo with equal radii and 0-360

// Jump to a new position without drawing (creates a gap)
path.moveTo(400, 400);
path.lineTo(500, 400);

// Close the path by connecting end to start
path.closePath();

Adding Standalone Curve Objects

const path = new Phaser.Curves.Path(0, 0);

// Add pre-constructed curve objects
const line = new Phaser.Curves.Line(new Phaser.Math.Vector2(0, 0), new Phaser.Math.Vector2(200, 200));
path.add(line);

const spline = new Phaser.Curves.Spline([ 200, 200, 300, 100, 400, 300 ]);
path.add(spline);

const ellipse = new Phaser.Curves.Ellipse(400, 300, 100, 60, 0, 360, false, 0);
path.add(ellipse);

Getting Points Along a Path

// Array of points (uses defaultDivisions per curve)
const points = path.getPoints();

// With explicit divisions per curve
const detailed = path.getPoints(32);

// Equally spaced points along the entire path
const spaced = path.getSpacedPoints(100);

// Single point at normalized position (0-1)
const midpoint = path.getPoint(0.5);

// Tangent vector at a position
const tangent = path.getTangent(0.5);

// Total path length in pixels
const length = path.getLength();

// Bounding rectangle
const bounds = path.getBounds();

Drawing Paths with Graphics

const graphics = this.add.graphics();

// Draw entire path
graphics.lineStyle(2, 0x00ff00, 1);
path.draw(graphics, 64); // 64 = points per curve for smoothness

// Draw individual curves
graphics.lineStyle(1, 0xff0000,
Read more
Ships withphaser

Phaser is a fast, free, and fun open source HTML5 game framework that offers WebGL and Canvas rendering across desktop and mobile web browsers and has been actively developed for over 13 years.

Get the whole plugin
Stats
40,311
Stars
7,160
Forks
Active
Maintenance
JavaScript
Language
MIT
License
24d ago
Last commit
13y ago
Created
13d ago
Added

Repo: phaserjs/phaser

Other skills on phaser.