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


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

Voici un schéma (je reconnais que mes talents artistiques sont ... limités):
[Image: schemas.png]

Les coordonnées écrites sont celles du coin haut gauche des bateaux.
On voit que les coordonnées du bateaux 2 sont hors du champ de vision du bateau 1, mais pourtant un bout de bateau 2 est dans le champ de vision, donc j'aimerais le récupérer pour l'afficher.
J'ai peur de devoir changer la manière de stocker les positions des unités...

Sinon, j'ai compris ta solution. OK, tu fais peu d'arrays et de boucles, mais vu le nombre d'unités et de cases ça risque d'être lourd. Mais je vais faire le test de cette méthode, et on sera fixés. Smile

Comment gérer ça?


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

Okaaaaaaaaay, je pensais que tu parlais de "guerriers" et de la taille en "Hauteur".

Donc sa devrais être facilement gérable mais les cases sont disposées comment? ainsi que le repère? Sans sa je peut pas trop t'aider mais après sa va être juste des maths. Meme beaucoup de maths.

Pour l'instant on peut déduire que le point central du bateau est égal a:
On inscrit le bateau dans un rectagle puis
$xcentre = $position_x_du_bateau-($longueur_du_bateau/2);
$ycentre = $position_y_du_bateau-($hauteur_du_bateau/2);

Je vais te préparer un schémas pour calculer le rectangle ou le bateau sera inscrit


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

Qu'entends tu par "les cases sont disposées comment?" On a un repère orthonormal (cases carrées et identiques) et chaque bateau est positionné ainsi : le coin haut gauche du bateau est confondu avec le coin haut gauche de la case correspondante.

Au niveau des maths, je peux encore y arriver, mais c'est surtout comment récupérer ça dans une requête, sans récupérer toutes les unités et les passer au crible?

Bye


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

Euuuuu, ce que je voulais dire, c'est le repère est situé ou? Haut gauche comme celui du div?
Quand tu parle de coin haut gauche tu parle de celui ou tu as marqué (1;0) ?

Euuu sinon j'ai dit une connerie, faut inscrire le bateau dans un cercle et ce cercle devra être inscrit dans le div du bateau.

Sinon pour la requête sa deviens un peut compliqué si tu veux pas les passer au crible, je pense même que c'est impossible. Tu peu en revanche un peu limiter la requête: Tu sélectionne les extrêmes des visions x_max x_min y_max y_min de tes unités puis tu effectue une requête :

Code PHP :
<?php 
$req
= mysql_query("SELECT * FROM xxxxx WHERE x BETWEEN '$x_min' AND '$x_max' AND y BETWEEN '$y_min' AND '$y_max' ORDER BY y,x");

Sa diminue largement le nombre de requête du moins quand la flotte n'est pas trop étalée


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

Oui, le repère est "inversé". En haut à gauche, on a (0;0) puis en descendant on ne vas pas dans les négatifs mais dans les positifs. Sinon, au niveau des ordonnées, on garde l'ordre normal.
Oui, le coin marqué sur mon schéma est le coin que j'utilise pour stocker les coordonnées des bateaux.

Faut que je précise une chose importante, les bateaux ne sont pas obligatoirement bien alignés sur une case : ils peuvent être orientés n'importe comment (360°) et positionnés n'importe où, ce qui donne des coordonnées du style (1,5;2,3). En fait, on essaie d'innover en se "détachant" des cases classiques.

Sinon, pour la requête, je te rappelle que le champ de vision des bateaux est rond, et non pas carré. Donc pour calculer si un bateau est dedans faut regarder si la distance entre les centres est infèrieure ou égale à la portée de la vue du navire. Le problème de cette approche, c'est que si un petit bout est dans le champ de vue, on le sélectionnera pas...

Je crois que mon problème est irrésoluble, donc je vais sûrement afficher les bateaux qu'une fois qu'ils seront entièrement dans le champ de vue. Mais j'ai toujours besoin d'aide concernant la gestion du champ de vision ROND.

Bye, et merci


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

Hum la requête que je t'ai donnée n'étais la que pour un peu épurer le résultat et de ne pas avoir a charger toute la map. Sa limite le "poids" de la requete.

Je n'ai pas réussi a résoudre mais néanmoins, j'ai quelques truc qui peuvent t'aider :

[Image: mini_100404055038386638.png]

Donc pour la taille du div du bateau c'est la diamètre du cercle vert c'est a dire la longueur du bateau.
Donc :
Code PHP :
<?php 
$divbateau
.= '<div style="top:'.$longueur_bateau.'px;left:'.$longueur_bateau.'px;">';

Ensuite les points du bateau:
-HautGauche:
Code PHP :
<?php 
$pointhg_x
= $div_x;
$pointhg_y= $div_y + ( cos(90-x)*$longueur_bateau );

-BasGauche:
Code PHP :
<?php 
$pointbg_x
=$pointhg_x + ( cos(x)*$largeur_bateau );
$pointbg_y= $pointhg_y + (cos(90-x)*$largeur_bateau );

-Hautdroite:
Symétrie centrale du point bas gauche par rapport au centre du bateau (le calcul est facile)


-Hautgauche:
Symétrie centrale du point bas droite par rapport au centre du bateau (Pareil)

Fin bon la trigo c'est pas trop mon truc ><
Sinon d'autres seront surement mieux que moi. Et ton problème a forcément une solution, pas évidente certes mais il y en a forcément une.


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

des idées en vrac, mais pas sûr que ça aide vraiment.

Vu ton besoin il me semble préférable que les coordonnées de ton bateau soit le centre du bateu et non une extrémité. Ainsi tu auras directement le "cercle" de vision (ie coordonnées + rayon) alors que là c'est plus compliqué (ie {coordonnées + moitié de la taille du bateau * la direction} + rayon)



de plus je pars de l'hypothèse que tes bateaux sont des "fils" (pas d'épaisseur, juste un "trait") Dans ce cas tu dois juste tester les deux extrémités de chaque bateau. Si une des extrémités est dans le cercle alors le bateau est visible

enfin pour restreindre les calculs avec une requête filtrée, tu ne dois tester, par rapport à ton bateau "cercle" que les bateaux qui respectent une règle de type :

distance entre le centre du bateau "cercle" et le centre du bateau "visible" < rayon de vision du bateau cercle + 0.5* taille du bateau "visible"

explication :
les centres = facile à trouver si tu prends "mes" coordonnées (un peu différente des tiennes, mais facile à updater) puisque ce sont elles même
la distance des centres = (x cercle - x bateau)^2 + (y cercle - y bateau)^2

le rayon + 0.5 * taille du bateau s'explique ainsi :
si un bateau est visible du cercle c'est qu'une de ses extrémités est a l'interieur de son rayon.
Or une extrémité est à 0.5 [taille du bateau] du centre du dit bateau.
Donc si le bateau est visible du cercle, c'est que son centre est à moins d'un rayon + 0.5 taille du bateau

attention la liste que te donne cette règle (dist < r + 0.5 t) n'est pas la liste des visibles, mais elle exclut forcément tous les bateaux trop loin, quelque soit leur "angle". C'est simplement une restriction sur laquelle tu peux faire des tests avec les cosinus sinus, etc..


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

Pour les coordonnées, tu as raison je vais changer ça. Vu que je suis toujours en réflexion, on peut modifier ce qu'on veut.
Sinon, les bateaux n'apparaissent pas comme des fils, mais peuvent peut-être s'y assimiler vu qu'ils ont une largeur de 1 case (cf mon schéma). Seule la longueur change.

Dans ce cas là, ton calcul de 0.5*taille du bateau ne fonctionne pas, puisque les angles sont plus éloignés.

Merci de tes réponses, je vais regarder ça de plus près voir si je peux adapter tes formules. Si quelqu'un a une idée pour tenir compte de l'angle dans la requête Wink

Bye


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

Sinon tu peut toujours diviser ton bateau en 3 "parties" : Arrière milieu Avant, et ces parties seront assimilées a une case chacun puis entrés dans une bdd. Le résultat ne sera pas très précis mais bien meilleur que de prendre le centre.


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

Ta solution sera fonctionnelle si les bateaux se superposaient aux cases. Hors ce n'est pas le cas... Ou alors, j'ai pas bien pigé ce que tu voulais dire Wink

Bye