BlocosIA Wiki Editor

Como programar carros e motos 3D (Corrida e Motocross)

Por dentro dos exemplos Corrida 3D e Motocross: física do veículo, câmera de perseguição, pontos do caminho (aquelas listas de números), piloto automático dos rivais, voltas e a montanha.

1. O jogador VIRA o veículo

Nos dois jogos você não controla um ator andando: o bloco jogador dirigir troca o jogador do Mundo 3D por um carro ou uma 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, o veículo guarda uma rapidez (velocidade para a frente) e, a cada quadro (60 vezes por segundo):

  • W soma aceleração à rapidez; S freia (e, parado, dá ré); sem tecla, o atrito vai parando o carro aos poucos. É isso que dá a sensação de inércia.
  • A/D giram a direção, mas o giro é proporcional à rapidez: parado, o carro não vira (como um carro de verdade).
  • A rapidez vira um passo para a frente: x muda por seno(direção) × rapidez e z por −cosseno(direção) × rapidez.
  • Se bater num degrau de 1 bloco, o veículo sobe; numa parede, perde rapidez e dispara quando o veículo do jogador bater.
  • A moto tem mais aceleração, vira mais rápido e pula com Espaço; o desenho dela inclina nas curvas e as rodas giram conforme a velocidade.

A câmera perseguição fica atrás do veículo e gira atrasada (ela "persegue" a direção do carro), por isso as curvas ficam suaves.

2. Os rivais: o que são aqueles números?

Num rival você vai ver uma lista assim:

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

São as coordenadas x dos pontos do caminho (em inglês, waypoints) do rival verde. Existe uma segunda lista, caminho Z, com as coordenadas z. Juntando o 1º número de cada lista você tem o ponto 1, o 2º com o 2º dá o ponto 2, e assim por diante: 43 pontos marcados ao redor da pista, como migalhas de pão.

Leia a lista e veja o desenho da pista nela:

  • 36 → 91 sobe de 5 em 5: é a reta de cima, o carro andando para a direita (x crescendo).
  • 94.3 → 97 → 85.9 sobe devagar, chega em 97 (o ponto mais à direita) e volta: é a curva da direita (um meio-círculo). Na curva x muda pouco, porque o carro anda mais em z.
  • 80.8 → 15.1 desce de 5 em 5: é a reta de baixo, voltando para a esquerda.
  • 11.2 → 7.1 → 31: a curva da esquerda (7.1 é o ponto mais à esquerda) e a volta até perto da largada.

De onde saíram? A pista é um oval "de estádio": duas retas de 52 blocos e dois meios-círculos de raio 18 (contorno de uns 217 blocos). O programa andou por esse contorno e anotou um ponto a cada ~5 blocos (217 ÷ 5 ≈ 43). Nas retas é só somar; nas curvas usa cosseno e seno (x = centro + raio × cos(ângulo)). Cada rival anda numa faixa diferente (um pouco mais para dentro ou para fora), por isso as listas dos três rivais são parecidas mas não iguais. As listas estão como texto separado por vírgula e o bloco dividir o texto por "," transforma o texto numa lista.

3. O piloto automático (os blocos do 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]
  1. dirigir até x z com velocidade vira o carro um pouquinho em direção ao ponto atual (como um volante) e anda. Ele não "teleporta": por isso faz curvas bonitas.
  2. Quando minha distância até x z fica menor que 3,5 blocos, o rival já chegou e passa para o próximo ponto (ponto + 1).
  3. Passou do último ponto? Volta para o ponto 1 e soma uma volta.
  4. Depois de 3 voltas, soma 1 em "rivais que chegaram". Quando você cruza a linha, a sua posição é "rivais que chegaram + 1".

Velocidades diferentes (12 / 12,6 / 13,2) deixam os rivais com níveis diferentes. Quer um rival mais difícil? Aumente a velocidade.

4. Crie a sua própria pista e grave o caminho dirigindo

Você não precisa fazer contas! Dirija o carro pela sua pista e deixe um script anotar os pontos a cada meio 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]

Depois mostre as variáveis caminhoX e caminhoZ no palco (ou use "dizer") e use esses números nos rivais.

5. Voltas, grama e batidas (o seu carro)

  • Contar voltas sem trapaça: a volta só conta se você passou pelo meio da pista (reta de baixo) e depois pela linha xadrez. Assim não dá para ir e voltar na linha.
  • Grama freia: o jogo olha o bloco embaixo do carro (y − 0,5). Se for grama, a velocidade cai.
• ctl_sempre
  • ctl_se_senao [COND: (op_igual)]
    • m3d_jog_vel [VEL: 2.4]
    …:
    • m3d_jog_vel [VEL: 4.3]
  • Tempo e melhor volta usam o bloco cronômetro (Sensores), que é preciso. Esperar 0,1 s e somar 0,1 atrasa, porque cada repetição demora um pouco mais.

6. A moto e a montanha

A montanha foi construída por código: a trilha sobe da esquerda para a direita e a altura dela é mais ou menos 8 + x × 0,2 (sobe 1 bloco a cada 5). O programa garante que a trilha nunca sobe mais de 1 bloco de uma coluna para a outra, senão a moto travaria. Ao lado fica um paredão (para não sair da trilha) e do outro lado o penhasco.

• 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
  • Caiu? Se a altura da moto ficar bem abaixo da trilha (menor que 4 + x × 0,2), ela volta ao último checkpoint.
  • Checkpoint: passou do poste amarelo (x maior que 41), ponto de início onde o jogador está salva ali o novo começo.
  • Câmera de lado: aperte C. A câmera vê a montanha de perfil, como nos jogos de subir morro.

7. Desafios

  • Faça uma pista em forma de 8 e grave o caminho dos rivais dirigindo (seção 4).
  • Crie um turbo: ao apertar Shift, "velocidade do jogador 6" por 2 segundos.
  • No motocross, coloque um rival "fantasma" que segue os pontos da trilha.
  • Troque a câmera para de cima e faça um jogo de carrinho de controle remoto.

Abrir no editor