JeuWeb - Crée ton jeu par navigateur
Déplacement dans une grande carte - 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 : Déplacement dans une grande carte (/showthread.php?tid=4206)

Pages : 1 2 3 4


Déplacement dans une grande carte - Aleskweb - 18-07-2009

Bonjour tout le Monde,
Bon cela fait un bon moment qui je bidouille ou php, j'ai trouvé ce site et il m'a paru pas mal ! (h)
En passant sur le Wiki j'ai vu ce superbe tuto sur les Map hexagonales, je me suis dit que j'allais l'implanter dans mon jeu, helas, ce script ne marchait pas en dynamique, c'est a dire que l'on peut bouger sur une grande Map. Enfin fini le blabla, passons a la partie technique ( La est le problème >< ).

J'ai mis en place un système de déplacement par Get, mais quand je clique sur la case 10/2 par exemple, ça envoie le joueur n'importe ou ( surement une erreur de calcul de coordonnées ). De plus, a chaque déplacement, un joueur d'une autre personne placé en 8/5 dans la BDD se retrouve en une autre position sur la Map qui varie suivant les déplacement de notre joueur (Mais reste toujours en 8/5 dans la BDD).

Notez le $gx et $gy qui permettent de bouger sur la map sans décaler celle-ci, avec les x, sa calculait avec $x * largeur, alors que maintenant j'ai mis un $gx et $gy qui permettent de générer une carte (avec $gx =1 et $gy =1) qui reste fixe sur l'écran même lors de déplacements .

J'ai modifié le code a ma façon et voila ce que cela donne :
Code PHP :
<?php

$gx
=1;
$gy=1;
mysql_connect('localhost','root',''); // Connection BDD
mysql_select_db('gyldorz');// Select base
$idperso=1;
if (isset(
$_GET['x']) AND isset($_GET['y'])) // on recupère les coordonées de l'url ( si il y en a )
{
$_GET['x'] = addslashes($_GET['x']);
$_GET['y'] = addslashes($_GET['y']);
echo
$_GET['x'];
echo
$_GET['y'];
mysql_query("UPDATE perso_info set x='".$_GET['x']."',y='".$_GET['y']."' where idperso='1'"); // on update la position
}
$sql = mysql_query("SELECT * FROM perso_info WHERE idperso='1'"); //Récupération des données du personnage
$perso = mysql_fetch_assoc($sql);
$sql = mysql_query("SELECT * FROM carte WHERE x='".$perso['x']."' AND y='".$perso['y']."'"); //Récupération des données du terrain
$terrain = mysql_fetch_assoc($sql);

//calcul de la vision
$x_min = $perso['x']-4;
$x_max = $perso['x']+4;
$y_min = $perso['y']-4;
$y_max= $perso['y']+4;


// On récupère les joueurs
$result = mysql_query("SELECT * FROM perso_info WHERE x BETWEEN '$x_min' AND '$x_max' AND y BETWEEN '$y_min' AND '$y_max'") or die(mysql_error());

// Stockage dans un array
while ( $data = mysql_fetch_assoc($result)) {

$joueur[$data['x']][$data['y']] = array('x'=>$data['x'],'y'=>$data['y'],'idperso'=>$data['idperso']);
// echo "$joueur[$data['x']][$data['y']]";
}

$width=45; // Largeur des hexa
$curent_y = -5000;

// Petit calcul pour ne pas déformer la map selon le y de base/référence lors de la génération
if ($y_min%2 == 0) {
$y =$y_min;
}else {
$y =$y_min; } //Cette partie, j'ai pas compris et j'ai modifié donc je suis vraiment pas sur

$query = mysql_query("SELECT * FROM carte WHERE x BETWEEN '$x_min' AND '$x_max' AND y BETWEEN '$y_min' AND '$y_max' ORDER BY y,x");
//echo "<br />";
// On génére la map
$var_carte = "";

while(
$carte = mysql_fetch_assoc($query)) {
if (
$curent_y!=$carte['y']) { // Nouvelle ligne
$x=0+$x_min;
$y++;
$gy=$gy+1;
$curent_y = $carte['y'];
$cx = $carte['x'];
$cy = $carte['y'];
$gx=1;

}
$gx=$gx+1;
$x++;

// Calcul pour savoir si on décale ou pas les cases d'une ligne
if ( ($y%2) == 1) { // Pair
$iX=($gx*45)-40;
}else {
$iX= ($gx*45) + ($width/2)-40;
}
$iY = ($gy*35)-45;
$kart = "";
$kart .= 'hex';
$kart .= $carte['idterrain'];


$var_carte .= '<div onClick="document.location.href=\'carte.php?x='.$x.'&y='.$y.'\'" id="'.$kart.'" class="case" style="top:'.$iY.'px;left:'.$iX.'px;">';


// <!-- POUR LE DEBUGGAGE AFFICHAGE DES x/y DANS LES CASES

$var_carte .= "<br />$x/$y";
// FIN DEBUGGAGE -->

if ( isset($joueur[$carte['x']][$carte['y']]))
{
$var_carte .= '<img src="perso/av.png" alt="Index" onmouseover=""/>';

}

$var_carte .= '</div>';

echo
$joueur[$carte['x']][$carte['y']] ;
}
// fin du While

echo $var_carte;

?>

Voila, petite question aussi, pour le nom de mon jeu, j'hésite entre Gylderz et Gyldorz, pouvez vous me conseiller ?

Merci
AleskWeb

Ps: Vous pouvez vous inspirer du système de mon script pour les interéssés Wink


RE: Deplacement dans une grande Map - jo_link_noir - 18-07-2009

J'ai regardé comme ça et pas trouvé de soucis. Par contre là où y a $y =$y_min; (partie que t'as pas comprit dans le milieu de ton code) va posé problème quand la map va bougé, mais t'y est pas encore ^.^. J'vais testé en local pour voir.

Par contre j'vais dire des p'tits chose sur ton code Smile
Code PHP :
<?php 
if (isset($_GET['x']) AND isset($_GET['y'])) // on recupère les coordonées de l'url ( si il y en a )
{
$_GET['x'] = addslashes($_GET['x']);
$_GET['y'] = addslashes($_GET['y']);
}
-isset peut prendre plusieurs paramètre : "Si plusieurs paramètres sont fournis, alors la fonction isset() retournera TRUE seulement si tous les paramètres sont définis"
-toujours vérifié la valeur retourné par l'utilisateur. En plus, pour protégé d'une injection sql c'est mysql_real_escape_string
au final :
Code PHP :
<?php 
if (isset($_GET['x'], $_GET['y']) && is_numeric($_GET['x']) && is_numeric($_GET['y']))
{
//pas besoin de mysql_real_escape_string car $_GET['x'] et $_GET['y'] sont des nombres
}

Code PHP :
<?php 
while ( $data = mysql_fetch_assoc($result)) {
$joueur[$data['x']][$data['y']] = array('x'=>$data['x'],'y'=>$data['y'],'idperso'=>$data['idperso']);
// echo "$joueur[$data['x']][$data['y']]";
}
Vu qu'après tu fais une recherche par clef, enregistrer x, y et idperso dans un tableau n'est pas utilie. En plus à un moment tu fais un echo sur ce tableau, y aura rien d'autre que Array d'afficher. En gros $joueur[$data['x']][$data['y']] = $data['idperso']; doit suffire.

Code PHP :
<?php 
$kart
= "";
$kart .= 'hex';
$kart .= $carte['idterrain'];
autant faire $kart = 'hex'.$carte['idterrain'];

$gx = $gx+1 devient $gx += 1; ou ++$gx; (après c'est à l'avis de chacun, perso je préfère la dernière forme)
$x = 0+$x_min pas trop comprit pourquoi un 0+ mais bon ^.^
Y aussi $cx et $cy qui ne sont pas utilisé.
Et dernière chose, préfère les fonctions mysqli_ à mysql_. Pour en savoir un peu plus.

Voilà c'est tout Big Grin
J'vais testé en local maintenant ^.^


RE: Deplacement dans une grande Map - Aleskweb - 18-07-2009

Merci pour ton aide qui me sera fort utile, je vais changer ce que tu m'a indiqué et te donner le resultat.
Pour le local, les tables sont les memes que celle du tuto Wink
Aussi, merci de m'envoyer les resultat de ton test en local Smile


RE: Deplacement dans une grande Map - SorenS - 18-07-2009

Citation :-isset peut prendre plusieurs paramètre : "Si plusieurs paramètres sont fournis, alors la fonction isset() retournera TRUE seulement si tous les paramètres sont définis"

Je savais pas ça. Je me disais bien qu'il devait y avoir un moyen. Ca m'apprendra à utiliser une fonction sans aller la voir dans le manuel. Merci en tout cas Wink


RE: Deplacement dans une grande Map - jo_link_noir - 18-07-2009

De rien ^^

Bon alors j'ai fait quelque test. Le problème viendrais de $var_carte. Faut pas utilisais $x et $y pour afficher les coordonnées mais $carte['x'] et $carte['y']
Code PHP :
<?php 
$var_carte
.= '<div onClick="document.location.href=\'carte.php?x='.$carte['x'].'&y='.$carte['y'].'\'" id="'.$kart.'" class="case" style="top:'.$iY.'px;left:'.$iX.'px;">';

// <!-- POUR LE DEBUGGAGE AFFICHAGE DES x/y DANS LES CASES

$var_carte .= '<br />'.$carte['x'].'/'.$carte['y'];
// FIN DEBUGGAGE -->

Bon faut que j'y aille, dit moi si ça va mieux.


RE: Deplacement dans une grande Map - Aleskweb - 19-07-2009

Okay merci beaucoup, sa marche, bon va falloir que j'apprenne a coder plus 'propre' et 'sérieux', parceque la, ma technique bourrin n'est pas tres efficasse.

Et sinon, pour la partie que je n'ai pas comprise, elle est indispensable ? Parceque je ne sait pas a quoi elle sert


RE: Deplacement dans une grande Map - jo_link_noir - 19-07-2009

Si c'est celle que je pense oui.
Dans une carte héxagonale il y a des ligne (ou colonne) au-dessus d'une autre (les pair ou impair, ça dépend). Donc en fait, si ton personnage bouge la 1er les colonnes (ou ligne) peut ce retrouve au-dessus alors qu'avant elle été en-dessous. C'est pour régler le problème. Le mieux serait une image, je te montre demain


RE: Deplacement dans une grande Map - Aleskweb - 19-07-2009

Ok merci,
petite question en attendant : A t'on le droit de prendre des images sur google image, les modifier, et les metre sur notre site qui un jour sera peut etre payant (allopass). Je fais allusion aux droit d'auteurs ou copyright, les auteurs des images pouraient porter plainte ? ou alors, du moment qu'ils ont posté sur le web, les images sont libres de droits ?


RE: Deplacement dans une grande Map - Ter Rowan - 19-07-2009

(19-07-2009, 10:45 AM)Aleskweb a écrit : Ok merci,
petite question en attendant : A t'on le droit de prendre des images sur google image, les modifier, et les metre sur notre site qui un jour sera peut etre payant (allopass). Je fais allusion aux droit d'auteurs ou copyright, les auteurs des images pouraient porter plainte ? ou alors, du moment qu'ils ont posté sur le web, les images sont libres de droits ?

non elles ne sont pas libres de droit parce que sur le web

Smile


RE: Déplacement dans une grande carte - Aleskweb - 19-07-2009

Donc si on fait un site, il faut tout faire sois meme ?