Se topó con un problema interesante. Necesito descubrir cómo simular la línea de visión, lo suficientemente simple, solo en una cuadrícula 2D con obstáculos. O una celda de cuadrícula es visible o no lo es.
Puedo hacer que algo realmente rudimentario funcione, como esparcir n espacios desde el jugador o bloquear la propagación horizontal cuando se detecta un obstáculo adyacente, pero no puedo permitirme vivir con él. Muchas otras aplicaciones están utilizando métodos más sofisticados que inclinan la línea de visión alrededor de las esquinas, etc., y quiero estar a la altura.
Hasta ahora DCSS ha sido mi fuente de inspiración cuando estoy perplejo, espero obtener algo parecido a lo que tienen: http://crawl.sz.org/ .
Cualquier idea sería apreciada, ¡gracias por la ayuda!
(Perdona si esto es vergonzosamente novato: solo comencé el desarrollo del juego hace unas semanas, tratando de ponerme al día).
fuente
Respuestas:
La proyección de rayos es una forma muy rápida y eficiente de determinar la línea de visión. Básicamente implica enviar un rayo (piense en él como un láser infinito que no se puede redirigir) desde una determinada posición en una determinada dirección. Usando este rayo, puede determinar cosas como qué punto (s) se cruzan y qué tan lejos del origen estaba cuando cruzó un cierto punto.
Entonces, por ejemplo, en un escenario de jugador / enemigo, el rayo podría originarse en el enemigo, siendo la dirección la ubicación del jugador. Si el rayo choca con una ficha sólida, el enemigo no puede ver al jugador. Si no lo hace, el enemigo puede ver al jugador.
Aquí hay un excelente tutorial que debería ayudar.
También puede considerar el algoritmo de línea de Bresenham (resumido, crea líneas) para algo que podría escalarse más fácilmente a los mosaicos.
fuente
He bloggeado código para calcular la línea de visión desde un mapa de altura. Un mapa plano simple con obstáculos es solo un mapa de altura muy plano, y esta implementación sigue siendo completamente aplicable.
Aquí está en C ++ y sus
O(n)
; Si conoce la altura máxima en el mapa, puede rastrear una línea de exploración que no tiene rayos restantes por debajo de esa altura, y desde el principio:fuente