PlatformerCamera
new PlatformerCamera(physics : Object, options : Object)PlatformerCamera - Flexible 2D camera for platformer games
A highly configurable camera designed for 2D platformer games. Supports multiple follow modes per axis for different game styles.
Follow Modes:
FollowMode.FOLLOW- Smooth follow with velocity-based lookaheadFollowMode.DEADZONE- Only move when target exits the deadzoneFollowMode.LOCKED- Fixed position on that axis
Screen Anchor:
Use anchor to position where the target rests on screen (0-1 normalized).
(0.5, 0.5)= center (default)(0.25, 0.5)= 25% from left edge (Mario-style)(0.5, 0.75)= 75% from bottom (vertical climber)
Mario-Style Features:
anchor: (0.25, 0.5)- Target on left side of screenlockBackward: true- Camera only scrolls right, never backwardedgeEvents: { left: true }- Dispatch events when target hits viewport edge
Use Cases:
- Side-scroller (Mario):
followModeX: DEADZONE, anchor: (0.25, 0.5), lockBackward: true - Vertical climber:
followModeY: FOLLOW, anchor: (0.5, 0.25) - Top-down:
followModeX: FOLLOW, followModeY: FOLLOW - Single-screen:
followModeX: LOCKED, followModeY: LOCKED
Constructor Parameters
physicsObjectoptionsoptionalObjectDefault is
{}.targetoptionalTHREE.Object3DTarget object to followzoomoptionalnumberVisible area half-height in world units
Default is10.anchoroptionalTHREE.Vector2Screen anchor position (0-1). Where target rests on screen. Default: (0.5, 0.5) = centerfollowModeXoptionalstringX-axis follow mode: FollowMode.FOLLOW, DEADZONE, or LOCKED
Default is'follow'.followModeYoptionalstringY-axis follow mode: FollowMode.FOLLOW, DEADZONE, or LOCKED
Default is'deadzone'.offsetoptionalTHREE.Vector3Offset from target position in world unitsdeadzoneoptionalTHREE.Vector2Deadzone half-sizes in world units (default: 2, 1.5)lookaheadoptionalTHREE.Vector2Velocity-based lookahead offsets (default: 3, 0)lookaheadSpeedoptionalnumberLookahead transition speed
Default is3.boundsoptionalTHREE.Box2Camera bounds (level edges)dampingoptionalnumberCamera movement smoothing factor
Default is3.distanceoptionalnumberCamera Z position (distance from XY plane)
Default is50.nearoptionalnumberNear clipping plane
Default is0.1.faroptionalnumberFar clipping plane
Default is1000.lockBackwardoptionalbooleanCamera only scrolls forward (positive X), never backward
Default isfalse.edgeEventsoptionalObjectEmit 'boundaryHit' events when target exceeds viewport edgesedgeEvents.leftoptionalbooleanEmit event when target goes past left edge
Default isfalse.edgeEvents.rightoptionalbooleanEmit event when target goes past right edge
Default isfalse.edgeEvents.topoptionalbooleanEmit event when target goes past top edge
Default isfalse.edgeEvents.bottomoptionalbooleanEmit event when target goes past bottom edge
Default isfalse.
Example
import { PlatformerCamera, FollowMode } from '@three-blocks/pro';
// Mario-style side-scroller
const camera = new PlatformerCamera(physics, {
target: playerMesh,
zoom: 10,
anchor: new THREE.Vector2(0.25, 0.5), // Player on left side
followModeX: FollowMode.DEADZONE,
followModeY: FollowMode.DEADZONE,
deadzone: new THREE.Vector2(1, 2),
lookahead: new THREE.Vector2(3, 0),
damping: 5,
lockBackward: true,
edgeEvents: { left: true, bottom: true },
});
// Handle player hitting viewport boundary
camera.addEventListener('boundaryHit', (event) => {
if (event.edge === 'left') {
playerBody.teleport(new THREE.Vector3(event.bounds.min.x, event.position.y, 0));
}
});
// In animation loop
camera.update(delta);
renderer.render(scene, camera);
Properties
# .anchor : THREE.Vector2
Screen anchor position (0-1 normalized). Defines where the target rests on screen.
- (0.5, 0.5) = center
- (0.25, 0.5) = 25% from left (Mario-style)
# .followModeX : string
X-axis follow mode.
# .followModeY : string
Y-axis follow mode.
# .offset : THREE.Vector3
Offset from target position in world units. Use to position camera focus above/below target center.
# .deadzone : THREE.Vector2
Deadzone half-sizes in world units. Target can move freely within deadzone without camera movement.
# .lookahead : THREE.Vector2
Velocity-based lookahead offsets. Camera looks ahead in the direction of movement.
# .lookaheadSpeed : number
Lookahead transition speed. Higher values = faster transition to lookahead position.
# .bounds : THREE.Box2|null
Camera bounds (level edges). Camera will not move outside these bounds.
# .damping : number
Camera movement smoothing factor. Higher values = faster camera movement.
# .distance : number
Camera Z position (distance from XY plane).
# .lockBackwardX : boolean
Lock backward scrolling on X axis (Mario-style one-way scrolling). When enabled, camera only scrolls in positive X direction.
# .lockBackwardY : boolean
Lock backward scrolling on Y axis. When enabled, camera only scrolls in positive Y direction.
# .edgeEvents : Object|null
Edge events configuration. When set, dispatches 'boundaryHit' events when target exceeds viewport edges.
# .targetOffset :
# .zOffset :
# .forwardOnly :
# .lockBackward :
# .constrainPlayer :
# .lookaheadDamping :
Methods
getPlayerBounds#
getPlayerBounds() : THREE.Box2|nullGet the current player-allowed bounds based on camera viewport. Returns the Box2 representing where the player can be without triggering boundary events.
Returns
THREE.Box2 | null — Player bounds in world coordinates, or null if edgeEvents not setupdate#
update(delta : number)Update camera position. Call each frame after physics sync.
Parameters
deltanumbersnapToTarget#
snapToTarget() : thisImmediately snap camera to target position. Use when teleporting the player or resetting the level.
Returns
this — For chainingsetBounds#
setBounds(bounds : THREE.Box2) : thisSet camera bounds.
Parameters
boundsTHREE.Box2Returns
this — For chainingclearBounds#
clearBounds() : thisClear camera bounds.
Returns
this — For chainingdispose#
dispose()Clean up resources.