Bonjour,
JE suis en train de m'amuser à faire un petit jeu.
J'ai une grille 2D contenant une map vue de haut. Pour faire simple, on va dire que 0 = la case est libre, 1 = il y a un mur (on ne peut pas passer par cette case). Dans le vrai jeu il y a plusieurs types de cases franchissables ou non, bénéfiques ou non pour le joueur; mais ici on s'en fiche.
Le joueur se trouve en position (X1;Y1). Un ennemi ou un objet quelconque se trouve en position (X2;Y2). La question que j'ai est la suivante: comment déterminer s'il est visible en ligne directe ? C'est-à-dire, concrètement, savoir si on peut tracer une ligne droite allant de (X1;Y1) à (X2;Y2) sans passer par un mur, peu importe la direction de la ligne ?
Par exemple pour la grille suivante, (0;0) en haut à gauche :
1 2 3 | 0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 |
Le joueur se trouvant en (0;0), l'algorithme me répondrait oui pour (4;0), mais non pour (2;2) et (3;1). Pour les cas limites, p.ex. (2;2) est-il visible depuis (4;0), je préfèrerais que la réponse soit non, ou autrement dit qu'on ne voie pas à travers un mur continu en diagonale. Le joueur et les ennemis ne peuvent pas se déplacer en diagonale de toute façon.
Il faudrait que l'algorithme soit assez rapide quand même, je pourrais avoir à tester une bonne vingtaine d'objets par frame, 40ms dans mon cas (tous les objets dans un rayon de 15-20 cases). J'ai bien une idée, mais elle est extrêmement naïve, et je ne suis même pas sûr qu'elle soit en mesure de couvrir tous les cas.
Est-ce que ça aurait été plus simple de répondre à cette question si, au lieu d'une grille, je ne stockais qu'une liste de murs avec leurs extrêmités ? Le problème se réduirait à faire des tests d'intersection de segments dans ce cas. Sachant que, selon les niveaux, j'ai autant de passages labyrinthiques que de grandes salles. Le jeu est en 2D, pas en 3D (du moins pas vraiment), alors j'ai l'impression que ne pas le modéliser sous forme de grille compliquerait pas mal la chose (parce qu'en plus après il y a tous les tests de collision). Bref la modélisation en grille m'arrange bien et j'aimerais bien la garder.
Qu'en pensez-vous ?
Merci pour vos réponses.