Hacia tiempo que me apetecía hacer algo así, me empezaba a picar el gusanillo de crear un juego de carreras de coches en 2.5D y, de paso, experimentar con el uso de IA para programar.
De hecho lo veía como una forma de experimentar y aprender a hacer ese uso de lasa nuevas IAs con las que ya había hecho alguna prueba, pero no algo en forma de "proyecto". También quiero aclarar como estoy (y cómo me apetecía) usar este tipo de asistentes. Tal vez hayas visto alguno de esos vídeos en los que se dice que alguien que no sabe programar ha hecho un juego a base de unos cuantos prompts, simplemente diciendo lo que quiere. No se trata de eso. Se trataba de tener una especie de ayudante y de no perder el controlo del código. Hablando claro, no es un juego programado por una IA, es un juego programado contando con la ayuda una IA. Pero no voy a entrar mucho más en este tema de momento, tal vez dedique un rato a escribir otro artículo con detalles sobre eso más adelante.
El objetivo, además, era hacer funcionar esto en mi Amiga 1200, eso sí, haciendo uso de una PiStorm con una Raspberry Pi 3 que hace el papel de CPU 68k, dándole a esta vieja máquina una potencia mucho mayor que la original y gráficos RTG.
Pero sobre todo la idea era divertirme. Por eso tampoco iba a usar lenguajes o herramientas de desarrollo puramente de Amiga ni iba a bajar a pegarme con sus Custom Chips. Lo haría en SDL1.2, usando una máquina Linux con la que poder ejecutarlo de forma nativa o hacer compilación cruzada a 68k y lanzarlo en un emulador o en la máquina real.
Parte de la diversión, como he dicho, era hacer uso de un plugin de IA en el IDE para hacer el código, pero sobre todo tendría que venir de no complicarme la vida. No iba a complicarme con temas de rendimiento dado que la PiStorm iría sobrada moviendo el programa hecho en SDL...
¡Tonterías! En cuanto empecé a introducir algún objeto en el escenario el rendimiento empezó a caer y me vi implementando cosas como "dirty rectangles" y dándole vueltas al código para ver que otros trucos podría usar. Por cierto que la recomendación de usar "dirty rectangles" vino también de una IA, pero eso es otra historia. En resumen, pensé que SDL le resultaría menos pesado a una PiStorm y me equivoqué.
El resultado es lo que podéis ver en el vídeo. Se trata de una prueba técnica en la que solo puedes manejar el coche a lo largo de un circuito (ficticio). No hay detección de colisiones, pero el motor gráfico 2.5D está suficientemente avanzado. Tampoco hay rivales (NPCs) y por tanto no existe aún la lógica que los haga moverse por pantalla. En cuanto al rendimiento, en una máquina Linux va como un tiro, y en la PiStorm, como se puede ver en el vídeo, a 800x600 los FPS superan por poco los 30.
Inspiración
Por supuesto se trata de un juego de carreras en 2.5D al estilo de Out Run pero tal vez más próximo a otros títulos como Nigel Mansell o Vroom, porque intenta aproximarse a un estilo de simulación, con un motor que responde a las características de un coche real y cuenta con cambio de marchas, etc. Ahora bien, hay una característica que creo que lo hace diferente de la gran mayoría de juegos existentes: no va a tener obstáculos con los que colisionar al borde de la carretera. La experiencia de conducción debe ser divertida y relativamente fácil. La dificultad vendrá dada por los tiempos que se necesite hacer o por los rivales que hayan en la carretera. Salirse de la pista tendrá sus consecuencias, claro, pero normalmente será una simple pérdida de velocidad.
Motivación
A parte de lo que he comentado sobre divertirme, me gustaría que esto sirviera como ejemplo para demostrar que es posible hacer cosas específicas y nuevas para la PiStorm. Si no, ¿para que la usamos? Digo esto desde el respeto para el que lanza algo para la máquina original (ECS, AGA) o para el que hace un port de algo existente (ya sea algo para Amiga clásico o que ponga a prueba la potencia de esta aceleradora). Es decir, la intención era crear algo nuevo (y espero que atractivo), que pusiese al límite la capacidad de la PiStorm.
¿Se convertirá esto en un juego?
Depende. Principalmente para ello debería moverse fluidamente en una resolución razonable para un Amiga. Para mi eso significa mantener esos 30FPS en una resolución de 640x480 y todavía queda por implementar la lógica de los rivales, pintarlos en pantalla y meter detección de colisiones.
Requisitos
Amiga
- PiStorm con RPI3
- Graficos RTG
- Bastante memoria RAM. De momento consume unos 250MB y es solo un prototipo.
Linux
- Funciona bien en un portátil Dell con más de 10 años, superando ampliamente los 60FPS (ni si quiera he calculado los FPS a los que llega)
Características
Motor gráfico 2.5D
Todo el trabajo inicial está basado en el Tutorial de Jake Gordon y también en lo que viene recogido por el artículo Lou's pseudo 3D page
Renderizado de la carretera
- Implementa un sistema de segmentos para representar la carretera en perspectiva, donde cada segmento tiene puntos de inicio y fin con coordenadas 3D que se proyectan a 2D.
- Utiliza la técnica de proyección de perspectiva para crear la ilusión de profundidad.
- La carretera se dibuja segmento a segmento desde el más lejano al más cercano, creando el efecto de profundidad.
- Sistema de parallax que implementa fondos que se desplazan independientemente para crear sensación de movimiento:
- Utiliza la técnica de "dirty rectangles" para optimizar el renderizado, actualizando solo las áreas de la pantalla que han cambiado.
- Implementa un sistema de oclusión para evitar renderizar sprites que están ocultos por otros elementos.
- La versión de Amiga sustituye la textura (el fondo) del cielo por un "copper sky" para ahorar tiempo de CPU.
Física y control del vehículo
- Implementa un modelo físico realista con variables como:
- Aceleración, frenado, velocidad máxima
- Fuerzas centrífugas en curvas
- Efectos de terreno (dentro/fuera de pista)
- Cambio manual y automático
- Cálculo de RPM del motor basado en velocidad y marcha actual
- Efectos de sonido para cambios de marcha
Carga de circuitos desde JSON
- Los circuitos se definen en archivos JSON (sierra.json).
- Segmentos de carretera con curvas y elevaciones
- Objetos y decoraciones a lo largo del circuito
Sistema de sprites
- Implementa un sistema de caché para sprites escalados, mejorando el rendimiento.
- Los sprites se escalan según la distancia para crear efecto de profundidad.
- Soporta sprites compuestos para objetos complejos.
- Utiliza un registro de sprites para evitar cargar texturas duplicadas.
Configuración y otras opciones disponibles
- El juego carga configuraciones desde archivos externos para ajustar:
- Resolución de pantalla
- Pantalla completa / ventana del SO
- Distancia de dibujado
- Implementa controles tanto para teclado como para joystick.