event-engine
v1.0.0
Published
ДВЕ СИСТЕМЫ:
Downloads
13
Readme
ДВЕ СИСТЕМЫ:
ЦИКЛ СОБЫТИЙ (EventLoop)
- Для пошаговой симуляции (бои, тики).
- События добавляются в nextLoop.
- Каждые N мс next → current, события обрабатываются синхронно.
Использование:
const loop = new EventLoop(2000); // тик раз в 2 секунды loop.addToLoop(myEvent); // myEvent должен реализовывать IEvent loop.start();
- ШИНА СОБЫТИЙ (EventBus)
- Для асинхронной коммуникации между модулями.
- Паттерн Publisher-Subscriber.
- Обработчики выполняются асинхронно при публикации.
EventLoop — Цикл событий
Цель: Создать детерминированный пошаговый мир.
Задача: Обрабатывать игровые действия (бои, движения) в фиксированные интервалы (тики).
Все синхронные процессы синхронизированы по тактам.
Принцип: Очереди current/next гарантируют порядок и отсутствие гонок в пределах тика.
EventBus — Шина событий Цель: Обеспечить слабую связность модулей. Задача: Передавать сообщения (результаты боёв, изменения состояния) между независимыми системами. Асинхронная коммуникация без прямых зависимостей. Принцип: Publisher-Subscriber. Модули не знают друг о друге, только о формате сообщений.
Инструкция по EventBus 1 Создание шины // Создаём конкретную реализацию (наследник InnerEventBus) class GameEventBus extends InnerEventBus {} const eventBus = new GameEventBus();
2 Создаём обработчик (реализует IEventHandler). Это класс который событие обрабатывает. const battleResultHandler: IEventHandler = { handle: async (event: IEventMessage) => { console.log('Бой завершён:', event.payload); } };
3 Подписываемся на тип события. Передает тип события и экземпляр класса для обработки события. eventBus.subscribe(EventType.BATTLE_RESULT, battleResultHandler);
3.1 Или с типизацией через дженерик. Можно передавать объект с методом handle.
eventBus.subscribe(
EventType.BATTLE_RESULT,
{
handle: async (event) => {
// event теперь BattleResultMessage
console.log(Победитель: ${event.payload.winnerId});
}
}
);
4 Определяем тип сообщения (опционально, для типизации). В payload желательно типизировать данные interface BattleResultMessage extends IEventMessage { name: EventType.BATTLE_RESULT; payload: { winnerId: string; participants: string[]; roundCount: number; }; }
5 Создаём объект события. Его передадим в шину для публикации. const battleResultEvent: BattleResultMessage = { name: EventType.BATTLE_RESULT, payload: { winnerId: 'hero_123', participants: ['hero_123', 'hero_456'], roundCount: 5 }, timestamp: new Date() };
6 Публикация события. Все подписанные обработчики получат это событие eventBus.publish(battleResultEvent);
