Ran dans un problème intéressant. J'ai besoin de comprendre comment simuler la ligne de vue - assez simple, juste sur une grille 2D avec des obstacles. Soit une cellule de la grille est visible, soit elle ne l'est pas.
Je peux obtenir quelque chose de vraiment rudimentaire - comme écarter n espaces du joueur, ou bloquer la propagation horizontale lorsqu'un obstacle adjacent est détecté, mais je ne peux pas me permettre de vivre avec. De nombreuses autres applications utilisent des méthodes plus sophistiquées qui inclinent la ligne de vue dans les coins, etc., et je veux être à la hauteur.
Jusqu'à présent, DCSS a été ma source d'inspiration lorsque je suis perplexe, j'espère obtenir quelque chose de proche de ce qu'ils ont: http://crawl.sz.org/ .
Toute information serait appréciée - merci pour l'aide!
(Pardonnez si c'est un noobish gênant - vous n'avez commencé le développement du jeu qu'il y a quelques semaines, en essayant de rattraper votre retard.)
la source
Réponses:
Le lancer de rayons est un moyen très rapide et efficace de déterminer la ligne de visée. Cela implique essentiellement d'envoyer un rayon (pensez-y comme un laser infini qui ne peut pas être redirigé) à partir d'une certaine position dans une certaine direction. En utilisant ce rayon, vous pouvez déterminer des choses comme le (s) point (s) qu'il intersecte et la distance à laquelle il se trouvait lorsqu'il a traversé un certain point.
Ainsi, par exemple, dans un scénario joueur / ennemi, le rayon pourrait provenir de l'ennemi avec la direction étant l'emplacement du joueur. Si le rayon entre en collision avec une tuile solide, l'ennemi ne peut pas voir le joueur. Si ce n'est pas le cas, l'ennemi peut voir le joueur.
Voici un excellent tutoriel qui devrait vous aider.
Vous pouvez également envisager algorithme de ligne de Bresenham (résumé, il crée des lignes) pour quelque chose qui pourrait être plus facilement mis à l'échelle en tuiles.
la source
J'ai blogué du code pour calculer la ligne de vue à partir d'une carte de hauteur. Une simple carte plate avec des obstacles n'est qu'une carte très plate en hauteur, et cette implémentation est toujours complètement applicable.
Le voici en C ++ et son
O(n)
; si vous connaissez la hauteur maximale sur la carte, vous pouvez suivre une ligne de balayage qui n'a aucun rayon restant sous cette hauteur, et au début:la source