Existe uma maneira simples de impedir que os inimigos estejam no mesmo local?

24

Então: jogo de cima para baixo, meus inimigos perseguem o jogador, quando ficam a uma certa distância, ficam parados e disparam. Se todos estão vindo da mesma direção, todos acabam no mesmo local (ou seja, "dentro" um do outro), pois atualmente não estou detectando colisões entre inimigos - eles são livres para passar um pelo outro.

O que é uma maneira simples de contornar isso? Alguma forma de detecção de colisão ou alguma ai?

Iain
fonte
11
Limite-se a um inimigo. : P
Kylotan 11/08/10

Respostas:

18

Você não precisa de detecção de colisão, mas precisará dar aos seus inimigos um pouco de inteligência e evitar que eles se encontrem. A detecção de colisões sem isso fará com que seus inimigos pareçam estúpidos de qualquer maneira - as pessoas se evitam, geralmente não colidem.

Procure "reunir" alguns comportamentos simples.

A idéia básica é que as coisas devem ir em direção ao jogador, mas longe de um obstáculo próximo (um ao outro, paredes, esse tipo de coisa).

JasonD
fonte
6
É chamado também chamado boids. Leia sobre as regras simples que cercam os boids aqui: en.wikipedia.org/wiki/Boids Deve ser trivial para implementar essas restrições.
Nailer
12

Você pode se inspirar em comportamentos de flocagem , como o Boids .

Elas tendem a consistir em 3-4 regras muito simples que, aplicadas corretamente, resultam em comportamentos muito satisfatórios e de aparência complexa.

No seu caso, você pode tentar algo como isto:

  • Separação (raios mínimos entre inimigos)
  • Coesão (para que viajem em grupo)
  • Alinhamento (então eles tendem a se mover na mesma direção)
  • Alvo (eles devem tender a se mover em direção ao jogador)
egarcia
fonte
Esta é quase uma cópia literal da resposta de JasonD. Juro que não olhei antes de postar.
egarcia
4

O que você está perguntando em geral é a evitação dinâmica entre os atores. Você pode dar uma olhada nos obstáculos de velocidade: http://gamma.cs.unc.edu/RVO/

fatia de limão
fonte
3

Você pode conferir a difusão colaborativa (ótimas animações aqui) ou algum outro tipo de padrão antiobjeto para movimento. Embora o algoritmo de difusão por si só não impeça a passagem de inimigos, você pode adicionar restrições adicionais para torná-lo improvável ou impossível.

leander
fonte
Divulgação completa: tenho certeza que encontrei o link de difusão colaborativa aqui em algum lugar da GD, mas não consigo encontrar o post que se refere a ele agora. Foi um achado. =)
leander
Isso é super incrível, mas eu tenho um pouco mais de complexidade do que eu precisava. Vai ler o whitepaper de qualquer maneira, mas conseguiu implementar uma solução mais simples.
Iain
2

E se você não permitir a movimentação por outras unidades? Parece-me que você vai precisar mais cedo ou mais tarde. Sempre que o caminho atual estiver bloqueado por uma unidade, ajuste o caminho para se movimentar.

jmp97
fonte
2

Há alguma referência para comportamentos de direção e flocagem no site de Craig Reynold . Eles são relativamente simples de implementar, mas podem produzir um adorável comportamento emergente.

tenpn
fonte
Esta é essencialmente a mesma resposta que os outros 2, mas +1 no link - esse site é uma referência muito boa.
ASHelly
1

Todas as outras respostas produzem um resultado melhor, mas a maneira mais barata (?) De evitar o agrupamento completo é adicionar apenas um vetor aleatório que seja talvez 25% do vetor de movimento calculado original, para que os objetos se movimentem um pouco em um grupo de blobs geral . Isso não manterá as coisas completamente distantes umas das outras, mas, dependendo do que você está tentando alcançar, descobri que isso pode ser adequado. Os objetos ainda podem agrupar-se com esse método se você executar círculos em torno deles, mas com o tempo eles tendem a se difundir.

Aqui está um pequeno jogo que eu criei há vários anos que demonstra esse método: http://deleter.phatcode.net/index.php?page=projects&p=4

Deleter
fonte
1

As pessoas sempre criam boids porque isso fornece resultados muito bons, mas a implementação de boids pode ser um exagero para seu objetivo específico. No passado, obtive resultados muito bons, simplesmente aleatorizando a posição do alvo em um pequeno círculo.

Por exemplo, para uma demonstração que construí no Unity, usei o comando Random.insideUnitSphere para fazer puffballs

jhocking
fonte
+1 Eu concordo, outro exemplo dessa estratégia (com provavelmente uma garantia um pouco melhor de não se sobrepor) pode ser encontrado aqui: unidades "Unclutter" no jogo RTS
MichaelHouse