Racing Game 3D

# Juego de carreras en 3D - Juego de carreras en 3D basado en velas japonesas 🎮🏎️

`Racing_Game_3D` es un innovador script de juego de carreras en 3D que se ejecuta dentro de la plataforma MetaTrader 5 (MT5). Desarrollado por **Musa Ziyad** en 2025, entre las características principales del juego destacan **la generación de circuitos 3D con muchas curvas a partir de los datos de velas japonesas en tiempo real (OHLC) del gráfico actual**, el renderizado con API 3D nativas de DirectX, la implementación de cajas de objetos interactivas y la posibilidad de competir cara a cara contra 5 oponentes controlados por la CPU.

---

## 🌟 Conceptos y características clave

1. **Circuito sinuoso en 3D basado en velas japonesas**
* El script consulta las velas históricas del símbolo activo (omitiendo la barra más reciente que no se ha completado).
* El tamaño del cuerpo de cada vela (Cierre - Apertura) determina el desplazamiento de la curva lateral de ese segmento de la pista. **Cuanto más volátil es el mercado, más sinuosa y desafiante se vuelve la pista de carreras**.
* Un cálculo de centrado integrado crea curvas dinámicas al estilo slalom, al tiempo que evita que la pista se desvíe infinitamente.

2. **Motor de renderizado nativo de DirectX**
* Funciona a través de la interfaz interna `DXContext` de MetaTrader 5 , combinada con un sombreador de vértices personalizado (`Shaders/vertex.hlsl`) y un sombreador de píxeles (`Shaders/pixel.hlsl`) para la proyección 3D acelerada por GPU.
* Alimenta el sombreador de píxeles con una estructura`PSInputBuffer`, que transmite la resolución, el tiempo, las coordenadas del jugador, las coordenadas de los 5 competidores controlados por IA, las matrices de curvatura de la pista local, las cajas de objetos activos y los proyectiles en vuelo.

3. **Potenciadores y sistema de combate**
* Las cajas de objetos se distribuyen cada 30 metros a lo largo de la carretera y contienen tres habilidades distintas:
* 🟦 **Caja azul (impulso de velocidad)**: Otorga aceleración nitro, aumentando significativamente la velocidad máxima durante 3,0 segundos.
* 🟥 **Caja roja (trampa)**: activa una trampa de derrape que reduce la velocidad del coche a 2 km/h y desactiva la dirección durante 1,5 segundos.
* 🟨 **Caja amarilla (Disparo de llamas)**: Otorga una bola de fuego. Pulsa **[SHIFT]** para dispararla hacia delante.
* Las bolas de fuego siguen las curvas de la pista. Al chocar con un vehículo, se desactivan durante 1,5 segundos.

4.**Competidores con IA inteligente** de
* Compite contra 5 coches controlados por la CPU.
* Los vehículos controlados por IA tienen diferentes velocidades de base, cambian de carril para esquivar obstáculos, buscan cajas de velocidad azules y lanzan bolas de fuego cuando se acercan por detrás al jugador u otros oponentes.

5. **Física realista y acabado visual**
* **Ángulo de guiñada 3D**: calcula en tiempo real el ángulo de inclinación/guiñada de los coches basándose en la velocidad de la dirección, lo que ofrece animaciones de conducción inmersivas.
* **Colisiones con la pared y fricción**: Salirse de los límites de la pista (`ROAD_HALF_WIDTH` = 6,0 m) reduce la velocidad del vehículo. Chocar con otros pilotos reduce la velocidad del coche y activa la física de empuje hacia atrás.
* **Fondo translúcido del HUD**: Garantiza que los textos del HUD sean legibles frente a cielos brillantes o campos de césped verde.

---

## 🕹️ Guía de controles

* **↑**: Acelerar.
* **↓**: Desacelerar / Marcha atrás.
* **←** y **→**: Girar a la izquierda y a la derecha.
* **SHIFT**: Lanzar bola de fuego (requiere mantener pulsado un potenciador de bola de fuego amarilla).
* **Enter**: Reiniciar la carrera.
* **ESC**: Salir del juego y restaurar la vista de gráfico predeterminada.

---

## 🛠️ Arquitectura del código

1. **`rates[]` Copia y seguimiento de la construcción**
* Copia los datos de velas desde el índice 1 utilizando `CopyRates`.
* Calcula `rates[i].close - rates[i].open` para definir las compensaciones de curvatura y las guarda en la matriz global `RoadOffsets[]`.

2. **`PSInputBuffer` Búfer de sombreado**
* Empaqueta las entradas de renderizado activas (resoluciones, coordenadas absolutas, vectores de vehículos IA, 32 desplazamientos de carretera locales, objetos de caja más cercanos, listas de proyectiles) y las registra en el sombreador de píxeles.

3. **`UpdateGame(double dt)` Bucle físico**
* Gestiona velocidades, tiempos de recarga, desaceleración natural y resistencia aerodinámica.
* Calcula las coordenadas absolutas del mundo 3D para todos los coches.
* Interpola los centros de las carreteras con `GetRoadXCPU(z)` para hacer cumplir los límites.
* Ejecuta las trayectorias de los proyectiles, las cajas de colisión y la lógica de colisión entre coches.
* Define los desencadenantes de victoria/derrota en función de la línea de meta (`FinishLineDistance`).

4. **Renderizado de fotogramas (`DXDrawIndexed` + mapas de bits)**
* Vacía la profundidad, incrementa las líneas de tiempo de los shaders y llama a `DXDrawIndexed`.
* Exporta los búferes de fotogramas a la matriz `image[]` de la CPU mediante `DXContextGetColors`.
* Superpone los textos del HUD (estadísticas de carrera, velocidades, tiempos y duraciones de los objetos activos) antes de actualizar el objeto gráfico del gráfico.

---

## ⚙️ Parámetros de configuración

Ajusta estas entradas al ejecutar el script:

* **InputKLineCount** (`Track Candlesticks`): Valor predeterminado `1000`. Establece la longitud del nivel.
* **CurveIntensity** (`Intensidad de la curva`): Valor predeterminado `2.5`. Unos coeficientes más altos dan como resultado curvas más cerradas y pronunciadas.
* **SegmentLength** (`Segment Depth`): Valor predeterminado `10,0` metros. Representa la longitud física de cada segmento de vela en el espacio 3D.

---

## 🚀 Cómo ejecutarlo

1. Abre MetaTrader 5.
2. Seleccione el símbolo y el marco temporal deseados (por ejemplo, GBPUSD, M15).
3. Navega por el árbol del «Navegador»: **Scripts -> My_Scripts -> 3D动画 -> Racing_Game_3D**.
4. Haz doble clic o arrastra `Racing_Game_3D` al gráfico.
5. Configura los parámetros en la ventana de diálogo y, a continuación, haz clic en «Aceptar».
6. El gráfico de trading se ocultará y comenzará la carrera. Pulsa **ESC** en cualquier momento para salir.

---


Otros productos de este autor
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
Este producto se puede utilizar para sincronizar múltiples Gráficos, y cada Gráfico se puede configurar en un modo de sincronización diferente. Con este producto puede ver y manipular mejor los gráficos: diferentes marcos temporales para un solo Símbolo, el mismo marco temporal para múltiples Símbolos... y mucho más. PD: El enlace de abajo es el producto FreeDemo, puedes usarlo con el símbolo EURUSD/XUAUSD/USDCNH: https://www.mql5.com/en/market/product/38557 Características: La configuración d
¿Crees que es un poco engorroso cuando necesitas cambiar símbolos o plazos con un clic del ratón? 1. ¿Qué es esto? Este es un programa que puede cambiar los símbolos y los plazos con las teclas de dirección. Cambio rápido, muy conveniente, sin necesidad de hacer clic con el ratón. Para los comerciantes, un símbolo con gráficos multi-marco de tiempo se suelen añadir, puede cambiar el símbolo en los gráficos con facilidad. Para los comerciantes de múltiples monedas, diferentes gráficos de símbolos
1. ¿Qué es esto? La volatilidad alcista y la volatilidad bajista no son lo mismo, ya sea la investigación académica o las pruebas reales han demostrado este punto. El indicador ATR original se calcula juntando las fluctuaciones al alza y a la baja. Este indicador es calcular por separado la volatilidad alcista y la volatilidad bajista, lo que puede ayudarle mejor a estudiar el mercado. 2. Descripción del indicador Hay dos modos para el cálculo de este indicador, como se muestra en la siguiente
¿Alguna vez ha tardado mucho tiempo en ver un símbolo cuando la conexión de red no es buena? ¿Alguna vez ha tenido que esperar mucho tiempo para cambiar de gráfico entre diferentes símbolos o diferentes marcos temporales? Si realiza pruebas a largo plazo, ¿alguna vez ha tenido que descargar datos durante mucho tiempo? Sí, si no hay datos en el sistema, esto sucederá. 1. ¿Qué es esto? Descargar todos los datos de símbolos en Market Watch al sistema. PS: Esto no es la salida de datos a los archivo
Este producto puede utilizarse para sincronizar múltiples gráficos, y cada gráfico puede configurarse en un modo de sincronización diferente. Con este producto puede ver y manipular mejor los gráficos: diferentes marcos temporales para un único Símbolo, el mismo marco temporal para múltiples Símbolos, indicadores de sistema para uno/múltiples Símbolos... y mucho más. Funciones: La configuración de los gráficos puede sincronizarse, incluyendo: fondo, sangría, tamaño, etc. Se pueden sincronizar
Veo que muchas herramientas en el mercado tratan la Posición y la Orden en forma de paneles de operaciones. Lo que se carga en un Gráfico en forma de un EA. Sin embargo, una vez cargado el EA del panel de operaciones, no se pueden cargar otros EAs. Por lo tanto, escribí la operación de un solo clic de Posición y Orden como un script, para que pueda cargar otros EAs y completar fácilmente la operación de un solo clic de Comercio. 1. 1. Que es esto: Este es un script de un clic para cerrar la ord
Veo que muchas herramientas en el mercado tratan la Posición y la Orden en forma de paneles de operaciones. Lo que se carga en un Gráfico en forma de un EA. Sin embargo, una vez cargado el EA del panel de operaciones, no se pueden cargar otros EAs. Por lo tanto, escribí la operación de un solo clic de Posición y Orden como un script, para que pueda cargar otros EAs y completar fácilmente la operación de un solo clic de Comercio. 1. 1. Que es esto: Este es un script de un clic para borrar la ord
¿Crees que es un poco engorroso cuando necesitas cambiar símbolos o plazos con un clic del ratón? 1. ¿Qué es esto? Este es un programa que puede cambiar los símbolos y los plazos con las teclas de dirección. Cambio rápido, muy conveniente, sin necesidad de hacer clic con el ratón. Para los comerciantes, un símbolo con gráficos multi-marco de tiempo se suelen añadir, puede cambiar el símbolo en los gráficos con facilidad . Para los comerciantes de múltiples monedas, diferentes gráficos de símbol
Según la experiencia comercial: Algunos símbolos son fáciles de invertir en ciertos días, como el lunes, o por la tarde, y así sucesivamente. Así que comparar el precio actual con el precio del momento histórico correspondiente es valioso. Si el sistema de coordenadas del precio utiliza un precio logarítmico, obtendrá mucha información valiosa. 1. ¿Qué es esto? Este programa puede convertir el precio del símbolo y añadirlo a su Gráfico. Puedes compararlo con tu gráfico principal. La versión DEM
¿Qué es esto? Trading violento: significa enviar un gran número de órdenes a su servidor de corretaje, puede realizar una prueba de estrés del trading. En este programa se puede ejecutar una variedad de pruebas de comercio. Ahora puede operar a alta velocidad, por ejemplo 1000 órdenes en un instante. El enlace de la versión Demo: https: //www.mql5.com/en/market/product/38431/ ¿Por qué utilizar: Si el comercio manual o EA de comercio, el estado del servidor del corredor es muy importante. Por lo
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
1. ¿Por qué desarrollé esta serie de indicadores ? Descubrí que la mayoría de los operadores necesitan utilizar múltiples indicadores de marco de tiempo. Suelen cambiar de marco temporal para ver los indicadores. Sin embargo, una vez que se cambia el marco de tiempo, no se puede ver la relación correspondiente entre el precio en el marco de tiempo más pequeño y el indicador en el marco de tiempo más grande . Por ejemplo: si su gráfico de precios está en el marco temporal H1, puede ver los indi
Filtro:
No hay comentarios
Respuesta al comentario