# ControllerManager

class in `gamepad-manager`, extends `EventDispatcher`

```js
import { ControllerManager } from 'gamepad-manager';
```

Tracks gamepads in stable slots and gives access to the keyboard and mouse. Call `update` once
per frame. A reconnected gamepad returns to its old slot.

> **Note:** Browsers don't expose a gamepad until a button is pressed on it.

Example: Showing the first connected gamepad with the model for its brand

```js
import { PMREMGenerator } from 'three';
import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js';
import { ControllerManager } from 'gamepad-manager';
import { DualShockControllerModel, XboxControllerModel } from 'gamepad-manager/three';

// scene, camera and renderer are initialized here

scene.environment = new PMREMGenerator( renderer ).fromScene( new RoomEnvironment() ).texture;
camera.position.set( 0, - 0.1, 1.27 );

const xbox = new XboxControllerModel();
const dualShock = new DualShockControllerModel();
xbox.rotation.x = 0.95;
dualShock.rotation.x = 0.95;
scene.add( xbox, dualShock );
await Promise.all( [ xbox.loaded, dualShock.loaded ] );

const manager = new ControllerManager();
const pad = manager.getController( 0 );
pad.addEventListener( 'pressed', () => {

	if ( pad.hasRumble ) {

		pad.rumble( 'dual-rumble', { duration: 150, strongMagnitude: 0.8, weakMagnitude: 0.6 } );

	}

} );

const status = document.createElement( 'div' );
status.textContent = 'Plug in a controller and press a button';
status.style.cssText = 'position: absolute; top: 16px; width: 100%; text-align: center; font: 14px sans-serif; color: #888;';
document.body.append( status );

renderer.setAnimationLoop( () => {

	manager.update();
	dualShock.visible = pad.brand === 'playstation';
	xbox.visible = ! dualShock.visible;
	xbox.setFromController( pad );
	dualShock.setFromController( pad );
	status.hidden = pad.connected;
	renderer.render( scene, camera );

} );
```

## Properties

### .controllers: Array<GamepadController>

Gamepads by slot, kept after disconnecting.

### .lastActive: Controller | null

The device used most recently, e.g. for picking which button prompts to show.

## Methods

### .getController

```js
.getController( slot: number ): GamepadController
```

The gamepad in a slot, created if needed so listeners can be added before one connects.
Check `connected` before using it.

- `slot`, `number`

### .getKeyboard

```js
.getKeyboard(  ): KeyboardController
```

The keyboard, created on the first call.

### .getMouse

```js
.getMouse(  ): MouseController
```

The mouse, created on the first call.

### .update

```js
.update(  )
```

Updates every device. Call once per frame.

### .reassignSlots

```js
.reassignSlots(  )
```

Removes disconnected gamepads and moves the rest down to fill the slots from 0.

### .dispose

```js
.dispose(  )
```

Removes the keyboard and mouse event listeners.

## Events

### connected

Fired when a gamepad connects. The event object is reused.

- `controller`, `GamepadController`
- `slot`, `number`

### disconnected

Fired when a gamepad disconnects. The event object is reused.

- `controller`, `GamepadController`
- `slot`, `number`
