@kvisaz/phaser-common
v1.0.8
Published
Common reusable engine layer for Phaser 3 games (kvisaz style)
Readme
@kvisaz/phaser-common
Общий переиспользуемый движковый слой для игр на Phaser 3 (стиль Kvisaz Games): массивы, коллекции, события, эффекты, вёрстка/layout, сервисы, карточные игры и game-core.
Документация
Выделен из проекта как отдельная библиотека по образцу phaser-sugar. Граница изолирована: внутри пакета запрещены импорты извне (кроме библиотек и внутренних модулей).
Отдельно - runGameCore из GameCore - создает обвязку со звуками, рекламой, загрузкой к которой толкьо надо подключить свой игровой компонент (класс с методом destroy() который вызывается при перезапуске)
/**
* Запуск тестовой игры на GameCore v1
* - config - настройки Phaser (config.phaser) и игрового ядра (ads/sound/cursor/storage и т.д.)
* - assets - набор ассетов, которые ядро грузит в Boot-сцене
* - events - общая шина, связывающая фичи ядра с контентом игры
* - gameConfig - ядро кладёт конфиг игры в context.config для контента
* - createGameContent - создаёт игровой контент (объект с destroy()):
* ядро регистрирует его на очистку при перезапуске сцены
*/
runGameCore<ITestEvents, ITestConfig, ITestSaveData>({
config: testGameCoreConfig,
assets: testAssets,
events: new GameEventBus<ITestEvents>(),
gameConfig: testConfig,
createGameContent: (context) => new TestGameContent(context),
});Тестовая игра (npm run start)
npm run start запускает самодостаточную тестовую игру на GameCore v1 из этой библиотеки
(test-game/): события шины, сохранение state, fullscreen/rewarded-реклама (mock),
sound mute, cursor, restart сцены и cleanup. Dev-сервер: порт 8082;
деплой-сборка: npm run build:test-game → docs/test-game.
Storybook
Живая демо-среда доступна в собранной static-сборке:
Пересобрать демо:
npm run build-storybookСборка и проверки
npm install
npm run typecheck # проверка типов
npm run build # Vite lib mode (dist/index.mjs + dist/index.js) + генерация .d.ts
npm test # jest
npm run storybook # dev-сервер демо (порт 8081)⚠️ Не создавай npm-скрипт
publish— npm выполняет его повторно после публикации (двойная публикация). Для релиза используйnpm run release.
Использование
Пакет рассчитан на глобальный Phaser (подключается на странице, типы — через
types: ["phaser"] в tsconfig потребителя). Точка входа — src/index.ts, типы — dist/index.d.ts.
Два формата: ESM и CJS
npm run build собирает dist/ сразу в двух форматах, чтобы пакет одинаково
подходил и современным, и классическим потребителям:
dist/index.mjs— ESM (import). Подключается бандлерами и современным Node через"module"/exports.importвpackage.json. Даёт tree-shaking: неиспользуемые функции пакета могут быть исключены из итоговой сборки игры.dist/index.js— CJS (require), аналог сборки phaser-sugar. Подключается через"main"/exports.require, работает в Node и старых сборках без ESM.
Какой файл подтянется — решает потребитель (бандлер/Node) по полю exports;
ручное указание пути не требуется.
Локализация (Phaser-way, через scene.data)
Ядро жёстко выбирает язык до создания контента: ?lang= из URL → язык платформы →
defaultLang (en/ru есть всегда, другие языки добавляются словарями). Выбранный язык
ядро пишет в scene.data (setSceneLocale).
Игровой контент пересоздаётся вместе со сценой, поэтому читает тексты сразу при создании из контекста, без подписок и перекомпоновки:
// перевод по ключу (fallback на defaultLang)
const t = context.locale.t;
label.setText(t("btn_start"));
// ручной выбор языка из меню настроек (если нужно)
context.locale.setLanguage("en");Подписка на onSceneLocaleChange — не обязательный слой: если какому-то компоненту
нужна живая реакция на смену языка, он сам рядом с собой решает, как подписываться
и как пересоздавать тексты. Движок не навязывает единый паттерн перерисовки.
Словари — только данные в config.locale.languages; логика выбора уже в ядре.
