/
difight
/
ruEngine
Обзор
Документация
Войти
/
difight
/
ruEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
client/src/engine/core/states/GameStateManager.ts
81 строка
3 KB
Andrey Bashkirev
Немного переделал архитектуру
05 авг 2025, 17:15
05 авг 2025, 17:15
144f0db
Код
Авторство
О чём код?
import { BaseGameStateHandler } from "./BaseGameStateHandler"; import { Logger } from "../../utils/Logger"; /** * Менеджер игровых состояний. Управляет регистрацией и переключением состояний. */ export class GameStateManager { private static instance: GameStateManager; /** Зарегистрированные обработчики состояний */ private readonly states = new Map<string, BaseGameStateHandler>(); /** Текущее активное состояние */ private currentState: BaseGameStateHandler | null = null; /** Ожидающее начальное состояние (если ещё не зарегистрировано) */ private pendingInitialState: string | null = null; /** * @param initialState Имя состояния, которое должно быть активировано первым */ private constructor(initialState: string) { this.pendingInitialState = initialState; } /** Получить singleton-экземпляр GameStateManager */ public static getInstance(initialState?: string): GameStateManager { if (!GameStateManager.instance) { if (!initialState) throw new Error("GameStateManager must be initialized with initialState"); GameStateManager.instance = new GameStateManager(initialState); } return GameStateManager.instance; } /** * Регистрирует обработчик состояния * @param stateName Имя состояния * @param handler Обработчик состояния */ public registerHandler(stateName: string, handler: BaseGameStateHandler): void { if (this.states.has(stateName)) { Logger.warn(`State "${stateName}" is already registered. Overwriting.`); } this.states.set(stateName, handler); // Если initialState был указан, но ещё не применён if (this.pendingInitialState === stateName) { this.changeState(stateName); this.pendingInitialState = null; } } /** * Переключает текущее состояние * @param stateName Имя состояния */ public changeState(stateName: string): void { const newState = this.states.get(stateName); if (!newState) { Logger.error(`State "${stateName}" not registered`); return; } if (this.currentState === newState) { Logger.warn(`State "${stateName}" is already active.`); return; } if (this.currentState) { this.currentState.onDeactivate(); } this.currentState = newState; this.currentState.onActivate(); } /** * Возвращает текущий обработчик состояния */ public getCurrentState(): BaseGameStateHandler | null { return this.currentState; } }