Newer
Older
rpg / packages / engine / src / render / fx / FxPop.ts
import { Container } from 'pixi.js';
import type { Updatable } from '../../core/Updatables';
import { samplePop, type FxPopSpec } from './fxSim';

/**
 * Появление с овершутом масштаба (подбор, спавн, UI-подтверждение). Базовый
 * масштаб снимается в конструкторе — эффект не конфликтует с вьюхами, масштаб
 * которых меняет игра; вьюху не уничтожает (она «уже есть»).
 */
export class FxPop implements Updatable {
    private t = 0;
    private finished = false;
    private readonly base: number;

    constructor(
        private readonly view: Container,
        private readonly spec: FxPopSpec = {}
    ) {
        this.base = view.scale.x;
    }

    /** Прекратить эффект и вернуть базовый масштаб. */
    cancel(): void {
        this.finished = true;
        if (!this.view.destroyed) this.view.scale.set(this.base);
    }

    /** Вьюха разрушена извне или эффект закончился. */
    get destroyed(): boolean {
        return this.finished || this.view.destroyed;
    }

    update(dt: number): void {
        if (this.finished) return;
        if (this.view.destroyed) return;
        this.t += dt;
        this.view.scale.set(this.base * samplePop(this.t, this.spec));
        if (this.t >= (this.spec.duration ?? 0.25) - 1e-6) this.finished = true;
    }
}