3.0 KiB
3.0 KiB
Platformer Game
Browser-based platformer game built with Phaser 3 and TypeScript.
Tech Stack
- Engine: Phaser 3
- Language: TypeScript
- Build: Vite
- Package Manager: npm
Project Structure
src/
├── scenes/ # Game scenes (Boot, Menu, Game, etc.)
├── entities/ # Game objects (Player, Enemies, Items)
├── systems/ # Core systems (Physics, Input, Audio)
├── config/ # Game configuration
└── assets/ # Sprites, sounds, tilemaps
Quick Start
npm install
npm run dev
Documentation
- Game Design - gameplay mechanics, levels
- Architecture - code structure, patterns
- Assets - sprites, audio, tilemaps
Commands
npm run dev- development servernpm run build- production buildnpm run preview- preview buildnpm run check- запускать перед коммитом (typecheck + lint)npm run lint- проверка ESLintnpm run lint:fix- автоисправление ESLint/Prettiernpm run typecheck- проверка TypeScriptnpm run format- форматирование Prettier
Phaser 3 — Правила разработки
1. Обработчики событий накапливаются при рестарте
Keyboard Keys в Phaser переиспользуются между рестартами сцены. Всегда удаляй старые обработчики:
// ПРАВИЛЬНО
key.removeAllListeners('down');
key.on('down', () => this.shoot());
// Для событий сцены
this.events.off('shoot', this.handleShoot, this);
this.events.on('shoot', this.handleShoot, this);
2. scene.start() НЕ останавливает текущую сцену
Оверлеи (GameOver, Pause) остаются видимыми. Явно останавливай сцены:
const sceneManager = this.game.scene; // Используй глобальный менеджер!
sceneManager.stop('UIScene');
sceneManager.stop('GameOverScene');
sceneManager.start('GameScene');
3. Null reference при рестарте UI-сцены
update() может вызваться до create(). Сбрасывай массивы и добавляй проверки:
create(): void {
this.indicators = []; // Сбрасывай в начале create()
}
update(): void {
if (!this.runState || !this.scoreText) return; // Guard-проверка
}
4. Чеклист при работе со сценами
- Очищать обработчики клавиш в
setupControls() - Очищать
this.eventsобработчики вcreate()илиshutdown() - Сбрасывать массивы/объекты в начале
create() - Добавлять null-проверки в
update()для UI - Использовать
this.game.sceneдля остановки текущей сцены