JeuWeb - Crée ton jeu par navigateur
Système de carte complet par Carlou - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Système de carte complet par Carlou (/showthread.php?tid=30)

Pages : 1 2 3 4 5


Système de carte complet par Carlou - orditeck - 14-08-2006

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>&nbsp; x<br>&nbsp;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>&nbsp; x<br>&nbsp;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. ^^



RE: une map quasi complete methode carlou^^ - Kassak - 14-08-2006

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'explication:toilette:


RE: une map quasi complete methode carlou^^ - carlou - 16-08-2006

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 :
<?php 
CREATE TABLE
`membre` (
`
id` smallint(10) NOT NULL auto_increment,
`
pseudo` varchar(50) NOT NULL default '',
`
avatar_joueur` varchar(50) NOT NULL default '',
`
posx` smallint(3) NOT NULL default '0',
`
posy` smallint(3) NOT NULL default '0',
PRIMARY KEY (`id`)
)
ENGINE=MyISAM AUTO_INCREMENT=4 ;

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

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

CREATE TABLE `batiment` (
`
id` smallint(10) NOT NULL auto_increment,
`
batiment` varchar(50) NOT NULL default '',
`
posx` smallint(3) NOT NULL default '0',
`
posy` smallint(3) NOT NULL default '0',
PRIMARY KEY (`id`)
)
ENGINE=MyISAM AUTO_INCREMENT=4 ;

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

INSERT INTO `batiment` VALUES (1, 'maison', '22', '12');
INSERT INTO `batiment` VALUES (2, 'magasin', '17', '10');
INSERT INTO `batiment` VALUES (3, 'parking', '13', '23');



RE: une map quasi complete methode carlou^^ - Nodark - 16-08-2006

Merci


RE: une map quasi complete methode carlou^^ - Cr@Zy - 03-10-2006

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 :
<?php 
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++;
}



RE: une map quasi complete methode carlou^^ - carlou - 14-10-2006

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


RE: une map quasi complete methode carlou^^ - YVES - 01-12-2006

Bonjour,

je travaille depuis des semaines sur la création d'une map.
J'ai testé celle ci qui n'affiche que du blanc :toilette:
(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']; :wowowow:


RE: une map quasi complete methode carlou^^ - YVES - 02-12-2006

il y a 1 léger mieux, des cases s'affichent avec des croix rouges (h) et des chiffres apparaissent :ninga:
autre question, est-ce que le png est obligatoire?
Mes avatars et mes cases terrain sont en gif.............


RE: une map quasi complete methode carlou^^ - carlou - 02-12-2006

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..


RE: une map quasi complete methode carlou^^ - YVES - 03-12-2006

Mince, ça coince toujours :non:

$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 :rip: