JeuWeb (JeuPHP) - Crée ton jeu par navigateur

Version complète : Système de carte complet par Carlou
Vous consultez actuellement la version basse qualité d'un document. Voir la version complète avec le bon formatage.
Pages : 1 2 3 4 5
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 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'];


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 PHP
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>'."\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. 34
Je crois qu'il map la table que l'on doit creer, ce qu'il y a dans le fichier conf.php3, puis d'autre chose pas tres détaillé....

vu que je suis encore une belle quiche, j'aimerais bien plus d'explication68
conf.php3:

Code PHP :
<?
$sql_serveur 
"localhost"//Serveur de la BDD
$sql_login "login"//Login BDD
$sql_pass "pass"//Pass BDD
$sql_bdd "jeu"//Nom de la BDD - en general le login sur les serveurs distants
?>


les tables c'est pas compliqué

Code PHP :
CREATE TABLE `membre` (
  `
idsmallint(10NOT NULL auto_increment,
  `
pseudovarchar(50NOT NULL default '',
  `
avatar_joueurvarchar(50NOT NULL default '',
  `
posxsmallint(3NOT NULL default '0',
  `
posysmallint(3NOT NULL default '0',
  
PRIMARY KEY  (`id`)
ENGINE=MyISAM AUTO_INCREMENT=;

-- 
-- 
Contenu de la table `membre`
-- 

INSERT INTO `membreVALUES (1'test''image_1''10''10');
INSERT INTO `membreVALUES (2'machin''mage_2''12''10');
INSERT INTO `membreVALUES (3'truc''image_3''15''22');

CREATE TABLE `batiment` (
  `
idsmallint(10NOT NULL auto_increment,
  `
batimentvarchar(50NOT NULL default '',
  `
posxsmallint(3NOT NULL default '0',
  `
posysmallint(3NOT NULL default '0',
  
PRIMARY KEY  (`id`)
ENGINE=MyISAM AUTO_INCREMENT=;

-- 
-- 
Contenu de la table `batiment`
-- 

INSERT INTO `batimentVALUES (1'maison''22''12');
INSERT INTO `batimentVALUES (2'magasin''17''10');
INSERT INTO `batimentVALUES (3'parking''13''23'); 
Merci
Il semble y avoir une erreur lors de la définition de la 'carte'. En effet, on peut à sa guise quitter les bords de la table.

De plus j'aimerais connaitre la signification de tes variables $i, $j, $k et dans :

Code PHP :
while ($i >=and $j<=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++;
     } 
Kassak a écrit :J'ai toujours ce message d'erreur quand je me deplace : Erreur de syntaxe près de '' à la ligne
quelle ligne?

Kassak a écrit :Puis etant nouveau je ne comprend rien du tout, aucune explication vlan j'ai copié collé le code et ca marche pas,
pas bien!!

Kassak a écrit :il y a des trucs partout je ne comprends rien.
Goto siteduzero.com

Kassak a écrit :J'ia la map affiché, je peux me deplacer 2 ou 3 fois avant que sa bug, je ne vois pas l'avatar d'ailleur je sais pas comment on fait etc.....
Donc les tuto c'est generalement fait pour des personnes qui ne savent pas bien coder alors expliquer!
si tu vois pas l'avatar c'est que tu l'a pas mis et franchement en etre a ce point newb, commence par apprendre le html...
Un tuto n'est pas forcement pour quelqu'un qui ne sait pas bien coder mais pour expliquer une methode, fonction etc... si deja a la base tu sais pas qu'en php il faut mettre <? en debut de code, suis pas la pour te l'apprendre, tu es sencé le savoir...

Sinon
1 - c'est un exemple et pas un truc tout fait qui doit marcher de suite meme si c le cas et que tu n'arrive pas a le faire fonctionner

2 - si tu comprends rien a php, commence donc par apprendre

3 - La politesse c'est la moindre des choses, on est pas tes chiens

4 - si tu donne pas la ligne qui marche pas, on pourra pas t'aider
Bonjour,

je travaille depuis des semaines sur la création d'une map.
J'ai testé celle ci qui n'affiche que du blanc 68
(aucun message d'erreur) !

je ne travaille qu'avec des sessions, faut-il que je change (par exemple?)
tous les $data['batiment']; en $_SESSION['batiment']; 66
il y a 1 léger mieux, des cases s'affichent avec des croix rouges 7 et des chiffres apparaissent 71
autre question, est-ce que le png est obligatoire?
Mes avatars et mes cases terrain sont en gif.............
les png ne sont pas du tout obligatoires, tu peux utiliser le format d'image que tu veux.et les croix rouges a mon avis c'est justement les images qu'il ne trouve pas...
pour l'histoire des sessions, tu aura l'id ou le pseudo du joueur, mais les $data sont sortis des requettes pour l'affichage ou les tests de collision donc aucune raison de les mettres en session a mon avis..
Mince, ça coince toujours 55

$tabmap, elle vient d'ou cette variable?
car en fait, si je veux espérer voir mes images d ema base s'afficher, je ne vois pas dans le script l'appel à la base et auxdites images de terrain 73
Pages : 1 2 3 4 5
URLs de référence