Se connecter avec
S'enregistrer | Connectez-vous

[résolu] PHP besoin aide développement map style travian

Dernière réponse : dans Programmation

Bonjour,

je cherche à développer, a des fins personnelles et comme exercice d'entraînement, une carte un peu comme Travian (jeu par navigateur)... J'ai réussi à développer en PHP un petit script qui développe dynamiquement une zone autour de coordonnées fournis par un autre script.

PHP:
  1. $sql = "SELECT * FROM planete WHERE pseudo = 'khalad'";
  2. $recup=mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
  3.  
  4. $fetch = mysql_fetch_assoc($recup);
  5.  
  6.  
  7. if(empty($_POST['largeur'])) { $posx = $fetch['l']; } else { $posx=$_POST['largeur']; }
  8. if(empty($_POST['hauteur'])) { $posy = $fetch['h']; } else { $posy=$_POST['hauteur']; }
  9.  
  10. $compteurX = $posx - 19;
  11. $compteurY = $posy + 14;
  12.  
  13. $finX = $posx + 19;
  14. $finY = $posy - 14;
  15.  
  16. $debutX = $posx - 19;
  17.  
  18. while($compteurY >= $finY)
  19. {
  20.  
  21. echo '<div class="ligneMap">
  22. <div class="caseMapcoorY">'.$compteurY.'</div>', "\n";
  23.  
  24.  
  25. while($compteurX <= $finX)
  26. {
  27.  
  28. if($compteurX == $fetch['l'] and $compteurY == $fetch['h'])
  29. {
  30. echo "\t\t\t\t\t\t\t", '<div class="caseMapok">1';
  31. echo '</div>', "\n";
  32. }
  33. else
  34. {
  35. if($compteurX == $_POST['largeur'] and $compteurY == $_POST['hauteur'])
  36. {
  37. echo "\t\t\t\t\t\t\t", '<div class="caseMapok2">2';
  38. echo '</div>', "\n";
  39. }
  40. else
  41. {
  42. echo "\t\t\t\t\t\t\t", '<div class="caseMap">a';
  43. echo '</div>', "\n";
  44. }
  45. }
  46. $compteurX++;
  47. }
  48.  
  49. echo "\t\t\t\t\t\t", '</div>', "\n";
  50.  
  51. $compteurX = $debutX;
  52. $compteurY--;
  53.  
  54. }
  55.  
  56.  
  57. mysql_close();





Voila alors j'ai réussi grâce a deux boucles imbriquées a développé mon quadrillage. En définissant un nombre - et + devant les coordonnées fournis j'arrive a centrer le carré dans la map histoire de montrer ou se situe l'objet. Maintenant mon problème, c'est la navigation dedans, la navigation en donnant de nouvelle coordonnées fonctionne, il m'affiche la zone, et le carré du joueur est toujours affiché s'il est dans la zone... Mais je n'arrive pas a trouver un système pour bouger la map de droit a gauche, haut bas avec des boutons allant de 2 cases en 2 cases...

autre soucis, je n'arrive pas a comprendre comment afficher l'axe X des coordonnées, j'ai trouvé pour l'axe Y...

Voila, j'espère avoir été assez clair... Je vais passer la matinée au boulot, donc je ne serais la qu'en début d'après midi. J'ai essayé d'être le plus complet possible.

Bonne journée, et merci de votre aide !
Lassé par la pub ? Créez un compte

Meilleure solution

Salut Khalad,


on a à peu prés le même script, pour faire afficher la map, j'ai créé une map que j'ai découpé en carré de 50 px par 50 px, et pour que ces images s'affichent, le nom de chaque image équivaut aux coordonnées..
Genre img_12_56.gif pour l'image d'abscisse 12 et d'ordonnée 56..
Ensuite je fais juste un background-image:url(map/...) pour l'afficher..

Par contre, je ne sais pas comment créer les contraintes de déplacements.. ( les plages, l'eau, les arbres... )

Si t'as besoin d'aide, n'hésite pas ;-)

En fait si tu veux que quelqu'un t'aide il faudrait nous donner des précisions comme le début et la fin de ton PHP parce que je me demande si tu nous as donner le début ou seulement une partie et j'avoue ne pas trop avoir envie de me plonger dedans sans tout savoir de tes variables et tout, enfin... c'est pas simple!
Mais je veux bien t'aider sinon!
:na: 
(pour la map j'ai une idée...)

désolé !! j'avais complètement oublié que j'avais posté sur ce forum :sweat: 

J'ai trouvé entre temps comment faire, j'ai repris le code en entier en me creusant la tête j'y suis arrivé. Mais merci quand même de ton aide !

Bonjour khalad !
Je tente moi-même de mettre au point une map dont le fonctionnement sera similaire à celle citée plus haut, et la solution à ton problème pourrait bien m'éclairer grandement...

Pourrais-tu donner la solution que tu as trouvée à ce sujet ?

Je t'en remercie d'avance.

et bien en fait, le principe si tu veux, c'est d'imbriquer deux boucles while l'une dans l'autre pour arriver a produire des cases de la map.

la carte est construire autour des coordonnées que tu va créer aléatoirement. Il ne faut pas penser que la carte est déjà créée, mais elle est générée en fonction des coordonnées. Ca donne l'impression d'une carte gigantesque, mais PHP calcule enfait à la volée la zone.

Après pour les boutons de déplacement, tu dois en fait créer des boutons qui indiquent ensuite dans le code selon la direction si tu te déplace de tel nombre de case vers tel nombre de case. L'astuce que j'ai trouvé c'est de travailler avec les $_SESSION. Tu enregistre le bouton de direction, tu prend la dernière coordonnée mise a jour par le dernier calcul de direction et tu lui rajoute a nouveau le nombre de case a déplacer.

En pratique ca donne :

pour les coordonnées :

  1. if(isset($_POST['haut']))
  2. {
  3. if(empty($_SESSION['pos_y']))
  4. {
  5. $_SESSION['pos_y'] = $fetch['h'] + 3;
  6. $posy = $_SESSION['pos_y'];
  7. if(empty($_SESSION['pos_x']))
  8. {
  9. $posx = $fetch['l'];
  10. }
  11. else
  12. {
  13. $posx = $_SESSION['pos_x'];
  14. }
  15. }
  16. else
  17. {
  18. $posy = $_SESSION['pos_y'] + 3;
  19. if(empty($_SESSION['pos_x']))
  20. {
  21. $posx = $fetch['l'];
  22. }
  23. else
  24. {
  25. $posx = $_SESSION['pos_x'];
  26. }
  27. $_SESSION['pos_y'] = $posy ;
  28.  
  29. }
  30. }
  31. elseif(isset($_POST['bas']))
  32. {
  33. if(empty($_SESSION['pos_y']))
  34. {
  35. $_SESSION['pos_y'] = $fetch['h'] - 3;
  36. $posy = $_SESSION['pos_y'];
  37. if(empty($_SESSION['pos_x']))
  38. {
  39. $posx = $fetch['l'];
  40. }
  41. else
  42. {
  43. $posx = $_SESSION['pos_x'];
  44. }
  45. }
  46. else
  47. {
  48. $posy = $_SESSION['pos_y'] - 3;
  49. if(empty($_SESSION['pos_x']))
  50. {
  51. $posx = $fetch['l'];
  52. }
  53. else
  54. {
  55. $posx = $_SESSION['pos_x'];
  56. }
  57. $_SESSION['pos_y'] = $posy ;
  58. }
  59. }
  60. elseif(isset($_POST['gauche']))
  61. {
  62. if(empty($_SESSION['pos_x']))
  63. {
  64. $_SESSION['pos_x'] = $fetch['l'] - 3;
  65. $posx = $_SESSION['pos_x'];
  66. if(empty($_SESSION['pos_y']))
  67. {
  68. $posy = $fetch['h'];
  69. }
  70. else
  71. {
  72. $posy = $_SESSION['pos_y'];
  73. }
  74. }
  75. else
  76. {
  77. $posx = $_SESSION['pos_x'] - 3;
  78. if(empty($_SESSION['pos_y']))
  79. {
  80. $posy = $fetch['h'];
  81. }
  82. else
  83. {
  84. $posy = $_SESSION['pos_y'];
  85. }
  86. $_SESSION['pos_x'] = $posx ;
  87. }
  88. }
  89. elseif(isset($_POST['droite']))
  90. {
  91. if(empty($_SESSION['pos_x']))
  92. {
  93. $_SESSION['pos_x'] = $fetch['l'] + 3;
  94. $posx = $_SESSION['pos_x'];
  95. if(empty($_SESSION['pos_y']))
  96. {
  97. $posy = $fetch['h'];
  98. }
  99. else
  100. {
  101. $posy = $_SESSION['pos_y'];
  102. }
  103. }
  104. else
  105. {
  106. $posx = $_SESSION['pos_x'] + 3;
  107. if(empty($_SESSION['pos_y']))
  108. {
  109. $posy = $fetch['h'];
  110. }
  111. else
  112. {
  113. $posy = $_SESSION['pos_y'];
  114. }
  115. $_SESSION['pos_x'] = $posx ;
  116. }
  117. }
  118. else // si les boutons n'ont pas été utilisés, on utilise alors le système de coordonnées ciblés.
  119. {
  120. if(empty($_POST['largeur'])) { $posx = $fetch['l']; } else { $posx=$_POST['largeur']; }
  121. if(empty($_POST['hauteur'])) { $posy = $fetch['h']; } else { $posy=$_POST['hauteur']; }
  122. }


et ensuite pour afficher la map en elle meme :

  1. $compteurX = $posx - 4;
  2. $compteurX2 = $posx - 4;
  3. $compteurY = $posy + 3;
  4.  
  5. $finX = $posx + 4;
  6. $finX2 = $posx + 4;
  7. $finY = $posy - 3;
  8.  
  9. $debutX = $posx - 4;
  10.  
  11.  
  12. echo'<div id="ligneMapX">';
  13.  
  14. while($finX2 >= $compteurX2) {
  15. echo'<div id="caseMapcoorX">'.$finX2.'</div>';
  16. $finX2--;
  17. }
  18. $compteurX2 = $debutX;
  19. echo'</div>';
  20.  
  21. while($compteurY >= $finY) {
  22.  
  23.  
  24. echo '<div id="ligneMap">
  25. <div id="caseMapcoorY">'.$compteurY.'</div>', "\n";
  26.  
  27.  
  28. while($compteurX <= $finX) {
  29. if($compteurX == $fetch['l'] and $compteurY == $fetch['h'])
  30. {
  31. echo "\t\t\t\t\t\t\t", '<div id="caseMapok">1';
  32. echo '</div>', "\n";
  33. }
  34. else
  35. {
  36. if($compteurX == $posx and $compteurY == $posy)
  37. {
  38. echo "\t\t\t\t\t\t\t", '<div id="caseMapok2">2';
  39. echo '</div>', "\n";
  40. }
  41. else
  42. {
  43. echo "\t\t\t\t\t\t\t", '<div id="caseMap">a';
  44. echo '</div>', "\n";
  45. }
  46. }
  47.  
  48. $compteurX++;
  49. }
  50.  
  51. echo "\t\t\t\t\t\t", '</div>', "\n";
  52.  
  53. $compteurX = $debutX;
  54. $compteurY--;
  55.  
  56. }
  57.  
  58.  
  59. mysql_close();


voila, si jamais il y a d'autres questions : xxxxxxxxxxxxxxxxxxxxxxx@gmail.com, ca ira plus rapidement. Je ne prétend pas que cela soit la méthode ultime hein, mais c'est une technique pas trop lourde que j'ai trouvé a force de tâtonner...



[:zeb:6]
Pas de mail, stp. Ce site est un forum, pas un site de mise en relation : Les questions et les réponses au même endroit !

Hello Metafury

Et bien pour ma part, il y a une table que j'ai associé avec celle des planètes qui contient les éléments contraintes. Lors de l'inscription le générateur aléatoire de coordonnées vérifie si ces coordonnées crées n'existent pas déjà dans les objets du décors et s'ils n'existent pas les fournissent pour la planète, sinon il en crée des nouveaux.

Via mon panneau d'administration, je met tout mes rochers, mes astéroïdes etc, avec leur coordonnées et la carte me les affiche a leur emplacement

au niveau technique, j'ai deux tables distinctes que je lie via un LEFT JOIN (ou RIGHT JOIN selon le besoin)... Et ça marche parfaitement, après j'ai lié toute mes tables pour n'avoir qu'une requête et optimiser le chargement de page.

Salut Khalad,

je pensais passer par un fichier xml décrivant chaque coordonnées, ou chaque type de "terrain" / "case"..
Et mettre un peu d'ajax pour limiter les appels au serveur sql ( postgresql )..
Je viens de trouver comment s'appelait ces petits carrés utilisé dans les rpg, ce sont des charset ( persos ) ou des chipset ( décor )..


Bon courage,

Nils
Lassé par la pub ? Créez un compte