14-08-2006, 01:59 AM
(Modification du message : 31-01-2009, 07:03 PM par Sephi-Chan.)
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.
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'];
Ensuite on définit la taille de la map à afficher
//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.
/*
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 :
//affichage de la carte
echo '<table border="1" cellspacing="0" cellpadding="0">'."\n";
echo '<tbody>'."\n";
echo '<tr><td> x<br> 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:
<form action="deplacements.php" method="post">
<div align="center">
<br>
<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:
//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:
// 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.
if(!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><br><br>'."\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.
$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 :
<?
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><br><br>'."\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<br> 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">
<br>
<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:
<?
/*
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:<br>';
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. ^^