phaser-arcade-physics
Use Phaser 4 Arcade Physics: enable the world, give sprites bodies, set velocity/acceleration/gravity, and resolve collisions with colliders, overlaps, groups, and world bounds. Use when a Phaser game needs movement or collisions — when the user mentions Arcade Physics, this.physics, setVelocity, co
By gamedev-skills · 2,168 installs
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill phaser-arcade-physics
Source repository · Upstream listing
Phaser 4 Arcade Physics
Add movement and collision to a Phaser game with the lightweight Arcade
Physics engine (AABB rectangles and circles only). Targets Phaser 4.2 for
new projects; inspect the installed major before editing an existing project.
When to use
Use for top down or platformer movement, velocity/acceleration/gravity, bouncing,
world bounds, and collision/overlap resolution between sprites, groups, and tiles.
Use when the scene enables physics: { default: 'arcade' } and code calls
this.physics.add. , body.setVelocity , or this.physics.add.collider .
When not to use: the Game config, scene structure, asset loading, or
cameras → use phaser core . Hinges, springs, complex polygons, or stacking
rigid bodies → use Matter physics (a different engine; Arcade and Matter bodies
do not interact). For engine agnostic feel tuning see physics tuning .
Core workflow
1. Enable the world. Set physics: { default: 'arcade', arcade: { gravity:
{...}, debug: true } } in the game or scene config. Turn debug on while
building to see body outlines and velocity vectors.
2. Give a sprite a body. Create it with this.physics.add.sprite(...) (dynamic)
or this.physics.add.staticImage(...) (static), or attach to an existing object
with this.physics.add.existing(obj) .
3. Drive it through the body, not by setting x / y . Use setVelocity ,
setAcceleration , gravity, setBounce , and setCollideWorldBounds . The engine
integrates position from velocity each step (already frame rate independent).
4. Resolve interactions. this.physics.add.collider(a, b) separates bodies;
this.physics.add.overlap(a, b, cb) detects without separating (pickups,
triggers). Pass a callback to react.
5. Group many objects. Use this.physics.add.group() (dynamic) or
staticGroup() (platforms) so one collider call handles all members.
6. Check ground contact with body.onFloor() / body.blocked.down before
jumping. Run with debug: true and confirm bodies, contacts, and bounds.
Patterns
1. Enable Arcade Physics (game config)
2. Top down movement (velocity from input)
3. Platformer jump (gravity + ground check)
4. Colliders vs overlaps (separate vs detect)
5. A group of moving objects
Pitfalls
Sprite ignores physics → it was added with this.add.sprite instead of
this.physics.add.sprite (or this.physics.add.existing(obj) ), so it has no body.
Setting sprite.x directly fights the engine → move dynamic bodies with
setVelocity / setAcceleration . Direct position writes can tunnel through colliders.
Diagonal movement is faster → independent X and Y velocities add up; normalise
the velocity vector and rescale to the intended speed.
Platforms get pushed by the player → use a staticGroup , or set
body.setImmovable(true) on a dynamic platform.
onFloor() is always false → the body needs something to collide with; add the
collider against the ground/platforms before checking, and ensure gravity is on.
Standing on an ordinary dynamic body does not count as blocked; make platforms
static, immovable, or non pushable ( platform.setPushable(false) ).
Moved a static body but collisions are stale → static bodies don't auto sync;
call body.updateFromGameObject() (or refreshBody() on the game object).
Collider added every frame → register collider / overlap once in create ,
not in update .
Fast bullets pass through thin walls → Arcade has no swept collision; a body
that moves farther than a wall's thickness in one physics step skips it. Thicken
the wall's body, cap speed with setMaxVelocity , or raise the step rate
( arcade: { fps: 120 } , default 60) at extra CPU cost.
Bodies pass through each other after adding collision categories → a pair only
collides when each side's mask includes the other's category, and untouched bodies
keep mask 1 . Widen the other side's mask too, and set groups and their members
separately (see the reference).
Drag does nothing while a key is held → Arcade applies drag only on an axis
with zero acceleration; set the acceleration to 0 when input stops.
References
For body anatomy and tuning (drag, bounce, max velocity, custom setSize /
setCircle / setOffset hitboxes, collision categories/masks, and worldbounds
events), read references/bodies and collision.md .
Related skills
phaser core — game config, scenes, loader, cameras (the prerequisite setup).
physics tuning — engine agnostic feel (fixed timestep, tunneling, jitter).
platformer / tower defense — genres that compose this skill.
level design — laying out tile/platform geometry these bodies collide with.