Empress Core
Точка входа в приложение. Отвечает за инициализацию и настройку всех модулей фреймворка, управление жизненным циклом и связывание сигналов с группами систем.
Назначение
Модуль решает следующие задачи:
- Инициализация всех модулей фреймворка
- Регистрация и управление зависимостями
- Связывание сигналов с группами систем
- Управление жизненным циклом приложения
Архитектура
EmpressCore является фасадом для всех основных модулей фреймворка:
-
Модули данных:
EntityStorage
- хранилище игровых сущностейSystemsContainer
- кэш систем
-
Модули выполнения:
ExecutionController
- управление выполнением системSignalsController
- управление сигналамиLifeCycle
- управление жизненным циклом
-
Вспомогательные модули:
TimerController
- управление таймерамиServiceContainer
- контейнер зависимостей
Использование
Базовая инициализация
// Создание приложения
const empress = new EmpressCore();
// Инициализация модулей
empress.init();
// Запуск
empress.start();
Связывание сигналов и групп
// Конфигурация связей
const baseSignals: ISignalConfig[] = [
{
signal: OnUpdateSignal,
groups: [PhysicsGroup, AnimationGroup]
},
{
signal: OnStartSignal,
groups: [InitializationGroup]
}
];
// Установка связей
empress.listen(baseSignals);
Регистрация глобальных сервисов
// Регистрация пользовательских сервисов
empress.registerGlobalServices([
{
provide: GameState,
useFactory: () => new GameState()
},
{
provide: ResourceLoader,
useFactory: () => new ResourceLoader()
}
]);
API
EmpressCore
Методы
init(): void
- инициализирует все модули приложенияstart(): void
- запускает приложениеlisten(configs: ISignalConfig[]): void
- устанавливает связи между сигналами и группамиregisterGlobalServices(providers: Provider[]): void
- регистрирует глобальные сервисы
Интерфейсы
interface ISignalConfig {
signal: Signal<any>;
groups: GroupType<any>[];
}
interface Provider {
provide: any;
useFactory: () => any;
}
Порядок инициализации
-
Создание приложения:
const empress = new EmpressCore();
-
Инициализация модулей:
empress.init();
- Создаются основные сервисы
- Регистрируются зависимости
- Настраивается жизненный цикл
-
Установка связей сигналов:
empress.listen(baseSignals);
- Связываются сигналы и группы систем
- Устанавливаются подписки
-
Запуск приложения:
empress.start();
- Запускается жизненный цикл
- Отправляется сигнал старта
- Начинается выполнение систем
Доступ к сервисам
Все основные модули фреймворка регистрируются как глобальные сервисы и доступны через внедрение зависимостей:
Основные сервисы
EntityStorage
- хранилище сущностейSystemsContainer
- контейнер системLifeCycle
- управление жизненным цикломTimerController
- управление таймерамиExecutionController
- управление выполнениемSignalsController
- управление сигналами
Способы получения сервисов
- Через декоратор @Inject в Системах и Группах:
class PhysicsSystem extends System {
@Inject(TimerController)
private timerController!: TimerController;
@Inject(EntityStorage)
private entityStorage!: EntityStorage;
}
- Через ServiceContainer напрямую:
const lifecycle = ServiceContainer.instance.get(LifeCycle);
const entityStorage = ServiceContainer.instance.get(EntityStorage);
Подключение пользовательских сервисов
Все дополнительные модули и аддоны для фреймворка рекомендуется регистрировать как глобальные сервисы. Это обеспечивает:
- Единую точку доступа к сервису
- Возможность внедрения в любую Систему или Группу
- Управление жизненным циклом сервиса
// Регистрация пользовательского сервиса
empress.registerGlobalServices([
{
provide: GameStateManager,
useFactory: () => new GameStateManager()
}
]);
// Использование в системе
class GameSystem extends System {
@Inject(GameStateManager)
private gameState!: GameStateManager;
}
FAQ
Когда регистрировать пользовательские сервисы?
Пользовательские сервисы лучше регистрировать после init()
, но до start()
:
empress.init();
empress.registerGlobalServices([...custom-services]);
empress.start();
Как добавить системы, выполняемые при старте?
Используйте OnStartSignal
в конфигурации сигналов:
const signals = [{
signal: OnStartSignal,
groups: [LoadingGroup, InitGroup]
}];
empress.listen(signals);
Можно ли добавлять сигналы после старта?
Да, метод listen()
можно вызывать в любой момент:
// Добавление новых сигналов
empress.listen([{
signal: customSignal,
groups: [CustomGroup]
}]);