Kamera (CameraManager)
Follow, zoom, granice, efekty shake/fade/flash i konwersja worldToScreen. Z fallbackiem dla backendów bez efektów.
API#
ts
follow(target, lerpX = 0.1, lerpY = 0.1); stopFollow()
setZoom(z); getZoom(); setBounds(x, y, w, h)
setBackgroundColor(color); getCenter(); worldToScreen(x, y)
shake(duration = 100, intensity = 0.01)
fadeIn(duration = 300, r = 0, g = 0, b = 0)
fadeOut(duration = 300, r = 0, g = 0, b = 0)
flash(duration = 150, r = 255, g = 255, b = 255)
resetEffects(); supportsEffects(): boolean
Podążanie za graczem#
ts
const camera = this.getCamera()
camera.setBounds(0, 0, 2000, 1400)
camera.follow(this.player, 0.08, 0.08)
camera.setZoom(1.5)
Lerp 0.08 daje miękkie, kinowe podążanie; 1 to sztywne przyklejenie.
Efekty#
ts
camera.shake(220, 0.012)
camera.flash(120, 255, 255, 255)
camera.fadeOut(400, 0, 0, 0)
this.getTimer().delay(0.45, () => {
this.getEvents().emit('request:scene', { to: 'game-over' })
})
ts
camera.fadeIn(500)
Przykład: feedback przy trafieniu#
ts
this.getEvents().subscribeForScene(this.id, 'player:hit', () => {
this.getCamera().shake(180, 0.008)
this.getCamera().flash(90, 255, 64, 64)
this.playSound('hurt', { channel: 'sfx', volume: 0.8 })
})
Konwersja współrzędnych#
ts
const screen = camera.worldToScreen(this.player.x, this.player.y)
this.damageLabel.setPosition(screen.x, screen.y - 40)
Wsparcie efektów w backendach#
ts
if (camera.supportsEffects()) {
camera.shake(200, 0.01)
}
Informacja
supportsEffects() zwraca false, gdy backend nie realizuje efektów. Wywołania efektów na takim backendzie nie rzucają — są bezpiecznie ignorowane. To część kontraktu portów: minimalny adapter działa, tylko biedniej.
HUD niezależny od kamery#
Obiekty HUD przyklej do ekranu przez setScrollFactor(0):
ts
const hud = this.createText('score', { x: 16, y: 16, text: '0' })
hud.setScrollFactor(0).setDepth(1000)
Kamera przesuwa świat, HUD zostaje na miejscu.