Atualmente, estou fazendo um jogo de defesa em torre 2D com uma pista estática e predeterminada que os inimigos seguem (ou seja, torres não podem bloquear o caminho e encontrar o caminho não é o problema que estou tentando resolver).
Estou tentando descobrir exatamente como fazer as unidades seguirem essa faixa de maneira suave . Tenho duas idéias aproximadas sobre como fazer isso, mas gostaria de algumas sugestões sobre as quais provavelmente será mais fácil de implementar / a técnica mais padrão. Ou, é claro, se houver uma maneira totalmente diferente que não considerei, eu adoraria aprender sobre isso também.
Waypoints: Minha primeira idéia foi definir o caminho como uma série de waypoints codificados. As unidades usariam então um algoritmo básico de direção "procurar" (como este ) para mover-se para cada waypoint ao longo do caminho em sucessão. No entanto, eu me perguntei se seria difícil impedir que as unidades se desviassem para muito da faixa que eu quero que elas sigam. Eu me pergunto se a incapacidade de virar bruscamente o suficiente pode levá-los a "deslizar" para fora da pista desejada. Suponho que posso evitar isso, permitindo que uma força de direção relativamente forte seja aplicada?
Curvas de Bezier: A segunda solução que considerei é definir o caminho com uma curva de bezier e, a cada passo do tempo, calcular o ponto ao longo da curva com (dt * velocidade) distante da localização atual da unidade. Suspeito que essa técnica facilitaria muito a definição precisa do caminho que as unidades seguirão, mas não sei exatamente como implementar isso. Alguma sugestão?
Além disso, isso não mudará as respostas de ninguém, mas as unidades também devem poder viajar a uma velocidade constante ao longo do caminho. Além disso, estou programando este jogo em python usando a estrutura pyglet.
Se algo sobre a questão não estiver claro, entre em contato.
Edit: Também por qualquer que seja o valor, estou tentando replicar o comportamento de movimento dos inimigos na Kingdom Rush .
Respostas:
Permitam-me apresentar-lhe o famoso artigo de Craig Reynolds sobre comportamentos de direção para personagens autônomos . Se você ainda não leu, deve ajudá-lo a refletir sobre esses tipos de problemas, em particular, dê uma olhada na seção sobre busca de caminhos .
A idéia do artigo de Reynolds é que você pode usar forças simples que se combinam para produzir uma navegação improvisada e realista em todo o ambiente. Os movimentos não se baseiam no planejamento de trajetos ou cálculos globais, mas usam informações locais, como as forças dos vizinhos, o que os torna simples de entender e implementar, mas ainda produz padrões de movimento muito complexos.
A beleza da abordagem é que você pode combinar vários comportamentos. Assim, por exemplo, seus personagens podem ter um comportamento de busca de caminho e de separação (para evitar que se aglomerem demais), que podem ser combinados como uma soma ponderada.
Outro benefício do uso de comportamentos de direção é que há várias implementações de código aberto existentes em uma variedade de idiomas (por exemplo, opensteer ).
ATUALIZAÇÃO: Dei uma olhada no Kingdom Rush e acho que não entendi o que você quis dizer com "sem problemas". Entendi que isso significava mais realista, mas acho que o que você procura é mais como se os personagens estivessem em uma linha de trem. Além disso, lendo com mais atenção, vejo que um dos seus requisitos é que "as unidades devem poder viajar a uma velocidade constante ao longo do caminho". Comportamentos de direção não lhe proporcionarão uma velocidade constante de movimento, mas a simples busca de caminhos combinada com pontos de referência o fará. (Ou seja, não use o comportamento de "busca" para chegar ao waypoint, em vez disso, basta determinar o vetor de direção e fazer com que a unidade se mova a toda velocidade para esse waypoint.) Use mais waypoints para suavizar a rota.
fonte
A solução neste artigo do Gamasutra pode ser o que você está procurando. A idéia básica é lançar raios para um waypoint que está dois passos à frente do waypoint atual, "pisando" o raio uma fração do comprimento de uma célula e a cada "pisada" do raio, verificando se o volume de colisão do seu jogador colide com alguma coisa na posição escalonada do raio. Se o raio chegar ao waypoint que está a dois passos à frente, você poderá se livrar do waypoint intermediário. então você pode continuar esse mesmo processo até o waypoint "objetivo" ... assim, se seu caminho puder ser realizado por uma linha reta até a meta, uma linha reta até a meta será a rota que seu personagem seguirá. aqui está o artigo: http://www.gamasutra.com/view/feature/131505/toward_more_realistic_pathfinding.
Ele também contém grandes coisas sobre o raio de virada e comportamentos de viragem mais naturais e ...
fonte