Wing Commander × Vampire Survivors. Pilotas un caza en primera (o tercera) persona sobre la superficie de planetas épicos, mientras enjambres interminables de enemigos te acosan. Tus armas disparan solas: tú vuelas, esquivas, recoges experiencia y evolucionas.
Hecho con Three.js. El código fuente se puede servir tal cual; el dist/ es un paquete estático para jugar sin servidor.
- Planeta esférico inmenso y circunnavegable. El mundo es una esfera enorme (estilo Star Fox):
parece casi infinito, pero si vuelas lo suficiente regresas al punto de partida. La superficie
tiene relieve y estructuras fijas (espirales de plasma, torres, faros nombrados) que dan
sensación de velocidad y sirven de referencia. Eliges entre cuatro mundos épicos:
- HELIOS PRIME — una estrella enana de plasma (gravedad intensa, enemigos feroces).
- VEGA AZUL — una gigante azul de plasma frío (gravedad extrema, enjambre implacable).
- GIGANTE JOVIANO — un gigante gaseoso de bandas y tormentas (gravedad moderada).
- ABISMO TURQUESA — un gigante helado de bandas turquesa (gravedad suave).
- Mapa planetario con niebla de guerra. Un minimapa (abajo, centro) muestra lo que has explorado; el resto permanece oculto hasta que lo sobrevuelas (estilo Vampire Survivors). Pulsa M para el mapa a pantalla completa. Los faros se marcan al descubrirlos.
- Gravedad planetaria que te atrae hacia la superficie, con techo de altitud que te impide huir al espacio profundo (si te alejas, la gravedad te reclama de vuelta).
- Tres cámaras + zoom. C cicla entre cenital pura (top-down: la nave avanza sola, A/D la desplazan lateral — ideal para el enjambre), 3ª persona cinematográfica (seguimiento suave) y 1ª persona desde la cabina. La rueda del ratón aleja/acerca la cámara en las vistas cenital y 3ª. Muchísima distancia de dibujado con horizonte curvo, atmósfera en el limbo y buffer de profundidad logarítmico.
- Modo supervivencia — enjambres continuos que escalan con el tiempo.
- 6 armas automáticas visualmente distintas (con destellos de disparo):
- 🔫 Cañones Frontales · 🛰️ Torretas Auto 360° · 🪐 Orbes Orbitales
- 🚀 Misiles Enjambre · ⚡ Rayo de Plasma (haz continuo) · 💥 Nova de Choque (onda en área)
- Experiencia y niveles. Los enemigos sueltan gemas de XP (y, raramente, reparación). Al subir de nivel eliges una mejora: subir/desbloquear un arma, blindaje, imán o velocidad.
El dist/ es un paquete estático. Three.js, el juego y los assets van dentro de esos archivos: el navegador lo ejecuta todo en cliente. No hace falta Node, Python ni ningún servidor.
- Windows: doble clic en
jugar.bat, o abredist/index.html. - Para llevarte el juego: copia la carpeta
dist/entera (index.html+game.js+pack.jsjuntos).
Las fuentes de Google se piden online si hay conexión; si no, el juego usa las del sistema.
Para desarrollar (editar game.js / index.html de la raíz) sí hace falta un servidor local, porque el navegador bloquea módulos ES en file://. Doble clic en jugar-dev.bat, o:
python -m http.server 8000
y abre http://localhost:8000
El origen del juego es index.html + game.js + assets/. Eso no se puede abrir con doble clic: Chrome bloquea import de módulos locales y el fetch de los .glb. El build fabrica un paquete que sí funciona en file://.
npm run build ejecuta tools/build-dist.mjs:
- Empaqueta los assets (
assets/models/*.glbyassets/fx/*.png) comodata:URIs endist/pack.js. El juego los lee deglobalThis.__STARWING_PACK(si no hay pack, sigue usando las rutas de archivo, que es el modo desarrollo). - Empaqueta el JavaScript con esbuild: junta
game.js+ Three.js 0.160.0 + addons (GLTFLoader, bloom, etc.) en un solo IIFEdist/game.js. Ya no hayimportmapni CDN. - Escribe
dist/index.html: copia el HTML de la raíz y sustituye los<script type="module">por:
<script src="pack.js"></script>
<script src="game.js"></script>Resultado:
| Archivo | Qué es |
|---|---|
dist/index.html |
UI / CSS / markup |
dist/game.js |
Three.js + lógica del juego (~0.6 MB) |
dist/pack.js |
naves y FX embebidos (~11 MB) |
- Node.js 18+ (lleva
npm)
En la raíz del repo:
npm install
npm run build
npm installbaja solo herramientas de build (esbuild,three). Quedan ennode_modules/(ignorado por git).npm run buildregeneradist/entero. Tarda unos segundos.
Vuelve a hacerlo cada vez que cambies game.js, index.html o un archivo de assets/. Luego abre dist/index.html (o jugar.bat) para comprobarlo.
No hace falta dejar Node instalado en la máquina que juega: con copiar dist/ basta.
| Entrada | Acción |
|---|---|
| Ratón | Pilotar (joystick virtual, vistas 1ª/3ª persona) |
| W / S | Acelerador (1ª/3ª persona) |
| A / D | Alabeo (1ª/3ª persona) |
| A / D o ← / → | En vista cenital: desplazamiento lateral (la nave avanza sola, siempre hacia arriba de pantalla) |
| Shift | Postcombustión |
| C | Cambiar cámara: cenital iso / 3ª / 1ª persona |
| Rueda ratón | Zoom de cámara (vistas iso y 3ª) |
| M | Mapa planetario (pantalla completa) |
| Espacio | Disparo frontal extra (las armas ya disparan solas) |
| T | Marcar objetivo (informativo) |
| P / Esc | Pausa |
- El mundo es esférico: vuela recto y darás la vuelta al planeta hasta el punto de partida.
- Los escudos se regeneran; el casco no (salvo cápsulas de reparación).
- La gravedad tira de ti hacia el planeta. Vuela con el morro ligeramente arriba para no caer.
- No huyas al espacio profundo: pasado el techo de altitud, la gravedad te arrastra de vuelta.
- Explora para descubrir el mapa y los faros; sube de nivel con las gemas de XP y elige mejoras.
- La dificultad aumenta con el tiempo; aparecen unidades élite más resistentes.
smoke test de humo en Node (sin navegador) que carga el módulo del juego con stubs de
Three.js y del DOM, y ejercita el ciclo completo (menú → despliegue → bucle de juego →
subida de nivel → mejoras → cambio de cámara → ambos planetas) verificando que no lanza
excepciones. Los archivos de prueba viven en el directorio temporal de la sesión.