¿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?


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).


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)

Esta es casi una copia literal de la respuesta de JasonD. Juro que no lo miré antes de publicar.
egarcia


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.


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.


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.


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


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


+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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.