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:
# Desativa movimentos diagonais no algoritmo
diagonal_mode = AStarGrid2D.DIAGONAL_MODE_NEVERIsso 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:
# Força a cor do bloco fantasma sem quebrar a estrutura original
if node is MeshInstance3D:
node.material_override = red_ghost_matConfigurando 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.


Deixe um comentário