JeuWeb - Crée ton jeu par navigateur
Géométrie² : Angle+Points+Droites ! - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Géométrie² : Angle+Points+Droites ! (/showthread.php?tid=7136)



Géométrie² : Angle+Points+Droites ! - Soleo - 28-08-2014

Bonjour, bonsoir, re, désolé du titre pas trop explicite, c'est que je vais poser 3 problème différents.

Contexte : J'ai donc une mini map en Canvas avec la position des joueurs (x,y) , ces joueurs sont supposés avoir une orientation, et la map est supposée contenir des obstacles.

Voici le stade actuel de cette map
Cette version ne contient donc ni les orientations des personnages, ni les obstacles, mais admettons qu'un joueur essaye de passer un obstacle, le bouton "envoyer" n’apparaîtrait pas.

1) Champ de vision d'un joueur :

Pour faire simple un joueur peut voir les joueurs ennemis si ils se trouvent dans un angle de 180° par rapport à son orientation. Si ce n'est pas le cas, le point n’apparaît pas sur la map, et la distance entre eux devient "Inconnue".
Pour ce premier problème, y a t'il donc un moyen de faire un balayage de tous les points contenus dans un angle ? Ou bien dois-je me servir d'un calcul provenant d'un autre monde en utilisant des équations de droites ?

2) Obstacle sur la map :

Deuxième problème, les obstacles, il s'agirait de mur / piliers / rochers répartis sur la map, représentés par des formes simples. Le soucis étant que je ne sais pas trop comment représenter cela dans une base de donnée. Dois-je faire une liste de tous les points étant compté comme "obstacle", ou bien les coordonnées d'une droite+épaisseur pour les murs, car les obstacles sont ici pour dire "Tu ne peux pas tirer ta boule de feu car ton ennemi est derrière ce mur", ça m'a simplement l'air très chaotique de trouver un calcul permettant de savoir si un angle à partir d'un point voit un si autre point est compris dans cet angle et qu'il n'y a pas de droites / points entre les deux...


RE: Géométrie² : Angle+Points+Droites ! - Xenos - 28-08-2014

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:
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é).


RE: Géométrie² : Angle+Points+Droites ! - Soleo - 28-08-2014

Oui évidement je fais également les vérifications ensuite via ajax après l'envoi ! Là je ne m'occupe que de la map détachée du moteur de jeu, je l'implanterai une fois fonctionnelle sur ce site de test.

Hmm j'ai besoin de faire ceci sur chaque point ? Le truc c'est que les joueurs voient la map constamment qu'importe leur champ de vision, on suppose que les élément immobiles sont mémorisés par les personnages, il n'y a vraiment que les joueurs qui sont à scanner. (A moins que j'ai du me perdre dans ta phrase.)

J'utilise actuellement MySQL mais j'ignorais jusqu'alors qu'on pouvait y stocker des formes géométriques ! Je vais voir pour apprendre ce dont j'ai besoin.

Merci de venir en aide à mes faibles compétences en géométrie/maths !