95 lines
3.0 KiB
Markdown
95 lines
3.0 KiB
Markdown
# 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
|
||
|
||
```bash
|
||
npm install
|
||
npm run dev
|
||
```
|
||
|
||
## Documentation
|
||
|
||
- [Game Design](./docs/DESIGN.md) - gameplay mechanics, levels
|
||
- [Architecture](./docs/ARCHITECTURE.md) - code structure, patterns
|
||
- [Assets](./docs/ASSETS.md) - sprites, audio, tilemaps
|
||
|
||
## Commands
|
||
|
||
- `npm run dev` - development server
|
||
- `npm run build` - production build
|
||
- `npm run preview` - preview build
|
||
- `npm run check` - **запускать перед коммитом** (typecheck + lint)
|
||
- `npm run lint` - проверка ESLint
|
||
- `npm run lint:fix` - автоисправление ESLint/Prettier
|
||
- `npm run typecheck` - проверка TypeScript
|
||
- `npm run format` - форматирование Prettier
|
||
|
||
## Phaser 3 — Правила разработки
|
||
|
||
### 1. Обработчики событий накапливаются при рестарте
|
||
|
||
Keyboard Keys в Phaser переиспользуются между рестартами сцены. **Всегда удаляй старые обработчики:**
|
||
|
||
```typescript
|
||
// ПРАВИЛЬНО
|
||
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) остаются видимыми. **Явно останавливай сцены:**
|
||
|
||
```typescript
|
||
const sceneManager = this.game.scene; // Используй глобальный менеджер!
|
||
sceneManager.stop('UIScene');
|
||
sceneManager.stop('GameOverScene');
|
||
sceneManager.start('GameScene');
|
||
```
|
||
|
||
### 3. Null reference при рестарте UI-сцены
|
||
|
||
`update()` может вызваться до `create()`. **Сбрасывай массивы и добавляй проверки:**
|
||
|
||
```typescript
|
||
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` для остановки текущей сцены
|