08-14-2006, 01:59 AM
Carlou a écrit :Donc voici ma méthode pour une map.
Je propose tout d'abord l'affichage simple de la map, ensuite la gestion des déplacements et des collisions et enfin les détections des attaques.
mais tout d'abord, la map:
D'abord la base, définition des paramètres de la BdD et aller chercher les informations de votre personnage.
Code PHPrequire "conf.php3"; mysql_connect("$sql_serveur","$sql_login","$sql_pass"); mysql_select_db("$sql_bdd"); $pseudo_joueur = "votre_pseudo"; //on viens chercher la position du joueur $requete = mysql_query( "SELECT avatar_joueur, posx, posy FROM membre WHERE `pseudo`='$pseudo_joueur' "); $sql = mysql_fetch_array ($requete); $posx = $sql['posx']; $posy = $sql['posy']; $avatar_joueur = $sql['avatar_joueur'];
Ensuite on définit la taille de la map à afficher
Code PHP//Définition de la map $taille = 5;// ici 5 cases autour du joueur (soit une map de 11*11) $x_debut=$posx-$taille;//5 cases a gauche du joueur $x_fin=$posx+$taille;//5 cases a droite du joueur $y_debut=$posy-$taille;//5 cases au dessus du joueur $y_fin=$posy+$taille; //5 cases au dessous du joueur
On va chercher les autres joueurs et les bâtiments qui sont dans votre périmètre et on les mets dans un tableau.
Code PHP/* Vérification de la présence des autres joueurs : on va chercher les joueurs qui sont dans le périmètre défini précédemment. */ $sq2 = 'SELECT avatar_joueur,posx, posy FROM membre WHERE posx between '.$x_debut.' and '.$x_fin.' AND posy between '.$y_debut.' and '.$y_fin.' ORDER BY posx DESC, posy DESC' ; $req = mysql_query($sq2) or die(mysql_error()); while ($data = mysql_fetch_array($req)) { if (empty($TabMAP[$data['posx']][$data['posy']])) $TabMAP[$data['posx']][$data['posy']] = $data['avatar_joueur']; } mysql_free_result($req); /* Vérification de la présence des bâtiments : on va chercher les bâtiments qui sont dans le périmètre défini précédemment. */ $sql = mysql_query( 'SELECT type_batiment, posx, posy FROM batiments WHERE posx between '.$x_debut.' and '.$x_fin.' AND posy between '.$y_debut.' and '.$y_fin.' ORDER BY posx DESC,posy DESC' ) or die(mysql_error()); while ($data = mysql_fetch_array($sql)) { if (empty($TabMAP2[$data['posx']][$data['posy']])) $TabMAP2[$data['posx']][$data['posy']] = $data['type_batiment']; } mysql_free_result($sql);
On va enfin afficher la map ligne par ligne en affichant les coordonnées x, y et en faisant des vérifications case par case :
Code PHP//affichage de la carte echo '<table border="1" cellspacing="0" cellpadding="0">'."\n"; echo '<tbody>'."\n"; echo '<tr><td> x y</td>'."\n"; //on affiche les positions x sur la premiere ligne for($x=$x_debut;$x<=$x_fin;$x++) echo '<td align="center" valign="middle" width="40">'.$x.'</td>'."\n"; //on affiche lignes par lignes la position y, les autres joueurs et les batiments for ($y=$y_debut;$y<=$y_fin;$y++) { echo'<tr ><td align="center" valign="middle" height="40">-'.$y.'</td>'."\n";//affichage de la position for($x=$x_debut;$x<=$x_fin;$x++) {// pour chaque lignes if($x==$posx && $y==$posy)//si on est sur la position du joueur echo '<td><img src='.$avatar_joueur.'.png></td>';//on affiche l'avatar de votre perso else if(!empty($TabMAP[$x][$y]))//si on tombe sur un autre joueur echo '<td><img src='.$TabMAP[$x][$y].'.png></td>';//on affiche l'avatar du joueur else if(!empty($TabMAP2[$x][$y]))//si on tombe sur un batiment echo '<td><img src='.$TabMAP2[$x][$y].'.png></td>';//on affiche l'image du batiment else echo '<td><img src="blank.png"></td>';//si il n'y a rien... } echo '</tr>';//on ferme la ligne et on passe a la ligne suivate } echo '</tbody></table>';//on ferme la table
On va maintenant se déplacer. Le formulaire a 8 directions:
Code PHP<form action="deplacements.php" method="post"> <div align="center"> <table width="120" border="0" cellspacing="0" cellpadding="0" align="center" height="120"> <tbody> <tr> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="NO"></td> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="N"></td> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="NE"></td> </tr> <tr> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="O"></td> <td align="center" valign="middle" width="40" height="40"> <img src="Rose_des_vents.png" alt="" height="40" width="40" align="absmiddle"> </td> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="E"></td> </tr> <tr> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="SO"></td> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="S"></td> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="SE"></td> </tr> </tbody> </table> </div> </form>
On va maintenant voir si on peut se déplacer ou pas.
On définit d'abord les directions suivant ou on veut aller:
Code PHP//Gestion des flèches de déplacement if (isset($_POST['DIR'])) { // définitions des directions switch ($_POST['DIR']){ case "NO": $dirx = $posx-1; $diry = $posy-1; break; case "N": $dirx = $posx; $diry = $posy-1; break; case "NE": $dirx = $posx+1; $diry = $posy-1; break; case "SO": $dirx = $posx-1; $diry = $posy+1; break; case "S": $dirx = $posx; $diry = $posy+1; break; case "SE": $dirx = $posx+1; $diry = $posy+1; break; case "E": $dirx = $posx+1; $diry = $posy; break; case "O": $dirx = $posx-1; $diry = $posy; break; }
On viens ensuite vérifier qu'il n'y a pas de joueurs sur cette case:
Code PHP// Vérification de la présence des bâtiments $sql = mysql_query( 'SELECT batiment, posx, posy FROM batiment WHERE posx='.$dirx.' AND posy='.$diry ) or die(mysql_error()); while ($data = mysql_fetch_array($sql)) { if (empty($TabMAP[$data['posx']][$data['posy']])) $TabMAP[$data['posx']][$data['posy']] = $data['batiment']; } mysql_free_result($sql); // Vérification de la présence des autres joueurs $sq2 = mysql_query('SELECT pseudo,posx, posy FROM membre WHERE posx='.$dirx.' AND posy='.$diry.' ') or die(mysql_error()); while ($data = mysql_fetch_array($sq2)) { if (empty($TabMAP2[$data['posx']][$data['posy']])) $TabMAP2[$data['posx']][$data['posy']] = $data['pseudo']; } mysql_free_result($sq2);
On viens tester si il y a quelqu'un ou pas :
Si oui, on ne bouge pas ;
Si non, on change de position et on met à jour la base de données.
Code PHPif(!empty($TabMAP[$dirx][$diry]) or !empty($TabMAP2[$dirx][$diry]))// si on détecte un autre joueur ou un bâtiment { //on se déplace pas echo '<div align="center"><font color=#ff0000>Vous ne pouvez pas vous placer ici!!</font>'."\n"; } else {//si c'est vide //on change de direction $posx = $dirx; $posy = $diry; //et on update sa position dans la table mysql_query( "UPDATE membre SET posx = '$posx', posy = '$posy' WHERE pseudo = '$pseudo_joueur'" ) or die (mysql_error()); } }
On va enfin définir les bords de la map pour ne pas aller en dehors.
Code PHP$i=6;//6 cases avant débordement en haut et a gauche $j=1; $k=245;//6 cases avant débordement en bas et a droite while ($i >=1 and $j<=6 and $k<=250){ if ($posx == $i) {$x_debut = $posx-$taille+$j;$x_fin = $x_fin+$j;} if ($posy == $i) {$y_debut = $posy-$taille+$j;$y_fin = $y_fin+$j;} if ($posx == $k) {$x_fin = $x_fin-$j;$x_debut = $x_debut-$j;} if ($posy == $k) {$y_fin = $y_fin-$j;$y_debut = $y_debut-$j;} $j++; $i--; $k++; }
Et voilà !! Au complet et dans le bon ordre, cela nous donne :
Code PHP<? require "conf.php3"; mysql_connect("$sql_serveur","$sql_login","$sql_pass"); mysql_select_db("$sql_bdd"); $pseudo_joueur = "votre_pseudo"; //on viens chercher la position du joueur $requete = mysql_query( "SELECT avatar_joueur, posx, posy FROM membre WHERE `pseudo`='$pseudo_joueur'" ); $sql = mysql_fetch_array ($requete); $posx = $sql['posx']; $posy = $sql['posy']; $avatar_joueur = $sql['avatar_joueur']; //Gestion des fleches de déplacement if (isset($_POST['DIR'])) { //définitions des directions switch ($_POST['DIR']){ case "NO": $dirx = $posx-1; $diry = $posy-1; break; case "N": $dirx = $posx; $diry = $posy-1; break; case "NE": $dirx = $posx+1; $diry = $posy-1; break; case "SO": $dirx = $posx-1; $diry = $posy+1; break; case "S": $dirx = $posx; $diry = $posy+1; break; case "SE": $dirx = $posx+1; $diry = $posy+1; break; case "E": $dirx = $posx+1; $diry = $posy; break; case "O": $dirx = $posx-1; $diry = $posy; break; } // Vérification de la présence des bâtiments $sql = mysql_query( 'SELECT batiment, posx, posy FROM batiment WHERE posx='.$dirx.' AND posy='.$diry ) or die(mysql_error()); while ($data = mysql_fetch_array($sql)) { if (empty($TabMAP[$data['posx']][$data['posy']])) $TabMAP[$data['posx']][$data['posy']] = $data['batiment']; } mysql_free_result($sql); // Vérification de la présence des autres joueurs $sq2 = mysql_query( 'SELECT pseudo,posx, posy FROM membre WHERE posx='.$dirx.' AND posy='.$diry ) or die(mysql_error()); while ($data = mysql_fetch_array($sq2)) { if (empty($TabMAP2[$data['posx']][$data['posy']])) $TabMAP2[$data['posx']][$data['posy']] = $data['pseudo']; } mysql_free_result($sq2); // si on détecte un autre joueur ou un bâtiment ou un bord de carte if(!empty($TabMAP[$dirx][$diry]) or !empty($TabMAP2[$dirx][$diry]) or $dirx==0 or $diry==0 or $dirx==251 or $diry==251) { echo '<div align="center"><font color=#ff0000>Vous ne pouvez pas vous placer ici!!</font>'."\n";//on se déplace pas } else {//si c'est vide //on change de direction $posx = $dirx; $posy = $diry; //et on update sa position dans la table mysql_query("UPDATE membre Set posx='$posx', posy='$posy' WHERE `pseudo`='$pseudo_joueur'") or die (mysql_error()); } } // Définition de la map $taille = 5;// ici 5 cases autour du joueur (soit une map de 11*11) $x_debut=$posx-$taille;//5 cases a gauche du joueur $x_fin=$posx+$taille;//5 cases a droite du joueur $y_debut=$posy-$taille;//5 cases au dessus du joueur $y_fin=$posy+$taille; //5 cases au dessous du joueur //définition des bords de la map $i=6;//6 cases avant débordement en haut et a gauche $j=1; $k=245;//6 cases avant débordement en bas et a droite while ($i >=1 and $j<=6 and $k<=250){ if ($posx == $i) {$x_debut = $posx-$taille+$j;$x_fin = $x_fin+$j;} if ($posy == $i) {$y_debut = $posy-$taille+$j;$y_fin = $y_fin+$j;} if ($posx == $k) {$x_fin = $x_fin-$j;$x_debut = $x_debut-$j;} if ($posy == $k) {$y_fin = $y_fin-$j;$y_debut = $y_debut-$j;} $j++; $i--; $k++; } /* Vérification de la présence des autres joueurs: on va chercher les joueurs qui sont dans le périmètre défini précédemment. */ $sq2 = 'SELECT avatar_joueur,posx, posy FROM membre WHERE posx between '.$x_debut.' and '.$x_fin.' AND posy between '.$y_debut.' and '.$y_fin.' ORDER BY posx DESC, posy DESC' ; $req = mysql_query($sq2) or die(mysql_error()); while ($data = mysql_fetch_array($req)) { if (empty($TabMAP[$data['posx']][$data['posy']])) $TabMAP[$data['posx']][$data['posy']] = $data['avatar_joueur']; } mysql_free_result($req); /* Vérification de la présence des bâtiments : on va chercher les bâtiments qui sont dans le périmètre défini précédemment. */ $sql = mysql_query( 'SELECT type_batiment, posx, posy FROM batiments WHERE posx between '.$x_debut.' and '.$x_fin.' AND posy between '.$y_debut.' and '.$y_fin.' ORDER BY posx DESC,posy DESC' ) or die(mysql_error()); while ($data = mysql_fetch_array($sql)) { if (empty($TabMAP2[$data['posx']][$data['posy']])) $TabMAP2[$data['posx']][$data['posy']] = $data['type_batiment']; } mysql_free_result($sql); //affichage de la carte echo '<table border="1" cellspacing="0" cellpadding="0">'."\n"; echo '<tbody>'."\n"; echo '<tr><td> x y</td>'."\n"; //on affiche les positions x sur la premiere ligne for($x=$x_debut;$x<=$x_fin;$x++) echo '<td align="center" valign="middle" width="40">'.$x.'</td>'."\n"; //on affiche lignes par lignes la position y, les autres joueurs et les bâtiments for ($y=$y_debut;$y<=$y_fin;$y++) { echo'<tr ><td align="center" valign="middle" height="40">-'.$y.'</td>'."\n";//affichage de la position for($x=$x_debut;$x<=$x_fin;$x++) {// pour chaque lignes if($x==$posx && $y==$posy)//si on est sur la position du joueur echo '<td><img src='.$avatar_joueur.'.png></td>';//on affiche l'avatar de votre personnage else if(!empty($TabMAP[$x][$y]))//si on tombe sur un autre joueur echo '<td><img src='.$TabMAP[$x][$y].'.png></td>';//on affiche l'avatar du joueur else if(!empty($TabMAP2[$x][$y]))//si on tombe sur un bâtiment echo '<td><img src='.$TabMAP2[$x][$y].'.png></td>';//on affiche l'image du bâtiment else echo '<td><img src="blank.png"></td>';//si il n'y a rien... } echo '</tr>';//on ferme la ligne et on passe a la ligne suivante } echo '</tbody></table>';//on ferme la table ?> Le formulaire a 8 directions : <form action="deplacements.php" method="post"> <div align="center"> <table width="120" border="0" cellspacing="0" cellpadding="0" align="center" height="120"> <tbody> <tr> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="NO"></td> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="N"></td> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="NE"></td> </tr> <tr> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="O"></td> <td align="center" valign="middle" width="40" height="40"> <img src="Rose_des_vents.png" alt="" height="40" width="40" align="absmiddle"> </td> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="E"></td> </tr> <tr> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="SO"></td> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="S"></td> <td align="center" valign="middle" width="40" height="40"><input type="submit" name="DIR" value="SE"></td> </tr> </tbody> </table> </div> </form>
Voilà pour les déplacements avec gestion des collisions et l'affichage de la map et des flèches de déplacement.
Pour les attaques:
Code PHP<? /* Pour les attaques, on vas aller chercher toutes les positions autour de votre perso Si votre personnage est en 10.10, on va vérifier: 9.9, 9.10, 9.11 10.9, 10.10, 10.11 11.9, 11.10, 11.11 */ echo '<form action="combat.php" method="post">joueur à attaquer:'; echo '<select name="attaque_joueur">'; for ($x=$posx-1;$x<=$posx+1;$x++) {// tous les x autour du joueur a case -1 et case +1 for ($y=$posy-1;$y<=$posy+1;$y++) {// tous les y autour du joueur a case -1 et case +1 $sq = mysql_query('SELECT pseudo FROM membres WHERE posx='.$x.' AND posy='.$y.' ORDER BY posx DESC,posy DESC') or die(mysql_error()); while ($data = mysql_fetch_array($sq)) { if (!empty($data['pseudo']) and $data['pseudo'] != $votre_pseudo)// si on trouve un joueur et que ce n'est bien sûr pas vous { echo '<option value="'.$data['pseudo'].'">'.$data['pseudo'].'</option>'; //on l'affiche } } mysql_free_result($sq); } } echo '</select><input type="submit" name="attaque" value="Attaquer">'."\n"; echo '</form>'."\n"; ?>
Voilà, ce n'est pas optimisé et il y a sûrement mieux mais ça peut aider à démarrer.