Newer
Older
PixelPaintWar / apps / client / src / scenes / game / entities / bomb / BombController.ts
/**
 * BombController
 * 爆弾のModelとViewの橋渡しを担うコントローラー
 * 時間更新ごとの状態遷移と描画同期を統合する
 */
import { BombModel } from "./BombModel";
import { BombView } from "./BombView";

type BombControllerOptions = {
  x: number;
  y: number;
  radiusGrid: number;
  explodeAtElapsedMs: number;
};

/** 爆弾1つ分の状態と描画同期を管理するコントローラー */
export class BombController {
  private readonly model: BombModel;
  private readonly view: BombView;

  constructor({ x, y, radiusGrid, explodeAtElapsedMs }: BombControllerOptions) {
    this.model = new BombModel({ x, y, radiusGrid, explodeAtElapsedMs });
    this.view = new BombView();

    const pos = this.model.getPosition();
    this.view.syncPosition(pos.x, pos.y);
    this.view.renderState(this.model.getState(), this.model.getExplosionRadiusGrid());
  }

  public getDisplayObject() {
    return this.view.displayObject;
  }

  public tick(elapsedMs: number): void {
    this.model.update(elapsedMs);
    this.view.renderState(this.model.getState(), this.model.getExplosionRadiusGrid());
  }

  public isFinished(): boolean {
    return this.model.isFinished();
  }

  public destroy(): void {
    this.view.destroy();
  }
}