Considérons une grille 2D de tuiles et une sphère approximative de coordonnées - centrée sur le joueur - qui représente la ligne de vue. Le but est de bloquer la ligne de vue au-delà des obstacles (par exemple les murs).
Il est relativement simple de déterminer si une cellule individuelle dans la sphère de vue est visible: lancez un rayon du joueur vers la cellule cible, en utilisant celle de Bresenham - si l'une des cellules qui se chevauchent entre le joueur et la cible est un obstacle, la cellule cible n'est pas visible.
Maintenant, ma première pensée a été de parcourir toutes les cellules de la grille en ligne de mire - mais cela me semble inefficace. Par exemple, si le joueur se tient à côté d'un mur et que vous déterminez que la cellule au-delà du mur n'est pas visible, vous pouvez déterminer toutes les cellules du rayon après que cela ne sera pas visible.
Nous avons également envisagé de lancer un rayon sur chaque cellule le long du périmètre de la sphère de la vue et d'itérer chaque cellule le long de chaque rayon - mais je traiterais alors certaines cellules plus d'une fois.
Existe-t-il un moyen plus efficace de procéder?
Bien que l'itération de ~ 50 cellules par tour soit un calcul relativement léger, je préfère la vitesse - l'objectif est de pouvoir faire quelques tours par seconde en lecture automatique. Donc, plus je peux le faire efficacement, mieux c'est.
la source
Réponses:
Vous pouvez essayer de lancer des "arcs d'ombre" pour couvrir simultanément de plus grandes zones. Bien que les détails réels soient un peu impliqués, Eric Lippert a une explication très approfondie (avec une démonstration en direct de Silverlight) sur http://blogs.msdn.com/b/ericlippert/archive/2011/12/12/shadowcasting-in -c-part-one.aspx .
la source
J'ai implémenté l'algorithme proposé par Jimmy.
Vidéo du code en action ici: https://youtu.be/lIlPfwlcbHo
la source