Localização de caminhos 2D - localização de caminhos suaves

10

Eu estava tentando implementar um caminho simples, mas o resultado é menos satisfatório do que o que pretendia alcançar. O problema é que unidades em jogos como Starcraft 2 se movem em todas as direções, enquanto as unidades, no meu caso, só se movem no máximo 8 direções (estilo Warcraft 1), pois essas 8 direções direcionam para os seguintes nós disponíveis (eles se movem de um bloco para o próximo bloco vizinho) . O que devo fazer para alcançar o resultado como no Starcraft 2? Encolher o tamanho do ladrilho?

http://i.stack.imgur.com/lr19c.jpg

Na imagem, você pode ver uma linha horizontal de ladrilhos de pedra sendo obstáculos e o caminho encontrado marcado como ladrilhos verdes. A linha vermelha é o caminho que quero alcançar.

Kooi Nam Ng
fonte
Sou um grande fã da pesquisa de pontos de salto, embora ainda não tenha encontrado tempo para implementá-la. Mas a documentação foi interessante e tem um bom desempenho.
2
Tem certeza de que esse é o caminho que você deseja? As unidades que o utilizam passarão parcialmente pelas paredes. I tornou mais visível em outro exemplo: i.imgur.com/eh4ZR.png E aqui está o que você provavelmente realmente deseja alcançar: i.imgur.com/vFQg4.png
Markus von Broady
Você está certo. Meu caminho foi falho, mas foi mais para fins ilustrativos. Obrigado por apontar a melhor maneira de investigar.
Kooi Nam Ng
Você precisará ter coordenadas fracionárias em um bloco para obter o que deseja. Nenhum caminho possível sem isso funcionaria - transportar as frações, mas não exibi-las, faria sua unidade se mover reta / diagonal / reta / diagonal.
Loren Pechtel
@ LorenPechtel você está errado, você pode suavizar o caminho depois de encontrar um. É muito fácil criar duas linhas com base nas dimensões da unidade e verificar se elas se cruzam com blocos entre o azulejo0 e o azulejoN, onde o azulejo1-azulejo (N-1) são azulejos que você deseja remover do caminho.
Markus von Broady

Respostas:

8

Para um bom algoritmo de busca de caminhos, usar A * provavelmente seria uma boa idéia, no entanto, para um jogo simples que não exige busca de caminho sofisticada, eficiente ou eficaz, basta fazer com que os personagens se movam em direção a um alvo, descobrindo a direção de o alvo deve ser suficiente.

Você pode gerar um 'gráfico de visibilidade' (que outros pontos são visíveis de cada ponto) a partir dos vértices e executar A * no gráfico. Isso funciona porque o caminho mais curto sempre estará no gráfico de visibilidade.

Encolher o tamanho do ladrilho pode ajudá-lo.

Recursos

Leitura adicional

EDIT: Eu gosto do comentário @ MarkusvonBroady.

"na verdade, trata-se de suavizar o caminho, não encontrar. O caminho encontrado na imagem parece bom."

Recursos

From @MarkusvonBroady

Eu fiz uma pesquisa, encontre os seguintes itens (esses podem ajudá-lo)

Md Mahbubur Rahman
fonte
1
ótimos links, +1 de mim
lhk
2
@MarkusvonBroady, Obrigado por -1. Eu aprendi com você. Não quero argumentos, estou disposto a aprender e compartilhar o caminho certo. Acredito que, discutindo, podemos encontrar o caminho certo. :)
Md Mahbubur Rahman
@MarkusvonBroady, você poderia compartilhar vários recursos do algoritmo de suavização de caminho?
Md Mahbubur Rahman
Na verdade, acho que essa resposta ajuda o OP. Eu não acho que o OP estava pedindo uma suavização real (interpolação de spline ou algo semelhante), mas sim que seu algoritmo está atualmente encontrando um caminho horrivelmente não ideal e precisa ser "suavizado" em uma linha mais reta. Qual A * naturalmente teria encontrado para ele sem nenhuma suavização adicional.
Sean Middleditch
Eu estava usando A * e acho que encontrei o caminho ideal.
Kooi Nam Ng
0

A partir de uma extremidade do caminho bruto, por exemplo path[0], você pode remover path[1]se o segmento formado pela união dos pontos path[0]e path[2]NÃO cruza nenhuma parede. Ir além até o último segmento fornecerá um caminho mais simples.

Isso não apenas suaviza o caminho, mas também remove alguns pontos inúteis, como exemplo de fogo, 3 segmentos consecutivos de uma linha reta.

arainona
fonte