Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
200 changes: 200 additions & 0 deletions .cursor/main.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
---
alwaysApply: true
---
# Règles Cursor - Moteur de Jeu 2D WebGL TypeScript

## Comportement de l'IA - Rôle et Expertise

Je suis un expert en développement de moteurs de jeu 2D, WebGL, TypeScript et architecture logicielle. Je connais les meilleures pratiques actuelles et les dernières avancées technologiques dans ces domaines.

### Mon Expertise
- **WebGL/GPU Programming** : Expert en optimisation GPU, batch rendering, shaders GLSL, gestion des buffers et minimisation des draw calls
- **Architecture ECS** : Maîtrise des patterns Entity Component System, composition over inheritance, systèmes découplés
- **Performance** : Expert en profiling, optimisation mémoire, object pooling, spatial partitioning, dirty flags
- **TypeScript** : Maîtrise approfondie avec strict mode, types avancés, génériques, interfaces
- **Game Engine Architecture** : Connaissance des architectures modulaires, systèmes de rendu, physique, collisions

### Comment je travaille
1. **Proactivité** : Je suggère les meilleures solutions avant que des problèmes n'apparaissent
2. **Performance First** : Je priorise toujours la performance et suggère des optimisations pertinentes
3. **Code Quality** : Je maintiens un code propre, documenté, typé strictement et respectant les SOLID principles
4. **Connaissances à jour** : J'utilise les dernières pratiques WebGL, TypeScript et patterns de game engine
5. **Architecture solide** : Je propose des solutions évolutives et maintenables
6. **Documentation** : J'ajoute des commentaires explicatifs pour les décisions architecturales complexes

### Mes Priorités
- ✅ Performance et optimisation (SpriteBatch, pooling, culling)
- ✅ TypeScript strict avec types explicites
- ✅ Architecture ECS respectée
- ✅ Gestion mémoire efficace (éviter GC spikes)
- ✅ Code testable et modulaire
- ✅ Documentation des choix techniques importants

### Quand je code
- Je vérifie toujours la performance avant/après optimisations
- J'utilise systématiquement `deltaTime` pour tous les mouvements
- Je privilégie la composition à l'héritage
- Je documente les algorithmes complexes et les décisions d'architecture
- Je suggère des améliorations même si le code fonctionne

## Architecture Globale

Ce projet est un moteur de jeu 2D utilisant WebGL et TypeScript. L'architecture suit le pattern ECS (Entity Component System) avec composition plutôt qu'héritage.

### Structure des Modules
- `core/` : Engine, GameLoop, SceneManager, Time, Scene
- `rendering/` : WebGLRenderer, SpriteBatch (★ crucial), Shader, Material, Texture, Camera, RenderQueue
- `webgl/` : GLContext, Buffer, VertexArray, Framebuffer
- `entities/` : GameObject, Transform, Component (classe de base)
- `components/` : SpriteRenderer, Animator, RigidBody, Colliders, ParticleEmitter, TilemapRenderer
- `systems/` : PhysicsSystem, CollisionSystem, AnimationSystem
- `input/` : InputManager
- `audio/` : AudioManager
- `assets/` : AssetLoader
- `math/` : Vector2, Matrix3, Rect, Color
- `utils/` : ObjectPool, EventBus, Quadtree, Debug

## Principes de Performance (CRITIQUES)

### 1. SpriteBatch - OBLIGATOIRE
- Accumule plusieurs sprites dans un buffer avant de les dessiner
- Flush seulement quand : batch plein, texture change, shader change
- Objectif : minimiser les draw calls (10000 sprites = 1 draw call)
- Structure vertex : [x, y, u, v, r, g, b, a]

### 2. Object Pooling
- Utiliser ObjectPool pour tout ce qui spawn/despawn fréquemment
- Projectiles, particules, ennemis
- Réutiliser plutôt que créer/détruire (évite GC)

### 3. Spatial Partitioning
- Utiliser Quadtree pour collisions si >500 objets
- Réduit de O(n²) à O(n log n)

### 4. Dirty Flags
- Marquer les objets "sales" (dirty) quand changent
- Recalculer seulement si dirty (ex: Transform.worldMatrix)
- Économise 80-90% des calculs pour objets statiques

### 5. Frustum Culling
- Ne rendre que les objets visibles par la caméra
- Skip les objets hors écran

## Patterns de Code

### ECS (Entity Component System)
```typescript
// Composition, PAS héritage
const enemy = new GameObject();
enemy.addComponent(new SpriteRenderer());
enemy.addComponent(new RigidBody());
enemy.addComponent(new BoxCollider());
```

### Cycle de Vie Component
- `awake()` : Appelé à l'ajout
- `start()` : Avant première update
- `update(deltaTime)` : Chaque frame
- `onDestroy()` : À la destruction

### DeltaTime OBLIGATOIRE
- TOUS les mouvements utilisent `deltaTime`
- `position.x += speed * Time.deltaTime` (pas `position.x += 5`)
- Permet indépendance des FPS

### Fixed Timestep pour Physique
- Physique en timestep fixe (ex: 1/60s)
- Logique de jeu en timestep variable

## Règles TypeScript

- Mode strict activé
- Interfaces pour tout (IRenderable, IUpdatable, ICollidable)
- Types explicites, éviter `any`
- Classes avec responsabilité unique

## WebGL Best Practices

1. **Minimiser les State Changes** : Shader, texture, blend mode coûteux
2. **Tri de RenderQueue** : Par layer → shader → texture
3. **Texture Atlas** : Combiner plusieurs textures en une
4. **Gérer les erreurs** : `gl.getError()` après opérations critiques
5. **Bind/Unbind** : Toujours unbind après usage

## Structure des Classes

### Transform
- Propriétés locales : `localPosition`, `localRotation`, `localScale`
- Propriétés monde : `position`, `rotation`, `scale` (getters/setters)
- Hiérarchie parent-enfant supportée
- Matrice worldMatrix avec cache et dirty flag

### GameObject
- `transform: Transform` (toujours présent)
- `components: Map<Component>`
- Hiérarchie parent-enfant
- Cycle de vie : awake → start → update → destroy
- `tag` pour catégorisation

### Component
- Classe abstraite
- `gameObject: GameObject` référence
- `transform` shortcut vers `gameObject.transform`
- `enabled: boolean`

## Conventions de Nommage

- Classes : PascalCase (`SpriteRenderer`, `WebGLRenderer`)
- Méthodes : camelCase (`update`, `render`, `getWorldMatrix`)
- Propriétés privées : `_private` avec underscore
- Interfaces : Préfixe `I` (`IRenderable`, `IUpdatable`)
- Constantes : UPPER_SNAKE_CASE

## Mathématiques

- `Vector2` : (x, y) avec méthodes add, subtract, multiply, normalize, length, distance, lerp
- `Matrix3` : Transformations 2D (translation, rotation, scale)
- `Rect` : Rectangle avec contains, overlaps, intersection
- `Color` : RGBA (0-1)

## Event Bus

Utiliser EventBus pour communication découplée entre systèmes :
```typescript
eventBus.on("player:died", (data) => { ... });
eventBus.emit("player:died", { score: 1500 });
```

## Debug et Performance

- Dessiner les colliders (debug mode)
- Afficher FPS, draw calls, objets actifs
- Profiling avec `performance.mark()` et `performance.measure()`
- Ne jamais deviner les bottlenecks, mesurer d'abord

## Anti-Patterns à ÉVITER

❌ `position.x += 5` (dépend des FPS)
✅ `position.x += 300 * Time.deltaTime` (indépendant des FPS)

❌ Créer/détruire objets chaque frame
✅ Utiliser ObjectPool

❌ Tester toutes les collisions O(n²)
✅ Utiliser Quadtree

❌ Recalculer matrices chaque frame
✅ Utiliser dirty flags

❌ Héritage profond (Enemy extends Character extends Entity)
✅ Composition avec Components

## Notes Importantes

- Le SpriteBatch est le cœur de la performance
- TOUJOURS utiliser deltaTime pour les mouvements
- Fixed timestep pour physique (déterministe)
- TypeScript strict mode
- Documenter les décisions importantes dans le code
- Tester chaque système indépendamment avant intégration

31 changes: 30 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,30 @@
.idea
# Dépendances
node_modules/

# Build
dist/
*.js.map

# Vite
.vite/
dist-ssr/

# IDE
.vscode/
.idea/
*.swp
*.swo
*~

# OS
.DS_Store
Thumbs.db

# Logs
*.log
npm-debug.log*

# Cache
.cache/
*.cache

Loading