0fd93600293d77c77fe6d1de760048e7314ecdbb
Crea los componentes base del nuevo motor de fisica sin alterar todavia el comportamiento del juego. La migracion de Ship/Enemy/ Bullet al nuevo sistema queda para Fase 6. Nuevos archivos: - core/physics/rigid_body.hpp - struct POD con: * Vec2 position, velocity (cartesianas, NO polares) * float angle, angular_velocity * mass, inverse_mass (cacheado; 0 = estatico) * restitution (elasticidad 0..1) * linear_damping, angular_damping (s-1, exponencial) * radius (circulo de colision) * applyForce / applyImpulse / clearAccumulators * setStatic() para paredes/obstaculos - core/physics/physics_world.hpp/.cpp - mundo fisico: * Almacena RigidBody* (no-owning, ownership en entidades) * setBounds(SDL_FRect) para paredes implicitas (PLAYAREA) * update(dt) = integrate + resolveBoundsCollisions + resolveBodyCollisions * Integrador semi-implicito de Euler + damping exponencial * Resolucion circulo-circulo con correccion posicional e impulsos elasticos * Formula del impulso: j = -(1+e)*(v_rel . n) / (1/m_a + 1/m_b) * Broadphase trivial O(n^2): suficiente para ~25 cuerpos del juego Decisiones de diseno: - Velocidad en cartesianas (Vec2) en lugar de la representacion polar actual (escalar velocidad + cos/sin del angulo cada frame). Adios al acoplamiento entre orientacion y direccion de movimiento. - Composicion sobre herencia: RigidBody es un struct independiente que las entidades incrustaran como member en Fase 6, no una clase base. - El integrador semi-implicito es la version estandar para juegos arcade (mas estable que Euler explicito sin coste extra). - Damping exponencial (exp(-damping*dt)) en lugar de lineal: mantiene el feeling consistente independientemente del framerate. - Sin gravedad: el juego es top-down, no necesita campo de fuerzas global. Las entidades aplican sus propias fuerzas (thrust). Pendiente Fase 6: - Anadir RigidBody body_ a Entity (member, no pointer) - Migrar Ship: thrust como applyForce, en lugar de velocity_ escalar - Migrar Enemy: cambios de direccion via applyImpulse, rebotes los hace PhysicsWorld - Migrar Bullet: lineal sin damping, restitution=0 (no rebotan) - Anadir PhysicsWorld a GameScene, registrar bodies, llamar update() Compila y enlaza. Smoke test xvfb OK: el juego arranca igual que antes (la nueva infraestructura aun no se invoca). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Orni Attack
Destrueix als cosinus mesisinus que ens ataquen montats en ORNIs!
Controls
El joc permet l'ús del teclat per a controlar la nau i la finestra. Les tecles són les següents:
| Tecla | Acció |
|---|---|
| ↑ | Accelerar la nau |
| ↓ | Frenar |
| ← | Rotar a l'esquerra |
| → | Rotar a la dreta |
| Espai | Disparar |
| ESC | Eixir del joc |
| F1 | Disminuir la mida de la finestra |
| F2 | Augmentar la mida de la finestra |
| F3 | Alternar pantalla completa |
Compilació i execució
Compilar el joc
make # Compilar
make debug # Compilació en mode debug
make clean # Netejar fitxers compilats
./orni # Executar
Crear versions release
make macos_release # macOS .app bundle + .dmg (Apple Silicon)
make linux_release # Linux .tar.gz
make windows_release # Windows .zip (requereix MinGW a Windows)
make windows_cross # Cross-compilació Windows des de Linux/macOS
make rpi_release # Raspberry Pi ARM64 cross-compilació
Requisits
- C++20 compatible compiler
- SDL3 library
- CMake 3.15 o superior
Plataformes suportades
- macOS (Apple Silicon i Intel)
- Linux (x86_64)
- Windows (MinGW)
- Raspberry Pi (ARM64)
Història
Joc original creat en Turbo Pascal 7 per a DOS (1999), ara migrat a C++20 amb SDL3. Aquest port modern preserva la jugabilitat i l'estètica de l'original mentre aprofita les capacitats dels sistemes actuals.
Versió actual: BETA 3.0
