Gérer des déplacements pour un jeu en PHP

Gérer des déplacements pour un jeu en PHP - PHP - Programmation

Marsh Posté le 26-08-2004 à 23:27:13    

Bonsoir !
Je voudrais faire un jeu PHP sur le thème du seigneur des anneaux, et lors de mes recherches je suis tombé sur ce site :
 
http://enefel.le.jeu.free.fr/carte.php?id_match=272
 
et je trouve ca vraiment excellent.
J'ai essayé cette apresmidi de trouver comment il fait, mais j'avoue que je coince :
 
Pour l'instant ma page d'index positionne les joueurs sur les différents <div>, selon leurs coordonnées entrées dans la base de données .
 
Par contre problème de taille :
Comment faire pour que le joueur qui est loggué sous tel pseudo puisse bouger son bonhomme dans les 8 cases adjacentes (en cliquant dessus) et pas dans les autres cases ?
 
En gros, il faudrait que les 8 cases (ou moins s'il est contre un bord) autour du bonhomme soit cliquable avec un lien du style :
<a href="deplacement.php?joueur=machin&coord=X-Y" > avec les coordonnées de la nouvelle case à la place de X-Y.
Par contre toutes les autres cases ne seraient pas cliquables.
 
C'est un peu chaud nan ?
Ou alors je me complique la vie pour rien ?  :??:  
 
Merci d'avance de m'aider  :bounce:

Reply

Marsh Posté le 26-08-2004 à 23:27:13   

Reply

Marsh Posté le 26-08-2004 à 23:53:59    

perso j'aurais fais un tableau et chaque case du tableau correspond a une coordonnée X-Y qui serait enregistrer dans un variable de type array.

Reply

Marsh Posté le 27-08-2004 à 00:00:26    

euh...
ouais, mais je vois pas trop comment faire...
voici mon code :
 

Code :
  1. <?
  2. $req = mysql_query("SELECT * FROM xxxx ORDER BY id DESC " );
  3. $Login="Pingu";
  4. $c=0;
  5. while($result=mysql_fetch_array($req)) {
  6. $id[$c]=$result['id'];
  7. $coord[$c]=$result['coord'];
  8. $icone[$c]=$result['icone'];
  9. $login[$c]=$result['Login'];
  10. $c++;
  11. }
  12. for($y=0;$y<=15;$y++)
  13. {
  14. for($x=0;$x<=30;$x++)
  15. {
  16.  echo '<div class="fond_terrain">';
  17.  for($a=0;$a<$c;$a++)
  18.  {
  19.   if($y.$x === $coord[$a]) {
  20.    echo '<a href="popup.php?player='.$id[$a].'" onClick="window.open(\'\',\'popup\',\'width=400,height=300,scrollbars=0\')" target="popup">';
  21.    echo '<img src="';
  22.    if($Login == $login[$a]) {
  23.     echo $icone[$a].'_tour';
  24.    }
  25.    else {
  26.     echo $icone[$a];
  27.    }
  28.    echo '.gif" title="'.$login[$a].'" alt="'.$login[$a].'"/></a>';
  29.   }
  30.  }
  31.  echo "&nbsp</div>";
  32. }
  33. echo '<br style="clear:both;" />';
  34. }
  35. mysql_close();
  36. ?>


 
parce que si je met dans un tableau, comment faire pour que seule les 8 cases autour du bonhomme soit cliquables ?
Et comment faire comprendre à PHP les coordonnées exactes de la case ?
 
j'avoue que je rame...


Message édité par Mister_Pingouin le 27-08-2004 à 00:02:24
Reply

Marsh Posté le 27-08-2004 à 00:06:51    

tu génère un tableau html dynamiquement a partir des information que tu lui donne. A chaque fois qu'il va générer tu poses la question "quoi doit etre à l'interieur" il y aura forcement un concordence entre la position de cette case et le personnage qui doit y etre.

Reply

Marsh Posté le 27-08-2004 à 00:07:50    

soit $posx l'abcisse du joueur et $posy l'ordonnée, tu fait un test
 

Code :
  1. if( (abs($posx-$x)<=1) && (abs($posy-$y)<=1) )
  2. {
  3. echo '<a href="pouet">Bouger</a>';
  4. }
  5. else
  6. {
  7. echo 'pas bouger';
  8. }


Message édité par Ayuget le 27-08-2004 à 00:08:26
Reply

Marsh Posté le 27-08-2004 à 00:16:09    

oki les gars je vais tester ca demain =)
merci encore ! ;)
 
EDIT : ca marche vs etes les meilleurs :)


Message édité par Mister_Pingouin le 27-08-2004 à 00:39:24
Reply

Marsh Posté le 27-08-2004 à 17:06:41    

Ok, par contre maintenant j'ai un nouveau probleme :/
 
Comment faire pour que si l'image d'un autre joueur soit dans les 8 cases adjacentes, le lien ne s'affiche pas ?
Parce que jusque la, le lien s'affiche au dessus de l'image, donc le joueur peut se superposer à un autre personnage :/
 
voici mon code :

Code :
  1. <?
  2. $Login = "Pingu";
  3. $c=0;
  4. while($result=mysql_fetch_array($req)) {
  5. $id[$c]=$result['id'];
  6. $coordx[$c]=$result['coordx'];
  7. $coordy[$c]=$result['coordy'];
  8. $icone[$c]=$result['icone'];
  9. $login[$c]=$result['Login'];
  10. $c++;
  11. }
  12. for($y=0;$y<=3;$y++)
  13. {
  14. for($x=0;$x<=3;$x++)
  15. {
  16.  echo '<div class="fond_terrain">'."\n";
  17.  for($a=0;$a<$c;$a++)
  18.  {
  19.   $case='';
  20.   if($y.$x === $coordy[$a].$coordx[$a]) {
  21.    $case.='<a href="popup.php?player='.$id[$a].'" onClick="window.open(\'\',\'popup\',\'width=400,height=300,scrollbars=0\')" target="popup">';
  22.    $case.='<img src="';
  23.    if($Login == $login[$a]) { $case.=$icone[$a].'_tour'; }
  24.    else { $case.=$icone[$a]; }
  25.    $case.='.gif" title="'.$login[$a].'" alt="'.$login[$a].'"/></a>';
  26.   }
  27.   if((abs($coordx[$a]-$x) <= 1) && (abs($coordy[$a]-$y) <= 1) &&(abs($coordx[$a]-$x)+abs($coordy[$a]-$y) !==0) && ($login[$a]==$Login))
  28.   {
  29.    $case.='<a href="move.php?cx='.$x.'&amp;cy='.$y.'">ici</a>';
  30.   }
  31.   echo $case; // c'est ici que ca coince : lors du premier passage de la boucle, l'image d'un joueur s'affiche, et lors du 2e passage, un lien se pose au dessus :/
  32.  }
  33.  echo "\n</div>\n";
  34. }
  35. echo '<br style="clear:both;" />';
  36. }
  37. mysql_close();
  38. ?>


Message édité par Mister_Pingouin le 27-08-2004 à 17:07:09
Reply

Marsh Posté le 27-08-2004 à 20:01:39    

Tu peux aussi faire un truc tout con, c'est un tableau à côté de ta map qui propose les huit directions choisissable via un bouton radio ou une image cliquable. Suffit de mettre ou non le bouton/image sous réserve que la case est atteignable ou non, pour ca tu rajoutes sur ta case un attribut qui la rend atteignable (si t'as un arbre sur ta case, elle sera pas atteignable par exemple :) ) + test si y'a un perso sur la case (si t'autorise plusieurs perso par case pas besoin du test) + test sur la coordonnée (si en dehors de la map alors inatteignable). J'espère avoir été assez clair :)
 
Ca évite de surcharger ta map avec un div cliquable et je trouve ca plus clair.
Et tu peux répéter ce principe si tu utilise l'orientation du perso sauf que la tu poses toutes les orientations possibles, pas besoin d'en empêcher.
 
Bonne chance pour la suite de ton jeu ;)


Message édité par mejero le 27-08-2004 à 20:02:58
Reply

Marsh Posté le 27-08-2004 à 20:12:31    

excellente idée :)
je vais m'y mettre..
 
par contre, ca va peut etre paraitre stupide, mais je ne vois pas du tout comment tester si une case est vide ou occupée (par un joueur,arbre,etc...)

Reply

Marsh Posté le 27-08-2004 à 21:42:13    

Comment tu dessines ta carte ? comment tu sais dans quelle case se trouve chaque perso ?
 

Citation :

$id[$c]=$result['id'];  
     $coordx[$c]=$result['coordx'];  
     $coordy[$c]=$result['coordy'];  
     $icone[$c]=$result['icone'];  
     $login[$c]=$result['Login'];  


Je suppose que la dedans tu sais pour chaque coordonnées quel est le pseudo présent (en passant, c'est mieux de travailler avec des id que des pseudos pour des raisons de sécurité entres autres, si pseudo représente bien un perso). Si c'est pas ca, bah expliques voir comment tu sais qui se trouve ou :)

Reply

Marsh Posté le 27-08-2004 à 21:42:13   

Reply

Marsh Posté le 27-08-2004 à 22:22:05    

ba en fait, regarde mon code, je trace d'abord la premiere ligne d'ordonnée 0, ensuite je trace 30 case dans cette ligne, puis la ligne d'ordonnée 1 etc...
 
A chaque case tracée, je vérifie que le couple de coordonnée existe pour un membre. Si il existe alors on place <img src> sinon on continue de tracer.

Reply

Marsh Posté le 27-08-2004 à 23:47:52    

ok, j'ai trouvé maintenant ca marche
 
par contre, comment faire pour que dans une boucle le nombre de départ soit 00 puis 01, 02, etc ...
Pareil lors de l'insertion ds Mysql (le 02 devient 2)
 
J'ai essayé avec :

Code :
  1. if($coord_x<=9) $coord_x = '0'.$coord_x;


mais ca fait tout bugué au niveau du placement des persos.
Si j'enlève les guillemets autour du 0, ca me met un message d'erreur :/

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed