Deparou-se com um problema interessante. Eu preciso descobrir como simular a linha de visão - bastante simples, apenas em uma grade 2D com obstáculos. Uma célula da grade é visível ou não.
Posso obter algo realmente rudimentar - como espalhar n espaços do jogador ou bloquear a propagação horizontal quando um obstáculo adjacente é detectado, mas não posso me permitir viver com ele. Muitos outros aplicativos estão usando métodos mais sofisticados que inclinam a linha de visão em torno dos cantos, etc., e eu quero estar no mesmo nível.
Até agora, o DCSS tem sido minha fonte de inspiração quando estou perplexo, na esperança de obter algo próximo do que eles têm: http://crawl.sz.org/ .
Qualquer insight seria apreciado - obrigado pela ajuda!
(Perdoe se isso é embaraçosamente noobish - apenas iniciei o desenvolvimento do jogo há algumas semanas, tentando alcançá-lo.
fonte
Respostas:
A fundição por raio é uma maneira muito rápida e eficiente de determinar a linha de visão. Basicamente, envolve o envio de um raio (pense nele como um laser infinito que não pode ser redirecionado) de uma determinada posição em uma determinada direção. Usando esse raio, você pode determinar coisas como o (s) ponto (s) em que ele se cruza e a que distância da origem estava quando cruzou um determinado ponto.
Assim, por exemplo, em um cenário de jogador / inimigo, o raio pode se originar do inimigo, com a direção sendo a localização do jogador. Se o raio colidir com uma peça sólida, o inimigo não poderá ver o jogador. Caso contrário, o inimigo pode ver o jogador.
Aqui está um excelente tutorial que deve ajudar.
Você também pode considerar o algoritmo de linha de Bresenham (resumido, ele cria linhas) para algo que pode ser mais facilmente dimensionado para blocos.
fonte
Eu escrevi um código no blog para calcular a linha de visão a partir de um mapa de altura. Um mapa plano simples com obstáculos é apenas um mapa de altura muito plano e essa implementação ainda é completamente aplicável.
Aqui está em C ++ e seu
O(n)
; se você souber a altura máxima no mapa, poderá rastrear uma linha de varredura que não tenha raios restantes sob essa altura e sair mais cedo:fonte