Cómo programar coches y motos 3D (Carrera y Motocross)
Por dentro de los ejemplos Carrera 3D y Motocross: física del vehículo, cámara de persecución, puntos del camino (esas listas de números), piloto automático de los rivales, vueltas y la montaña.
1. El jugador SE VUELVE el vehículo
En los dos juegos no controlas un actor caminando: el bloque jugador conducir cambia el jugador del Mundo 3D por un coche o una moto.
• evt_bandeira • m3d_jog_veiculo [VEIC: carro, COR: #3B6FD8] • m3d_camera [MODO: perseguicao] • m3d_jog_vel [VEL: 4.3] • m3d_controles [MODO: sim]
Por dentro, el vehículo guarda una rapidez (velocidad hacia adelante) y, en cada cuadro (60 veces por segundo):
- W suma aceleración; S frena (y, parado, da marcha atrás); sin tecla, el rozamiento va parando el coche. Esa es la sensación de inercia.
- A/D giran la dirección, pero el giro es proporcional a la rapidez: parado, el coche no gira (como uno de verdad).
- La rapidez se vuelve un paso adelante: x cambia en seno(dirección) × rapidez y z en −coseno(dirección) × rapidez.
- En un escalón de 1 bloque el vehículo sube; en una pared pierde rapidez y dispara cuando el vehículo del jugador choque.
- La moto acelera más, gira más rápido y salta con Espacio; se inclina en las curvas y sus ruedas giran con la velocidad.
La cámara persecución queda detrás del vehículo y gira con retraso (ella "persigue" la dirección del coche), por eso las curvas se ven suaves.
2. Los rivales: ¿qué son esos números?
En un rival verás una lista así:
36, 41, 46.1, 51.1, 56.2, 61.2, 66.3, 71.3, 76.4, 81.6, 86.6, 91, 94.3, 96.4, 97, 96.1, 93.9, 90.3, 85.9, 80.8, 75.6, 70.5, 65.5, 60.4, 55.4, 50.3, 45.3, 40.2, 35.2, 30.1, 25, 19.8, 15.1, 11.2, 8.5, 7.1, 7.3, 8.8, 11.8, 15.8, 20.6, 25.9, 31
Son las coordenadas x de los puntos del camino (waypoints) del rival verde. Otra lista, camino Z, tiene las coordenadas z. El 1.º número de cada lista es el punto 1, el 2.º de cada una es el punto 2, y así: 43 puntos alrededor de la pista, como migas de pan.
Lee la lista y verás la pista en ella:
- 36 → 91 sube de 5 en 5: la recta de arriba, el coche yendo a la derecha (x creciendo).
- 94.3 → 97 → 85.9 sube despacio, llega a 97 (el punto más a la derecha) y vuelve: la curva derecha (medio círculo). En la curva x cambia poco, porque el coche se mueve más en z.
- 80.8 → 15.1 baja de 5 en 5: la recta de abajo, volviendo a la izquierda.
- 11.2 → 7.1 → 31: la curva izquierda (7.1 es el punto más a la izquierda) y la vuelta cerca de la salida.
¿De dónde salieron? La pista es un óvalo "de estadio": dos rectas de 52 bloques y dos medios círculos de radio 18 (unos 217 bloques de contorno). El programa recorrió ese contorno y anotó un punto cada ~5 bloques (217 ÷ 5 ≈ 43). En las rectas solo suma; en las curvas usa coseno y seno (x = centro + radio × cos(ángulo)). Cada rival va por un carril distinto (un poco hacia dentro o hacia fuera), por eso las tres listas son parecidas pero no iguales. Las listas están como texto separado por comas y el bloque dividir el texto por "," convierte el texto en una lista.
3. El piloto automático (los bloques del rival)
• evt_bandeira
• m3d_corpo [FORMA: carro, COR: #3E9E3A, TAM: 100]
• m3d_corpo_fisica [MODO: sim]
• var_definir [VAR: caminhoX, VALOR: (arr_dividir)]
• var_definir [VAR: caminhoZ, VALOR: (arr_dividir)]
• var_definir [VAR: ponto, VALOR: 1]
• evt_receber
• ctl_repetir_ate [COND: (op_maior)]
• m3d_corpo_dirigir [X: (arr_item), Z: (arr_item), VEL: 12]
• ctl_se [COND: (op_menor)]
• var_adicionar [VAR: ponto, VALOR: 1]
• ctl_se [COND: (op_maior)]
• var_definir [VAR: ponto, VALOR: 1]
• var_adicionar [VAR: voltas, VALOR: 1]- conducir hasta x z con velocidad gira el coche un poquito hacia el punto actual (como un volante) y avanza. No se teletransporta: por eso hace curvas bonitas.
- Cuando mi distancia a x z es menor que 3,5 bloques, el rival llegó y pasa al siguiente punto (punto + 1).
- ¿Pasó el último punto? Vuelve al punto 1 y suma una vuelta.
- Tras 3 vueltas suma 1 a "rivales que llegaron". Cuando cruzas la línea, tu posición es "rivales que llegaron + 1".
Velocidades distintas (12 / 12,6 / 13,2) dan niveles distintos. ¿Quieres un rival más difícil? Sube su velocidad.
4. Crea tu propia pista y graba el camino conduciendo
¡No hace falta hacer cuentas! Conduce el coche por tu pista y deja que un script anote los puntos cada medio segundo:
• evt_tecla [TECLA: g] • var_definir [VAR: caminhoX, VALOR: (arr_vazia)] • var_definir [VAR: caminhoZ, VALOR: (arr_vazia)] • ctl_repetir [VEZES: 60] • arr_adicionar [VALOR: (m3d_jog_pos), VAR: caminhoX] • arr_adicionar [VALOR: (m3d_jog_pos), VAR: caminhoZ] • ctl_esperar [SEG: 0.5]
Luego muestra las variables caminhoX y caminhoZ en el escenario (o usa "decir") y usa esos números en los rivales.
5. Vueltas, césped y choques (tu coche)
- Contar vueltas sin trampa: la vuelta solo cuenta si pasaste por el medio de la pista (recta de abajo) y después por la línea a cuadros. Así no se puede ir y volver sobre la línea.
- El césped frena: el juego mira el bloque debajo del coche (y − 0,5). Si es césped, la velocidad baja.
• ctl_sempre
• ctl_se_senao [COND: (op_igual)]
• m3d_jog_vel [VEL: 2.4]
…:
• m3d_jog_vel [VEL: 4.3]- El tiempo y la mejor vuelta usan el bloque cronómetro (Sensores), que es preciso. Esperar 0,1 s y sumar 0,1 se atrasa, porque cada repetición tarda un poco más.
6. La moto y la montaña
La montaña se construyó con código: el sendero sube de izquierda a derecha y su altura es más o menos 8 + x × 0,2 (sube 1 bloque cada 5). El programa garantiza que el sendero nunca sube más de 1 bloque de una columna a otra, si no la moto se atascaría. A un lado hay un paredón (para no salir del sendero) y al otro el acantilado.
• evt_bandeira
• m3d_jog_veiculo [VEIC: moto, COR: #FF8C1A]
• m3d_camera [MODO: perseguicao]
• ctl_sempre
• ctl_se [COND: (op_menor)]
• m3d_jog_inicio
• ctl_se [COND: (op_maior)]
• m3d_jog_marcar- ¿Caíste? Si la moto queda muy por debajo del sendero (menos que 4 + x × 0,2), vuelve al último punto de control.
- Punto de control: al pasar el poste amarillo (x mayor que 41), punto de inicio donde está el jugador guarda ahí el nuevo comienzo.
- Cámara de lado: pulsa C. La cámara ve la montaña de perfil, como en los juegos de subir colinas.
7. Desafíos
- Haz una pista en forma de 8 y graba el camino de los rivales conduciendo (sección 4).
- Crea un turbo: al pulsar Shift, "velocidad del jugador 6" durante 2 segundos.
- En el motocross, añade un rival "fantasma" que siga los puntos del sendero.
- Cambia la cámara a desde arriba y haz un juego de coche teledirigido.