¿Hay una manera simple de detener a los enemigos que se encuentran en el mismo lugar?

24

Entonces: juego de arriba hacia abajo, mis enemigos persiguen al jugador, cuando se acercan a una cierta distancia se quedan quietos y disparan. Si todos vienen de la misma dirección, todos terminan parados en el mismo lugar (es decir, parados "dentro" uno del otro), ya que actualmente no estoy haciendo detección de colisión entre enemigos: son libres de pasar el uno sobre el otro.

¿Qué es una forma simple de evitar esto? ¿Alguna forma de detección de colisión o alguna ai?

Iain
fuente
1
Limítate a un solo enemigo. : P
Kylotan

Respuestas:

18

No necesita detección de colisión, pero tendrá que darles a sus enemigos un poco de inteligencia y evitar que se encuentren. La detección de colisión sin eso solo hará que tus enemigos se vean estúpidos de todos modos: las personas se evitan entre sí, generalmente no chocan.

Busque "congregación" para algunos comportamientos simples.

La idea básica es que las cosas deben dirigirse hacia el jugador, pero lejos de un obstáculo cercano (entre sí, paredes, ese tipo de cosas).

JasonD
fuente
66
Se llama también llamado boids. Lea sobre las reglas simples que rodean los boids aquí: en.wikipedia.org/wiki/Boids Debería ser trivial para implementar estas restricciones.
Nailer
12

Podrías inspirarte en comportamientos de congregación , como Boids .

Estos tienden a consistir en 3-4 reglas muy simples que, aplicadas correctamente, resultan en comportamientos muy satisfactorios y de "aspecto complejo".

En su caso, podría intentar algo como esto:

  • Separación (radios mínimos entre enemigos)
  • Cohesión (para que viajen en grupos)
  • Alineación (por lo que tienden a moverse en la misma dirección)
  • Apuntado (deben tender a moverse hacia el jugador)
egarcia
fuente
Esta es casi una copia literal de la respuesta de JasonD. Juro que no lo miré antes de publicar.
egarcia
4

Lo que estás preguntando en general es la evasión dinámica entre actores. Puede echar un vistazo a los obstáculos de velocidad: http://gamma.cs.unc.edu/RVO/

rodajas de cal
fuente
3

Es posible que desee consultar la difusión colaborativa (excelentes animaciones aquí) o algún otro tipo de patrón antiobjeto para el movimiento. Si bien el algoritmo de difusión en sí mismo puede no impedir que los enemigos se crucen, puede agregar restricciones adicionales para que sea poco probable o imposible.

leander
fuente
Revelación completa: estoy bastante seguro de que encontré el enlace de difusión colaborativa aquí en algún lugar de GD, pero por mi vida no puedo encontrar la publicación que se refiere a ella ahora. Fue todo un hallazgo. =)
leander
Esto es súper increíble, pero mordí más complejidad de la que necesitaba. Leerá el documento técnico de todos modos, pero logró implementar una solución más simple.
Iain
2

¿Qué pasa si no permite moverse a través de otras unidades? Me parece que lo necesitará tarde o temprano. Siempre que el camino actual sea bloqueado por una unidad, ajuste el camino para moverse alrededor de eso.

jmp97
fuente
2

En el sitio web de Craig Reynold hay referencias para los comportamientos de dirección y de congregación . Son relativamente simples de implementar, pero pueden producir un comportamiento emergente encantador.

tenpn
fuente
Esta es esencialmente la misma respuesta que las otras 2, pero +1 para el enlace: ese sitio web es una muy buena referencia.
AShelly
1

Todas las otras respuestas producen un mejor resultado, pero la forma más económica (?) De evitar la agrupación completa es simplemente agregar un vector aleatorio que tal vez sea el 25% del vector de movimiento calculado original para que los objetos reboten un poco en un grupo de blobs generales . No mantendrá las cosas completamente separadas, pero dependiendo de lo que intente lograr, he descubierto que esto puede ser adecuado. Los objetos aún pueden agruparse con este método si corres círculos alrededor de ellos, pero con el tiempo tienden a difuminarse.

Aquí hay un pequeño juego que hice hace varios años que demuestra este método: http://deleter.phatcode.net/index.php?page=projects&p=4

Deleter
fuente
1

La gente siempre saca los boids porque eso da muy buenos resultados, pero implementar boids puede ser excesivo para su propósito específico. En el pasado, obtuve muy buenos resultados simplemente aleatorizando la posición del objetivo dentro de un círculo pequeño.

Por ejemplo, para una demostración que construí en Unity utilicé su comando Random.insideUnitSphere para hacer puffballs en masa

jhocking
fuente
+1 Estoy de acuerdo, aquí se puede encontrar otro ejemplo de esta estrategia (con probablemente una mejor garantía de no superponerse): unidades "Unclutter" en el juego RTS
MichaelHouse