Résolu [résolu] PHP besoin aide développement map style travian

  • Auteur de la discussion khalad
  • Date de début

khalad

Nouveau membre
Bonjour,

je cherche à développer, a des fins personnelles et comme exercice d'entraînement, une carte un peu comme Travian (jeu par navigateur)... J'ai réussi à développer en PHP un petit script qui développe dynamiquement une zone autour de coordonnées fournis par un autre script.

PHP:
[cpp]$sql = "SELECT * FROM planete WHERE pseudo = 'khalad'";
$recup=mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

$fetch = mysql_fetch_assoc($recup);


if(empty($_POST['largeur'])) { $posx = $fetch['l']; } else { $posx=$_POST['largeur']; }
if(empty($_POST['hauteur'])) { $posy = $fetch['h']; } else { $posy=$_POST['hauteur']; }

$compteurX = $posx - 19;
$compteurY = $posy + 14;

$finX = $posx + 19;
$finY = $posy - 14;

$debutX = $posx - 19;

while($compteurY >= $finY)
{

echo '<div class="ligneMap">
<div class="caseMapcoorY">'.$compteurY.'</div>', "\n";


while($compteurX <= $finX)
{

if($compteurX == $fetch['l'] and $compteurY == $fetch['h'])
{
echo "\t\t\t\t\t\t\t", '<div class="caseMapok">1';
echo '</div>', "\n";
}
else
{
if($compteurX == $_POST['largeur'] and $compteurY == $_POST['hauteur'])
{
echo "\t\t\t\t\t\t\t", '<div class="caseMapok2">2';
echo '</div>', "\n";
}
else
{
echo "\t\t\t\t\t\t\t", '<div class="caseMap">a';
echo '</div>', "\n";
}
}
$compteurX++;
}

echo "\t\t\t\t\t\t", '</div>', "\n";

$compteurX = $debutX;
$compteurY--;

}


mysql_close();[/cpp]




Voila alors j'ai réussi grâce a deux boucles imbriquées a développé mon quadrillage. En définissant un nombre - et + devant les coordonnées fournis j'arrive a centrer le carré dans la map histoire de montrer ou se situe l'objet. Maintenant mon problème, c'est la navigation dedans, la navigation en donnant de nouvelle coordonnées fonctionne, il m'affiche la zone, et le carré du joueur est toujours affiché s'il est dans la zone... Mais je n'arrive pas a trouver un système pour bouger la map de droit a gauche, haut bas avec des boutons allant de 2 cases en 2 cases...

autre soucis, je n'arrive pas a comprendre comment afficher l'axe X des coordonnées, j'ai trouvé pour l'axe Y...

Voila, j'espère avoir été assez clair... Je vais passer la matinée au boulot, donc je ne serais la qu'en début d'après midi. J'ai essayé d'être le plus complet possible.

Bonne journée, et merci de votre aide !
 
M

Membre supprimé 1

Invité
En fait si tu veux que quelqu'un t'aide il faudrait nous donner des précisions comme le début et la fin de ton PHP parce que je me demande si tu nous as donner le début ou seulement une partie et j'avoue ne pas trop avoir envie de me plonger dedans sans tout savoir de tes variables et tout, enfin... c'est pas simple!
Mais je veux bien t'aider sinon!
:na:
(pour la map j'ai une idée...)
 

khalad

Nouveau membre
désolé !! j'avais complètement oublié que j'avais posté sur ce forum :sweat:

J'ai trouvé entre temps comment faire, j'ai repris le code en entier en me creusant la tête j'y suis arrivé. Mais merci quand même de ton aide !
 
M

Membre supprimé 1

Invité
Bonjour khalad !
Je tente moi-même de mettre au point une map dont le fonctionnement sera similaire à celle citée plus haut, et la solution à ton problème pourrait bien m'éclairer grandement...

Pourrais-tu donner la solution que tu as trouvée à ce sujet ?

Je t'en remercie d'avance.
 

khalad

Nouveau membre
et bien en fait, le principe si tu veux, c'est d'imbriquer deux boucles while l'une dans l'autre pour arriver a produire des cases de la map.

la carte est construire autour des coordonnées que tu va créer aléatoirement. Il ne faut pas penser que la carte est déjà créée, mais elle est générée en fonction des coordonnées. Ca donne l'impression d'une carte gigantesque, mais PHP calcule enfait à la volée la zone.

Après pour les boutons de déplacement, tu dois en fait créer des boutons qui indiquent ensuite dans le code selon la direction si tu te déplace de tel nombre de case vers tel nombre de case. L'astuce que j'ai trouvé c'est de travailler avec les $_SESSION. Tu enregistre le bouton de direction, tu prend la dernière coordonnée mise a jour par le dernier calcul de direction et tu lui rajoute a nouveau le nombre de case a déplacer.

En pratique ca donne :

pour les coordonnées :

[cpp]
if(isset($_POST['haut']))
{
if(empty($_SESSION['pos_y']))
{
$_SESSION['pos_y'] = $fetch['h'] + 3;
$posy = $_SESSION['pos_y'];
if(empty($_SESSION['pos_x']))
{
$posx = $fetch['l'];
}
else
{
$posx = $_SESSION['pos_x'];
}
}
else
{
$posy = $_SESSION['pos_y'] + 3;
if(empty($_SESSION['pos_x']))
{
$posx = $fetch['l'];
}
else
{
$posx = $_SESSION['pos_x'];
}
$_SESSION['pos_y'] = $posy ;

}
}
elseif(isset($_POST['bas']))
{
if(empty($_SESSION['pos_y']))
{
$_SESSION['pos_y'] = $fetch['h'] - 3;
$posy = $_SESSION['pos_y'];
if(empty($_SESSION['pos_x']))
{
$posx = $fetch['l'];
}
else
{
$posx = $_SESSION['pos_x'];
}
}
else
{
$posy = $_SESSION['pos_y'] - 3;
if(empty($_SESSION['pos_x']))
{
$posx = $fetch['l'];
}
else
{
$posx = $_SESSION['pos_x'];
}
$_SESSION['pos_y'] = $posy ;
}
}
elseif(isset($_POST['gauche']))
{
if(empty($_SESSION['pos_x']))
{
$_SESSION['pos_x'] = $fetch['l'] - 3;
$posx = $_SESSION['pos_x'];
if(empty($_SESSION['pos_y']))
{
$posy = $fetch['h'];
}
else
{
$posy = $_SESSION['pos_y'];
}
}
else
{
$posx = $_SESSION['pos_x'] - 3;
if(empty($_SESSION['pos_y']))
{
$posy = $fetch['h'];
}
else
{
$posy = $_SESSION['pos_y'];
}
$_SESSION['pos_x'] = $posx ;
}
}
elseif(isset($_POST['droite']))
{
if(empty($_SESSION['pos_x']))
{
$_SESSION['pos_x'] = $fetch['l'] + 3;
$posx = $_SESSION['pos_x'];
if(empty($_SESSION['pos_y']))
{
$posy = $fetch['h'];
}
else
{
$posy = $_SESSION['pos_y'];
}
}
else
{
$posx = $_SESSION['pos_x'] + 3;
if(empty($_SESSION['pos_y']))
{
$posy = $fetch['h'];
}
else
{
$posy = $_SESSION['pos_y'];
}
$_SESSION['pos_x'] = $posx ;
}
}
else // si les boutons n'ont pas été utilisés, on utilise alors le système de coordonnées ciblés.
{
if(empty($_POST['largeur'])) { $posx = $fetch['l']; } else { $posx=$_POST['largeur']; }
if(empty($_POST['hauteur'])) { $posy = $fetch['h']; } else { $posy=$_POST['hauteur']; }
}
[/cpp]

et ensuite pour afficher la map en elle meme :

[cpp]
$compteurX = $posx - 4;
$compteurX2 = $posx - 4;
$compteurY = $posy + 3;

$finX = $posx + 4;
$finX2 = $posx + 4;
$finY = $posy - 3;

$debutX = $posx - 4;


echo'<div id="ligneMapX">';

while($finX2 >= $compteurX2) {
echo'<div id="caseMapcoorX">'.$finX2.'</div>';
$finX2--;
}
$compteurX2 = $debutX;
echo'</div>';

while($compteurY >= $finY) {


echo '<div id="ligneMap">
<div id="caseMapcoorY">'.$compteurY.'</div>', "\n";


while($compteurX <= $finX) {
if($compteurX == $fetch['l'] and $compteurY == $fetch['h'])
{
echo "\t\t\t\t\t\t\t", '<div id="caseMapok">1';
echo '</div>', "\n";
}
else
{
if($compteurX == $posx and $compteurY == $posy)
{
echo "\t\t\t\t\t\t\t", '<div id="caseMapok2">2';
echo '</div>', "\n";
}
else
{
echo "\t\t\t\t\t\t\t", '<div id="caseMap">a';
echo '</div>', "\n";
}
}

$compteurX++;
}

echo "\t\t\t\t\t\t", '</div>', "\n";

$compteurX = $debutX;
$compteurY--;

}


mysql_close();
[/cpp]

voila, si jamais il y a d'autres questions : xxxxxxxxxxxxxxxxxxxxxxx@gmail.com, ca ira plus rapidement. Je ne prétend pas que cela soit la méthode ultime hein, mais c'est une technique pas trop lourde que j'ai trouvé a force de tâtonner...



[:zeb:6]
Pas de mail, stp. Ce site est un forum, pas un site de mise en relation : Les questions et les réponses au même endroit !
 

Metafury

Nouveau membre
Meilleure réponse
Salut Khalad,


on a à peu prés le même script, pour faire afficher la map, j'ai créé une map que j'ai découpé en carré de 50 px par 50 px, et pour que ces images s'affichent, le nom de chaque image équivaut aux coordonnées..
Genre img_12_56.gif pour l'image d'abscisse 12 et d'ordonnée 56..
Ensuite je fais juste un background-image:url(map/...) pour l'afficher..

Par contre, je ne sais pas comment créer les contraintes de déplacements.. ( les plages, l'eau, les arbres... )

Si t'as besoin d'aide, n'hésite pas ;-)
 

khalad

Nouveau membre
Hello Metafury

Et bien pour ma part, il y a une table que j'ai associé avec celle des planètes qui contient les éléments contraintes. Lors de l'inscription le générateur aléatoire de coordonnées vérifie si ces coordonnées crées n'existent pas déjà dans les objets du décors et s'ils n'existent pas les fournissent pour la planète, sinon il en crée des nouveaux.

Via mon panneau d'administration, je met tout mes rochers, mes astéroïdes etc, avec leur coordonnées et la carte me les affiche a leur emplacement

au niveau technique, j'ai deux tables distinctes que je lie via un LEFT JOIN (ou RIGHT JOIN selon le besoin)... Et ça marche parfaitement, après j'ai lié toute mes tables pour n'avoir qu'une requête et optimiser le chargement de page.
 

Metafury

Nouveau membre
Salut Khalad,

je pensais passer par un fichier xml décrivant chaque coordonnées, ou chaque type de "terrain" / "case"..
Et mettre un peu d'ajax pour limiter les appels au serveur sql ( postgresql )..
Je viens de trouver comment s'appelait ces petits carrés utilisé dans les rpg, ce sont des charset ( persos ) ou des chipset ( décor )..


Bon courage,

Nils
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 136
Messages
6 718 137
Membres
1 586 399
Dernier membre
mehdivil59
Partager cette page
Haut