2D Game Engine

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.