Newer
Older
PixelPaintWar / apps / client / src / scenes / game / application / network / handlers / HurricaneSyncHandler.ts
/**
 * HurricaneSyncHandler
 * ハリケーン同期イベントの受信処理を担当する
 * 受信配列を描画コントローラーへ橋渡しする
 */
import { Container } from "pixi.js";
import type {
  CurrentHurricanesPayload,
  UpdateHurricanesPayload,
} from "@repo/shared";
import { HurricaneOverlayController } from "@client/scenes/game/entities/hurricane/HurricaneOverlayController";
import type { WorldViewport } from "@client/scenes/game/application/culling/worldViewport";

/** HurricaneSyncHandler の初期化入力 */
export type HurricaneSyncHandlerOptions = {
  worldContainer: Container;
};

/** ハリケーン同期イベントの適用を担当する */
export class HurricaneSyncHandler {
  private readonly overlayController: HurricaneOverlayController;

  constructor({ worldContainer }: HurricaneSyncHandlerOptions) {
    this.overlayController = new HurricaneOverlayController(worldContainer);
  }

  /** current-hurricanes を描画へ置換反映する */
  public handleCurrentHurricanes = (
    payload: CurrentHurricanesPayload,
  ): void => {
    this.overlayController.replaceAll(payload);
  };

  /** ハリケーン状態配列を描画へ反映する */
  public handleUpdateHurricanes = (payload: UpdateHurricanesPayload): void => {
    this.overlayController.applyUpdates(payload);
  };

  /** 可視矩形に基づいてハリケーン表示を切り替える */
  public applyViewportCulling(viewport: WorldViewport, marginPx: number): void {
    this.overlayController.applyViewportCulling(viewport, marginPx);
  }

  /** 管理中リソースを破棄する */
  public destroy(): void {
    this.overlayController.destroy();
  }
}