ViewportManager
Utility for managing adaptive viewport.
Import
typescript
import { ViewportManager } from "@utils/ViewportManager";Constructor
typescript
constructor(scene: Phaser.Scene)Parameters
scene- Phaser scene
Example
typescript
const viewportManager = new ViewportManager(this);Methods
init(callback?)
Initialize with optional callback for tracking changes.
typescript
init(callback?: (width: number, height: number) => void): voidExample
typescript
viewportManager.init((width, height) => {
console.log(`Viewport changed: ${width}x${height}`);
this.repositionUI(width, height);
});getSize()
Get current viewport size.
typescript
getSize(): { width: number; height: number }Returns
Object with viewport width and height.
Example
typescript
const { width, height } = viewportManager.getSize();
console.log(`Size: ${width}x${height}`);isLandscape()
Check landscape orientation.
typescript
isLandscape(): booleanReturns
true if width > height
Example
typescript
if (viewportManager.isLandscape()) {
this.enableWideControls();
}isPortrait()
Check portrait orientation.
typescript
isPortrait(): booleanReturns
true if height >= width
getAspectRatio()
Get aspect ratio.
typescript
getAspectRatio(): numberReturns
Number (width / height). Example: 1.777 for 16:9
Example
typescript
const ratio = viewportManager.getAspectRatio();
if (ratio > 2) {
console.log("Ultrawide display detected!");
}getDeviceType()
Detect device type.
typescript
getDeviceType(): "mobile" | "tablet" | "desktop"Returns
"mobile"- if minimum size < 768"tablet"- if 768-1024"desktop"- if > 1024
Example
typescript
const deviceType = viewportManager.getDeviceType();
if (deviceType === "mobile") {
this.enableTouchControls();
}calculateOptimalZoom()
Calculate optimal zoom.
typescript
calculateOptimalZoom(): numberReturns
Recommended zoom level based on viewport.
setWorldBoundsProportional(baseSize)
Set world bounds proportional to viewport.
typescript
setWorldBoundsProportional(baseSize: number = 2000): voidParameters
baseSize- base world size (default 2000)
Example
typescript
// World will be proportional to viewport
viewportManager.setWorldBoundsProportional(2000);destroy()
Disable resize tracking.
typescript
destroy(): voidEvents
resize
Fires on viewport size change.
typescript
// Automatically handled via init() callback
viewportManager.init((width, height) => {
// Called on every resize!
});Usage Examples
Basic Usage
typescript
export class MyScene extends Phaser.Scene {
private viewportManager!: ViewportManager;
create() {
this.viewportManager = new ViewportManager(this);
this.viewportManager.init((width, height) => {
this.adaptToViewport(width, height);
});
}
private adaptToViewport(width: number, height: number) {
console.log(`New size: ${width}x${height}`);
console.log(`Device: ${this.viewportManager.getDeviceType()}`);
console.log(
`Orientation: ${
this.viewportManager.isLandscape() ? "Landscape" : "Portrait"
}`
);
}
}UI Adaptation
typescript
viewportManager.init((width, height) => {
// Position UI relative to size
this.healthBar.setPosition(16, 16);
this.minimap.setPosition(width - 216, height - 216);
// Adapt by device
const deviceType = viewportManager.getDeviceType();
if (deviceType === "mobile") {
this.minimap.setScale(0.5);
} else {
this.minimap.setScale(1);
}
});Adaptive Zoom
typescript
viewportManager.init((width, height) => {
const zoom = viewportManager.calculateOptimalZoom();
this.cameras.main.setZoom(zoom);
});See Also
- Adaptive Viewport - complete guide
- GameModeManager - game modes