Skip to content

First Person Controls ​

First Person Controls allow you to create immersive first-person experiences with WASD movement, mouse look, and optional physics-based collision.

Import ​

javascript
import { Controls } from 'mage-engine';

Setup ​

javascript
const fps = Controls.setFirstPersonControls(options);

Options ​

ParameterTypeDefaultDescription
closenumber0Near clipping plane
farnumber1Far clipping plane
positionVector3camera positionStarting position
jumpSpeednumber2Jump velocity
speednumber2Movement speed
slowDownFactornumber20Deceleration factor
massnumber100Character mass (physics)
heightnumber1.8Character height
sensitivitynumber0.002Mouse sensitivity
targetEntitynullEntity to control
physicsEnabledbooleanfalseEnable physics collision

Methods ​

javascript
fps.lock()                  // Lock pointer (enter FPS mode)
fps.unlock()                // Unlock pointer (exit FPS mode)
fps.getDirection(vector)    // Get look direction into vector
fps.getCharacter()          // Get controlled entity
fps.moveForward(distance)   // Move forward/backward
fps.moveRight(distance)     // Move left/right

Basic Example ​

javascript
import { Level, Controls } from 'mage-engine';

class FPSLevel extends Level {
    onCreate() {
        // Setup first person controls
        this.fps = Controls.setFirstPersonControls({
            speed: 3,
            height: 1.8,
            sensitivity: 0.002
        });
        
        // Click to enter FPS mode
        document.addEventListener('click', () => {
            this.fps.lock();
        });
    }
}

Physics-Enabled Example ​

javascript
class PhysicsFPSLevel extends Level {
    onCreate() {
        // Enable physics for collision
        this.fps = Controls.setFirstPersonControls({
            speed: 5,
            jumpSpeed: 8,
            height: 1.8,
            mass: 80,
            physicsEnabled: true
        });
        
        // Jump with spacebar
        Input.keyboard.on('space', () => {
            // Jump handled automatically when physics enabled
        });
    }
}

Pointer Lock ​

First person controls use the Pointer Lock API:

javascript
// Lock pointer on click
document.addEventListener('click', () => {
    fps.lock();
});

// Listen for lock state changes
document.addEventListener('pointerlockchange', () => {
    if (document.pointerLockElement) {
        console.log('Pointer locked');
    } else {
        console.log('Pointer unlocked');
    }
});

Custom Movement ​

javascript
class CustomFPSLevel extends Level {
    onCreate() {
        this.fps = Controls.setFirstPersonControls({ speed: 5 });
    }
    
    update(dt) {
        // Custom movement logic
        const direction = new Vector3();
        this.fps.getDirection(direction);
        
        // Use direction for raycasting, projectiles, etc.
    }
}

See Also ​