# Guide de Développement - Mario Runner

## 🎮 État du Projet

### ✅ Fonctionnalités Implémentées

#### Infrastructure
- ✅ Configuration TypeScript + Vite
- ✅ Structure de projet organisée
- ✅ Phaser 3 intégré
- ✅ PWA configuré (manifest.json)
- ✅ Build et compilation fonctionnels

#### Contrôles
- ✅ **PC** : Contrôle clavier (Flèches gauche/droite + Espace/Haut pour sauter)
- ✅ **Mobile** : Gyroscope pour mouvement + Bouton tactile pour sauter
- ✅ Détection automatique PC vs Mobile
- ✅ Permission gyroscope iOS (requestPermission)
- ✅ Zone morte gyroscope (deadzone) pour stabilité

#### Jeu
- ✅ Classe Player avec physique Arcade
- ✅ Mouvement fluide avec accélération/décélération
- ✅ Saut avec gravité
- ✅ Background qui défile avec effet parallaxe
- ✅ Plateformes statiques (sol + plateformes en l'air)
- ✅ Obstacles (collision → perte de points)
- ✅ Cadeaux (collecte → gain de points)
- ✅ Système de score
- ✅ Timer de 3 minutes
- ✅ Caméra qui suit le joueur
- ✅ Niveau étendu (3x la largeur de l'écran)

#### Scènes
- ✅ BootScene : Chargement des assets
- ✅ MenuScene : Menu avec demande permission gyroscope
- ✅ GameScene : Jeu principal

#### UI
- ✅ Affichage score et timer
- ✅ Info contrôles selon plateforme
- ✅ Bouton retour menu
- ✅ Écran de fin de jeu

### 🚧 À Faire

#### Assets Graphiques
- [ ] Créer spritesheet du personnage (neveu)
  - [ ] Animation idle
  - [ ] Animation walk
  - [ ] Animation jump
- [ ] Background réel (remplacer le ciel généré)
- [ ] Sprites plateformes
- [ ] Sprites obstacles variés
- [ ] Sprites cadeaux variés
- [ ] Icônes PWA (192x192, 512x512)

#### Gameplay
- [ ] Plateformes mobiles
- [ ] Ennemis animés
- [ ] Power-ups spéciaux
- [ ] Checkpoints
- [ ] Système de vies
- [ ] Game Over / Victory screens
- [ ] High scores / LocalStorage

#### Audio
- [ ] Musique de fond
- [ ] Son de saut
- [ ] Son de collecte
- [ ] Son de collision
- [ ] Gestion volume

#### Niveau Design
- [ ] Créer niveaux avec Tiled
- [ ] Importer tilemaps JSON
- [ ] Plusieurs niveaux
- [ ] Progression de difficulté

#### Optimisation
- [ ] Pooling d'objets
- [ ] Optimisation sprites
- [ ] Compression assets
- [ ] Service Worker pour PWA

## 🎯 Commandes Disponibles

```bash
# Développement (hot reload)
npm run dev

# Build de production
npm run build

# Prévisualiser le build
npm run preview
```

## 🧪 Test sur Mobile

### Via réseau local (WiFi)

1. Assurez-vous que mobile et PC sont sur le même WiFi
2. Lancez `npm run dev`
3. Notez l'adresse réseau affichée (ex: `http://192.168.1.10:3000`)
4. Ouvrez cette adresse sur votre mobile

### Via tunnel (pour HTTPS requis par iOS)

**Option 1 : ngrok**
```bash
npm install -g ngrok
npm run dev
# Dans un autre terminal :
ngrok http 3000
```

**Option 2 : localtunel**
```bash
npm install -g localtunnel
npm run dev
# Dans un autre terminal :
lt --port 3000
```

## 📱 Contrôles

### PC (Développement)
- **Flèches Gauche/Droite** : Déplacement
- **Espace** ou **Flèche Haut** : Saut

### Mobile (Production)
- **Gyroscope** : Inclinez le téléphone pour déplacer le personnage
- **Bouton tactile** (bas droite) : Saut

## 🏗 Architecture du Code

### Structure des Fichiers

```
src/
├── main.ts                 # Point d'entrée
├── game.ts                 # Config Phaser
├── scenes/
│   ├── BootScene.ts       # Chargement assets
│   ├── MenuScene.ts       # Menu principal
│   └── GameScene.ts       # Jeu principal
├── controls/
│   ├── GyroControl.ts     # Gestion gyroscope
│   └── JumpButton.ts      # Bouton saut tactile
├── entities/
│   ├── Player.ts          # Joueur
│   ├── Obstacle.ts        # Obstacles
│   └── Gift.ts            # Cadeaux
└── utils/
    └── constants.ts       # Constantes du jeu
```

### Flux du Jeu

```
index.html → main.ts → game.ts
                          ↓
                    BootScene (chargement)
                          ↓
                    MenuScene (permission gyro)
                          ↓
                    GameScene (jeu)
```

### Gestion des Contrôles

```typescript
// GameScene détecte automatiquement la plateforme
if (isMobile) {
    // Gyroscope + Bouton tactile
    gyroControl.getTiltValue() → direction
    jumpButton.on('press') → player.jump()
} else {
    // Clavier
    cursors.left/right → direction
    cursors.space → player.jump()
}

// Mouvement unifié
player.move(direction)
```

## 🎨 Workflow Sprites

Consultez [public/assets/sprites/SPRITE_WORKFLOW.md](public/assets/sprites/SPRITE_WORKFLOW.md) pour le guide complet de création des sprites du personnage.

### Résumé rapide :
1. Détourez la photo (GIMP, remove.bg)
2. Créez les animations (Piskel, Aseprite)
3. Exportez en spritesheet PNG
4. Placez dans `public/assets/sprites/`
5. Chargez dans `BootScene.preload()`
6. Créez animations dans `Player.ts`

## 🔧 Configuration

### Ajuster la Difficulté

Éditez [src/utils/constants.ts](src/utils/constants.ts) :

```typescript
// Physique joueur
export const PLAYER_GRAVITY = 800;        // Gravité
export const PLAYER_JUMP_VELOCITY = -400;  // Force de saut
export const PLAYER_MAX_SPEED = 300;       // Vitesse max
export const PLAYER_ACCELERATION = 50;     // Accélération

// Gyroscope
export const GYRO_DEADZONE = 5;            // Zone morte (degrés)
export const GYRO_MAX_TILT = 30;           // Inclinaison max
export const GYRO_SENSITIVITY = 10;        // Sensibilité

// Niveau
export const LEVEL_DURATION = 180;         // Durée (secondes)
```

### Activer le Mode Debug

Dans [src/game.ts](src/game.ts) :

```typescript
physics: {
    arcade: {
        debug: true,  // Affiche les hitboxes
    },
},
```

## 🐛 Problèmes Courants

### Le gyroscope ne fonctionne pas sur iOS

- ✅ Vérifiez que vous utilisez **HTTPS** (requis par iOS 13+)
- ✅ Vérifiez que la permission a été accordée dans MenuScene
- ✅ Testez sur un vrai appareil iOS (pas de gyro sur simulateur)

### Le jeu est trop rapide/lent

- Ajustez `PLAYER_MAX_SPEED` et `PLAYER_ACCELERATION`
- Ajustez `GYRO_SENSITIVITY` pour mobile

### Les collisions ne fonctionnent pas

- Vérifiez que les objets ont un body physique : `this.physics.add.existing()`
- Vérifiez les colliders/overlaps dans GameScene

### Le build échoue

```bash
# Nettoyer et réinstaller
rm -rf node_modules dist
npm install
npm run build
```

## 📚 Ressources

### Documentation
- [Phaser 3](https://photonstorm.github.io/phaser3-docs/)
- [DeviceOrientation API](https://developer.mozilla.org/en-US/docs/Web/API/DeviceOrientationEvent)
- [PWA Guide](https://web.dev/progressive-web-apps/)

### Assets Gratuits
- [OpenGameArt.org](https://opengameart.org/)
- [Kenney.nl](https://kenney.nl/assets)
- [Itch.io Assets](https://itch.io/game-assets/free)

### Outils
- [Piskel](https://www.piskelapp.com/) - Sprites
- [Tiled](https://www.mapeditor.org/) - Niveaux
- [GIMP](https://www.gimp.org/) - Édition images

## 🚀 Prochaines Étapes Recommandées

1. **Créer les sprites du personnage** (voir SPRITE_WORKFLOW.md)
2. **Ajouter du son** (musique + effets)
3. **Créer plus de niveaux** avec Tiled
4. **Tester sur mobile réel** via tunnel HTTPS
5. **Déployer** (Netlify, Vercel, GitHub Pages)

## 📝 Notes

- Le jeu détecte automatiquement PC vs Mobile
- Les deux modes de contrôle peuvent coexister
- Le code est prêt pour l'ajout de vrais sprites
- La structure est extensible pour ajouter plus de features
