Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Explorando varias herramientas para desarrollar un juego con IA
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Minijuego retro en estilo pixel art 16 bits inspirado en la Cucaña de Triana, la tradicional prueba de equilibrio de la Velá de Santa Ana en Sevilla. La tradición de la Cucaña en Triana Cada mes de julio, el barrio de Triana en Sevilla celebra la Velá de Santa Ana, una de las fiestas populares más antiguas y queridas de la ciudad. Entre farolillos, casetas, música y el olor a pescaíto frito, el río Guadalquivir se convierte en escenario de una de las pruebas más divertidas y esperadas: la Cucaña.檢視完整 README ↗
Minijuego retro en estilo pixel art 16 bits inspirado en la Cucaña de Triana, la tradicional prueba de equilibrio de la Velá de Santa Ana en Sevilla.
Cada mes de julio, el barrio de Triana en Sevilla celebra la Velá de Santa Ana, una de las fiestas populares más antiguas y queridas de la ciudad. Entre farolillos, casetas, música y el olor a pescaíto frito, el río Guadalquivir se convierte en escenario de una de las pruebas más divertidas y esperadas: la Cucaña.
La Cucaña consiste en un largo palo de madera colocado en horizontal sobre el río, engrasado con sebo o jabón, que parte desde una barcaza. Los participantes deben recorrerlo manteniendo el equilibrio hasta alcanzar una bandera clavada en el extremo. Lo que parece sencillo se convierte en un desafío casi imposible: el palo resbala, se balancea con cada paso y la caída al Guadalquivir está asegurada para la mayoría.
Es una tradición que lleva generaciones formando parte del verano trianero, donde niños y mayores se lanzan a intentarlo entre los aplausos y las risas del público que observa desde la orilla y el puente. Más que una competición, es un espectáculo que representa el espíritu festivo, valiente y desenfadado de Triana.
La Cucaña Trianera traslada esta tradición a la pantalla. El jugador debe avanzar por el palo engrasado sobre el Guadalquivir, manteniendo el equilibrio hasta alcanzar la bandera en el extremo. Sencillo de entender, difícil de conseguir.
Cada personaje tiene estadísticas que afectan a la partida:
| Stat | Efecto |
|---|---|
| Peso | Afecta a la física del palo. Más peso = más inercia, pero también más estabilidad en condiciones normales |
| Equilibrio | Determina el margen antes de caer. Más equilibrio = más tiempo de reacción |
| Altura | Centro de gravedad más alto (más difícil de equilibrar), pero brazos más largos para alcanzar la bandera |
| Edad | Afecta a la velocidad de movimiento y la resistencia |
Personaje inicial: "El Trianero" - Stats medios en todo. El personaje equilibrado para aprender las mecánicas.
El jugador elige la perspectiva de la partida en la pantalla Elige tu vista:
| Tecnología | Uso |
|---|---|
| Phaser 3 | Motor del juego (v3.90) |
| three.js | Renderizado de la vista 3D en primera persona (v0.185) |
| Vite | Bundler y servidor de desarrollo (v6.3) |
| JavaScript (ES2022) | Lenguaje base — módulos ES, sin transpilación adicional |
| Capacitor (iOS + Android) | Empaquetado nativo del juego para App Store y Google Play (v8) |
| Plugins Capacitor | @capacitor/share, @capacitor/preferences, @capacitor/haptics, @capacitor/browser |
| GitHub Actions | CI/CD — workflow ios-release.yml compila y sube a App Store Connect al pushear un tag v*.*.* |
| Vercel | Despliegue web con auto-deploy desde main |
| Sentry | Monitorización y captura de errores en producción (breadcrumbs de navegación entre escenas) |
| Vitest | Tests unitarios |
| Prettier + ESLint | Formato y linting (validados en CI en cada PR) |
| LibreSprite / Aseprite | Sprites y pixel art dibujados a mano |
| BeepBox / jsfxr | Música y efectos de sonido, hechos a mano |
| ChatGPT / Gemini | Generación de imágenes de fondos y premios con prompts JSON compartidos por coherencia visual |
| Claude Code | Copiloto de desarrollo (código, arquitectura, refactor, debugging, docs) |
| Comando | Descripción |
|---|---|
npm install | Instalar dependencias |
npm run dev | Servidor de desarrollo en http://localhost:8080 |
npm run build | Build de producción en carpeta dist |
├── index.html # HTML principal
├── package.json
├── capacitor.config.json # Configuración Capacitor (appId, appName, webDir)
├── public/
│ ├── assets/ # Sprites, audio, fondos, rewards, personajes
│ ├── favicon.png
│ └── style.css # Estilos globales del contenedor
├── src/
│ ├── main.js # Bootstrap web + init NativeStorageBridge
│ └── game/
│ ├── main.js # Configuración y arranque de Phaser
│ ├── config/ # Constantes y configuración del juego
│ ├── scenes/ # Escenas de Phaser (capa de presentación)
│ ├── entities/ # Modelo del dominio (lógica pura sin Phaser)
│ ├── systems/ # Sistemas de juego (equilibrio, impulso, física)
│ ├── components/ # Componentes UI reutilizables
│ ├── services/ # Servicios (persistencia nativa, etc.)
│ └── utils/ # Utilidades puras (share, math, haptics…)
├── android/ # Proyecto nativo Android (Capacitor)
├── ios/ # Proyecto nativo iOS (Capacitor)
├── docs/ # Documentación técnica de release e IP
├── vite/ # Configuración de Vite (dev, prod)
├── .github/
│ └── workflows/ # CI/CD (ci.yml, ios-release.yml)
├── CHANGELOG.md # Historial de versiones (Keep a Changelog)
├── GDD.md # Game Design Document
├── CREDITS.md # Créditos y agradecimientos
├── PRIVACY.md # Política de privacidad publicada
├── LICENSE # Licencia
└── CLAUDE.md # Directrices para el copiloto IA
Sigue los principios de Clean Architecture: las escenas son orquestadoras (sin lógica de negocio), las entidades y sistemas contienen la lógica pura del juego, y los componentes UI son reutilizables. Detalle completo en el CLAUDE.md.
ios-release.yml que compila con Xcode 26 y sube a App Store Connect al pushear un tag v*.*.*unhandledrejection, con breadcrumbs de navegación entre escenas para reproducir el camino que llevó al fallo@capacitor/filesystem para escribir el blob en disco antes de invocar el share nativo)android-release.yml para automatizar el AAB (pendiente hasta que Google Play desbloquee la cuenta developer)Este juego es mi Trabajo Fin de Máster del Máster de Desarrollo con IA de MoureDev / BIG School, pero para mí es mucho más que eso.
Soy trianero de adopción y de corazón. Cuando empecé a explorar el desarrollo con IA me di cuenta de que podía atreverme con cosas que antes no. Quería hacer un minijuego pixel art propio, pero no me salían ideas que no estuvieran ya cogidas. En algún momento caí en una de las tradiciones más antiguas y curiosas de Triana: la cucaña de la Velá de Santa Ana. De niño mis padres me llevaban a verla, y siempre me quedó el ambiente, el bullicio del río y el momento en que alguien conseguía coger la bandera al final del palo engrasado.
Empezó como algo mínimo — mantener el equilibrio, no caerse — y fue creciendo: personajes de Sevilla, premios muy sevillanos, un mapa por trozos, la vista 3D final… hasta convertirse en un pequeño homenaje a la tradición.
Este juego no es solo un TFM: es una criatura hecha 100% a mano en el tiempo que me dejaba mi trabajo. Las fotos son mías, hechas con mi cámara y pixeladas después. Los skins de los personajes están dibujados píxel a píxel. Ha sido una inversión enorme de horas y de ilusión.
Más allá del componente sentimental, ha sido un ejercicio real de aplicar los conocimientos del máster a un proyecto vivo:
.gitignore bien pensado.Además del plazo del máster, me impuse una fecha propia: publicar la app en App Store y Google Play antes de la Velá de Santa Ana (cuando se celebra esta tradición en Triana, en julio). Trabajar con una fecha real, con las consecuencias reales de no cumplirla, es una lección que en el aula no se enseña del todo. Este palo me lo he trabajado por mi cuenta y ha sido tan didáctico como el resto.
Publicar en producción es la fase más ignorada por los cursos y una de las más reales del oficio. Este proyecto me ha metido de lleno en:
Y bloqueantes que me han obligado a ser resolutivo:
LANG=en_US.UTF-8 al rescate.compileSdk 36 y AGP 8.9.1 con conflicto de duplicate classes en Kotlin stdlib.docs/ip-content-audit.md), decisión de autor con plan de sustitución si aparece reclamación.Además de por el TFM, quería que la app existiera de verdad. Dos motivos:
He usado varias herramientas distintas para construir cada tipo de contenido del juego, no una sola IA para todo. La intención era que cada pieza saliera de la herramienta más adecuada, no del atajo más rápido:
Que el proyecto se apoye en más de una IA (y en herramientas artesanales) no es casualidad: forma parte de aprender para qué sirve cada una y no encajar todo a martillazos con la que ya conoces.
Este proyecto está construido con Claude Code como copiloto, pero con yo siempre al volante. La regla ha sido clara: antes de dejarle escribir código, entender el porqué. Preguntaba una y otra vez, y me lo explicaba con paciencia hasta que lo entendía.
Donde más me ha ayudado:
Hemos discrepado a veces — soluciones que yo veía de otra manera y prevalecía la mía. La IA nunca ha sido el autor del proyecto: ha sido un colaborador senior con quien discutía diseño y aparcaba dudas. Es la única forma sana de usarla, para mí: para amplificar lo que sé, no para tapar lo que no.
Si tuviera que dar un consejo a alguien que empieza con estas herramientas, sería uno solo: no dejes que escriba nada que no puedas explicar tú a un colega. Ese filtro te obliga a aprender y protege tu proyecto de decisiones que no entiendes.
docs/ (release iOS, workflow Android, contenido/IP, App Store checklist)CHANGELOG.md