animations = ['idle' => ['flags' => [], 'coords' => self::frames($frames)]]; $this->frameDuration = $frameDuration; $this->loop = $lifetime !== null; $this->remaining = $lifetime ?? $frameDuration * count($frames); $this->setAnimation('idle'); } public function withMotion(float $vx, float $vy, float $gravity): self { $this->vx = $vx; $this->vy = $vy; $this->gravity = $gravity; return $this; } public function update(float $deltaTime): void { if (!$this->active) return; $this->vy += $this->gravity * $deltaTime; $this->x += $this->vx * $deltaTime; $this->y += $this->vy * $deltaTime; $this->updateSprite($deltaTime); $this->remaining -= $deltaTime; if ($this->remaining <= 0) { $this->active = false; $this->visible = false; } } }