Files
chicken-game/CLAUDE.md
2026-01-17 11:49:36 +03:00

3.0 KiB
Raw Blame History

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

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 переиспользуются между рестартами сцены. Всегда удаляй старые обработчики:

// ПРАВИЛЬНО
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 для остановки текущей сцены