3 problèmes: 3 sujets (mais c'est avant de lire le message, je changerai peut-être d'avis après); et 3 solutions!
1) Le bouton envoyer a beau ne pas apparaitre, si la vérification ne se fait pas aussi coté serveur, les tricheurs traverseront les murs. La vérification du droit d'une action (ou "la question 'Est-ce que le client/joueur a le droit de faire ceci/cela?'") doit se faire coté serveur. Le masquage du bouton est un élément d'interface, pratique, qui permet à l'utilisateur de savoir qu'il n'a pas le droit de faire l'action, mais seul le serveur doit la lui autoriser (si je triche et que j'affiche le bouton quand même, ce qui est toujours possible car l'UI est totalement hors de ton contrôle et totalement sous mon contrôle en tant que visiteur de site, je ne dois alors pas pouvoir faire l'action).
2) Fixe un vecteur de direction d'observation [Xo, Yo], ainsi qu'un vecteur de position relative du point à scanner [Xs,Ys]. Le point à scanner est dans l'angle ∠±90° si et seulement si le produit scalaire des deux vecteurs est positif:
Il faudrait alors faire ce test sur chaque point pour savoir s'il est visible (test à faire coté serveur, pour la même raison qu'en 1: si je change ton javascript, ce qui est toujours faisable, je peux faire un test qui renvoie toujours "vrai" et afficher tous les joueurs). Tu peux également ajouter un test de distance si besoin.
Si l'angle de 180° change (au lieu de ±90°, tu choisis par exemple -45°..+60°) alors il faudra modifier un peu le code...
3) Tu peux sauver soit les formes géométriques dans la BDD (MySQL offre des typages pour les données géométriques), soit utiliser une approche "minecraft", en considérant que chaque pixel peut être un point d'obstacle ou non. En ce second cas, le stockage peut vite être énorme, et requérir de simples mais nombreux calculs.
Tous les calculs de visibilités étant à faire coté serveur, je te conseillerai d'utiliser MySQL, en stockant des formes géométriques dans la BDD et en utilisant les fonctions géométriques que le SGDB fournit. Tu pourras alors chercher des intersections entre une droite (le tir) et les obstacles (voir même, les obstacles+le joueur pour détecter si le joueur ennemi est touché).
1) Le bouton envoyer a beau ne pas apparaitre, si la vérification ne se fait pas aussi coté serveur, les tricheurs traverseront les murs. La vérification du droit d'une action (ou "la question 'Est-ce que le client/joueur a le droit de faire ceci/cela?'") doit se faire coté serveur. Le masquage du bouton est un élément d'interface, pratique, qui permet à l'utilisateur de savoir qu'il n'a pas le droit de faire l'action, mais seul le serveur doit la lui autoriser (si je triche et que j'affiche le bouton quand même, ce qui est toujours possible car l'UI est totalement hors de ton contrôle et totalement sous mon contrôle en tant que visiteur de site, je ne dois alors pas pouvoir faire l'action).
2) Fixe un vecteur de direction d'observation [Xo, Yo], ainsi qu'un vecteur de position relative du point à scanner [Xs,Ys]. Le point à scanner est dans l'angle ∠±90° si et seulement si le produit scalaire des deux vecteurs est positif:
Code :
EstDansLaZoneVisible = ((Xo*Xs)+(Yo*Ys))≥0
Il faudrait alors faire ce test sur chaque point pour savoir s'il est visible (test à faire coté serveur, pour la même raison qu'en 1: si je change ton javascript, ce qui est toujours faisable, je peux faire un test qui renvoie toujours "vrai" et afficher tous les joueurs). Tu peux également ajouter un test de distance si besoin.
Si l'angle de 180° change (au lieu de ±90°, tu choisis par exemple -45°..+60°) alors il faudra modifier un peu le code...
3) Tu peux sauver soit les formes géométriques dans la BDD (MySQL offre des typages pour les données géométriques), soit utiliser une approche "minecraft", en considérant que chaque pixel peut être un point d'obstacle ou non. En ce second cas, le stockage peut vite être énorme, et requérir de simples mais nombreux calculs.
Tous les calculs de visibilités étant à faire coté serveur, je te conseillerai d'utiliser MySQL, en stockant des formes géométriques dans la BDD et en utilisant les fonctions géométriques que le SGDB fournit. Tu pourras alors chercher des intersections entre une droite (le tir) et les obstacles (voir même, les obstacles+le joueur pour détecter si le joueur ennemi est touché).