JeuWeb - Crée ton jeu par navigateur
Carte, brouillard de guerre et grandes unités - 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 : Carte, brouillard de guerre et grandes unités (/showthread.php?tid=4704)

Pages : 1 2 3


Carte, brouillard de guerre et grandes unités - My Hotel - 04-04-2010

Bonjour à tous

J'aimerais avoir vos avis sur la meilleure manière de gérer mon problème :
J'ai une carte.
Les unités sont stockées avec leurs coordonnées x et y. Si elles font plus d'une case de longueur, le x et y correspondent à la première case.
On stocke la direction sur 360° pour qu'une unité (des bateaux) puisse être orientée n'importe comment.
Chaque unité à un "rayon de vue", c'est à dire qu'elle ne voit que les unités qui sont dans un cercle centré sur elle-même. C'est un classique des jeux de stratégie.

Mon souci : comment récupérer les unités qui sont entièrement dans le champ de vue (donc avec x et y dans le champ)? Et comment récupérer les unités qui sont partiellement dans le champ (mais qu'on affichera entièrement).
Sachant que les unités ne sont pas alignés sur le quadrillage, ça complique encore le truc.

J'ai pensé à quelques possibilités mais très peu pratiques ou trop lourdes.

J'espère que vous aurez plus d'inspiration que moi pour ces 2 questions Wink

Merci d'avance.

Bye


RE: Carte, brouillard de guerre et grandes unités - Aleskweb - 04-04-2010

Oula, c'est compliqué tout ça!

Perso (en gros a l'artisanal), je foutrais toute tes unités ainsi que celles adverses dans deux array avec leur vision, puis je traiterais tout avec une boucle. En revanche suivant le nombre sa risque d'être long a traiter.

Si la vision était carrée sa aurait été facile avec x_max x_min y_max et y_min tu aurais juste a traiter avec une boucle l'array de tes unités, il en ressortirai toutes les cases "vues" dans un array. Ensuite tu n'aurais plus qu'a comparer avec une autre boucle les unités adverses pour voir si elles sont dans le champ de vision, si oui *pof* tu les affiches.

Enfin bon comme je te l'ai dit c'est artisanal et surement optimisable, mais si tu arrive a avoir toutes les cases qui sont dans le champ de vision, ben tu n'a plus qu'a comparer avec l'array adverse


RE: Carte, brouillard de guerre et grandes unités - Zamentur - 04-04-2010

J'ai pas compris l'histoire des cases.
La forme des unités est elle carré ou ronde?

Car si c'est rond il te suffit de déterminer le centre de l'unité et de chercher tous les centres d'unité contenue dans le champs de vision + la moitié de la taille de l'unité

Soit:
Code PHP :
<?php 
SELECT
* FROM unit WHERE POW(x_center-%d,2)+POW(y_center-%d,2)<=POW(field_of_vision+width/2,2)
Le premier %d étant l'abscisse de l'observateur, et le second son ordonnée


RE: Carte, brouillard de guerre et grandes unités - phenix - 04-04-2010

J'avais le même souci que toi il y a longtemps, voici la discutions qui m'a offert la solution:

http://www.jeuweb.org/algorithme-dombre-t-4567.html


RE: Carte, brouillard de guerre et grandes unités - My Hotel - 04-04-2010

@Aleskweb : c'est une des solutions que j'avais imaginée, mais elle est beaucoup trop lourdes vu le nombre de cases et d'unités qu'on envisage.

@Zamentur : malheureusement, les unités sont rectangulaires ou carrés.

@phenix : je vais regarder ça, voir si ça réponds bien à mon souci. J'avais cherché pourtant, mais j'étais pas tombé dessus.
Après lecture, ça réponds pas vraiment à mon besoin. J'aimerais savoir comment récupérer les unités qui sont dans le champ de vision du personnage (même si leurs x et y sont en dehors), alors que ce sujet parle du masquage de cases.
Ou alors, j'ai peut-être pas compris comment je pouvais adapter le script donné dans ton sujet à ma situation.

Bye


RE: Carte, brouillard de guerre et grandes unités - Aleskweb - 04-04-2010

"J'aimerais savoir comment récupérer les unités qui sont dans le champ de vision du personnage (même si leurs x et y sont en dehors)" Si l'unité est dans le champ de vision c'est que les x et y sont dedans non? J'ai pas tout compris.
Sinon oui ma solution est lourde, mais je pense que dans tout les cas il te faudra passer par l'étape d'enregistrement des cases dans le champ de vision. Fin bon sa fait quand meme 3 array ( 1 pour l'équipe1 1 pour l 'équipe 2 et un pour les cases dans le champ de vision), Ainsi que trois boucles, doit y avoir un moyen d'optimiser


RE: Carte, brouillard de guerre et grandes unités - My Hotel - 04-04-2010

Non, en fait ce que j'essaye d'expliquer, c'est qu'une unité qui fait 4 cases de long, on ne va stocker que sa taille : 4 et les coordonnées de sa première case.
Donc une unité longue peut avoir une partie dans le champ, mais les coordonnées de sa première case sont en dehors.

Pourtant, j'aimerais l'afficher quand même entièrement dès qu'un petit bout est dans le champ.

Quand je parle de la lourdeur de ta solution, je fais allusion au fait de prendre toutes les unités et de vérifier si elles sont dans le champ pour chaque unité alliée. Donc si on a 10 unités, on va vérifier pour chacune des 10 unités si il n'y a rien dans le champ...

Bye


RE: Carte, brouillard de guerre et grandes unités - Aleskweb - 04-04-2010

Ah j'ai aussi ce problème d'affichage, mais moi c'est pour les batiments, ils sont associés a une case (Haut droite) donc parfois le batiment est dans le champ de vision mais ne s'affiche pas.

Sinon la methode avec les array peut marcher: ($yminperso=x $ymaxperso=x+$tailleperso). Donc ton perso est situé entre yminperso et yminperso. Si il y a une largeur tu peu faire pareil.

Pour le champ de vision, moi je te parlais pas de verifier pour chaque unité du joueur, mais simplement de calculer toutes les cases "vues" par le joueur1 et les mettre dans un array. Puis faire une boucle qui vérifie une par une si les unités du joueur2 sont dedans.

C'est lourd (quand même moins que de faire unité par unité du joueur 1) mais je vois pas trop d'autres solution.


RE: Carte, brouillard de guerre et grandes unités - My Hotel - 04-04-2010

Pour calculer les coordonnées entre lesquelles est située chaque unité, je pense qu'il va falloir de la trigo, sachant qu'on peut orienter une unité à 360°, et pas obligatoirement le long du quadrillage.
Pour le champ de vision, je ne pense pas implémenter un système ou le regard est bloqué par les obstacles.

Sinon, chaque joueur peut avoir plusieurs dizaines d'unités, qui ont chacune un champ de vision propre. Donc c'est pour ça qu'avec ta technique, on ferait des dizaines d'array de cases "vues" (1 array par unité) et des dizaines de boucles pour vérifier si une unité du J2 est dedans.
Trop lourd il me semble Wink

Donc le problème n'est pas résolu, mais merci des tes propositions.

Bye


RE: Carte, brouillard de guerre et grandes unités - Aleskweb - 04-04-2010

Oula non pas du tout. 1 Array pour le joueur 1 et un autre pour le joueur 2 et encore un pour les cases
Cela n'en fait que trois. Et quatres boucles pas plus:
-Une pour mettre toutes les unités du joueur 1 dans un array1
-Une pour mettre toutes les unités du joueur 2 dans un array2
-Une pour calculer toutes les cases "Vues" a partir de l'array1 dans un array3
-Une pour verifier si les unités du joueur 2 avec l'array2 sont dans les cases de l'array3 puis afficher les personnages

Par conséquent 3 Array 4 Boucles. Et indépendant du nombre d'unités

Je commence a reflechir a ton problème de 360°. Mais, ta vue c'est vue de haut? Car si c'est le cas il n'y aurais pas de problème, il suffirait de prendre la position du bonhomme.
Sinon, je ne comprends pas trop ce que la taille vient faire ici, les unités sont debout pas allongées donc il suffit de prendre la position des pieds du personnages. Exemple: Je suis dans la rue au pied d'un lampadaire et celui ci éclaire une zone et je ne vois rien autour de celle ci (Cela représente mon champ de vision). Si une personne est en dehors de cette zone, même si elle fait 6 mètres je ne la verrais pas, en revanche si elle est dedans et qu'elle fais 6 mètres, je vérais au moins ses pieds. Donc la taille n'influe pas
Si tu pouvais nous faire un petit schémas (Meme sous paint) On comprendrais mieux.

Ps: Désolé pour l'exemple, j'ai pas trouvé mieux ><