Sistema de Estradas parte 2 – Road Placer

Como Criar um Sistema de Estradas Inteligente no seu City Builder com Godot 4

Se você está desenvolvendo um City Builder, já sabe que clicar bloco por bloco para construir uma rua não é nem um pouco divertido para o jogador. Os grandes simuladores do mercado utilizam sistemas dinâmicos onde você clica, arrasta e a estrada automaticamente contorna obstáculos e se conecta sozinha.

Neste artigo, vamos destrinchar a mecânica por trás disso criando o RoadPlacer: o cérebro lógico responsável por gerenciar o traçado de vias em tempo real usando pathfinding na Godot 4.

A Arquitetura Modular: Quem faz o quê?

Para manter o projeto limpo e escalável, o RoadPlacer não trabalha sozinho. Ele funciona como um intermediário perfeito entre três sistemas estruturados anteriormente:

  • O Builder: Controla os comandos e inputs do mouse, além de gerenciar a carteira de dinheiro do jogador.
  • O CustomGridMap: Guarda o estado físico do mapa, sabendo exatamente quais coordenadas estão livres ou ocupadas.
  • O RoadBuilder: Cuida do acabamento estético, decidindo onde entram curvas, retas ou cruzamentos.

O Fluxo da Inteligência: O RoadPlacer calcula o caminho ideal no plano abstrato, o mundo (CustomGridMap) valida se há espaço físico livre, e a estética (RoadBuilder) finaliza o visual das conexões.

O Coração do Sistema: Pathfinding com A*

O grande segredo para fazer as estradas desviarem dinamicamente de prédios e casas é o algoritmo de busca de caminho A* (A-estrela). Ele é um dos métodos mais eficientes da computação para encontrar a rota mais curta entre dois pontos.

Para calcular o melhor traçado, o algoritmo combina a precisão matemática com uma busca heurística através da equação:

f(n) = g(n) + h(n)

Onde:

  • f(n) é o custo total estimado da rota (o algoritmo sempre prioriza o menor valor).
  • g(n) é o custo real do caminho já percorrido desde o ponto inicial até a posição atual.
  • h(n) é a heurística, ou seja, a estimativa de distância restante até o destino final.

A Godot oferece a classe nativa AStarGrid2D, especializada em matrizes bidimensionais. Ela facilita o processo por não exigir a criação ou conexão manual de nós.

Bloqueando Obstáculos e Forçando Curvas de 90°

Quando o jogador dá o primeiro clique para iniciar a estrada, o script faz o mapeamento consultando o dicionário _occupied_cells do mapa. Cada coordenada que já possui um edifício vira um ponto intransponível na matriz do A*.

Para garantir aquele visual clássico de cidade com esquinas perfeitas em ângulo reto, desativamos as diagonais no código:

GDScript
# Desativa movimentos diagonais no algoritmo
diagonal_mode = AStarGrid2D.DIAGONAL_MODE_NEVER

Isso força o sistema a ignorar diagonais, criando desvios perfeitos em formato de “L” ou “Z” caso haja uma construção bloqueando o caminho reto.

Sistema de Pré-visualização (Preview 3D)

Antes de gastar o dinheiro do jogador, o sistema cria “nós fantasmas” temporários ao longo do vetor gerado pelo A* para demonstrar o traçado.

Para dar um feedback visual instantâneo de validação, são utilizados dois materiais distintos:

  • Material Branco: Indica um traçado permitido e com saldo suficiente em caixa.
  • Material Vermelho: Indica que o jogador não possui saldo suficiente para pagar por aquela estrada.

Para garantir que o preview se destaque perfeitamente mesmo em cenários noturnos, aplicamos uma sobreposição de material:

GDScript
# Força a cor do bloco fantasma sem quebrar a estrutura original
if node is MeshInstance3D:
  node.material_override = red_ghost_mat

Configurando esse material com o modo SHADING_MODE_UNSHADED, a iluminação do cenário sobre o preview é inteiramente anulada. O resultado é uma estrada fantasma que renderiza uma cor constante e brilha no escuro, gerando um feedback visual excelente para o jogador.

O Aperto de Mão Final: Construção e Autotiling

Quando o jogador solta o botão do mouse (Input.is_action_just_released), o processo de renderização definitiva acontece em duas etapas extremamente rápidas:

1. Assentamento Bruto

O RoadPlacer multiplica a quantidade de blocos pelo preço unitário para validar o saldo financeiro. Se for positivo, ele percorre o caminho do A* e injeta os modelos base naquelas posições através do CustomGridMap. Nesse milissegundo inicial, todas as estradas nascem como retas genéricas viradas para o norte.

2. Conexão Automática (Autotiling)

Imediatamente após assentar as retas brutas, o RoadPlacer faz uma varredura e dispara o método road_fix() do RoadBuilder. Como os blocos novos agora são reais na grade, o script de bitmask lê a vizinhança de cada célula e substitui as retas por curvas, cruzamentos em “T” ou junções de 4 vias em menos de um único frame.

Assista ao Vídeo

Graças a essa separação modular de responsabilidades, o sistema de estradas deixa de ser um problema mecânico e se torna um recurso robusto e profissional. O jogador ganha a liberdade de desenhar malhas rodoviárias complexas que serpenteiam a cidade de forma inteligente e fluida.

Lembrando que o projeto com todos os códigos e arquivos está disponível de forma aberta no GitHub para modificações.


Revisado em

em

,

por

Comments

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *