24-05-2008, 11:05 PM
Génial Raoull ! La fonction addScriptCall() marche parfaitement bien !
En fait, pour répondre à ta question, ma page affiche la map du joueur (sa colonie) sur laquelle il peut placer des bâtiments dynamiquement, un peut comme dans n'importe quel jeu de stratégie (c'est la qu'intervient ma fonction javascript), et au moment ou joueur clique pour placer son bâtiment, je renvoi vers ma fonction PHP qui va modifier le fichier carte. Mais si le joueur doit placer plusieurs bâtiments de suite, j'ai penser que ce serait plus agréable que le bâtiment reste sélectionner plutôt que de devoir retourner le chercher dans le menu (afin que l'utilisateur n'ai de nouveau qu'a cliquer pour placer le bâtiment). Donc finalement, ce n'est pas une boucle infini, puisque la fonction PHP n'est appeler que si le
joueur place un bâtiment, et la fonction javascript n'est appelé que lorsque le joueur sélectionne un bâtiment (dans le menu de construction). Je précise que la fonction javascript s'arrête dès que l'on clique en dehors du bloc qui contient la map.
En fait, j'ai de nouveau un petit souci dans ma fonction PHP.
Comme je l'ai dit, la map est stocké dans un fichier texte, de la forme :
0 0 0 0 0 0 0b 2 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0c 0
ou chaque numéro correspond à un terrain ou un bâtiment. Mes bâtiments peuvent prendre plusieurs case, par exemple une maison (numéro 10), on aurait :
0 0 0 0 0 0 0 2 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 10 10a 1 1 1 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 1 1 1 2 1 2 2 2 2 2 2 1 1 1 1 10 10 1 1 1 1 2 2 2 2 1 0
Le 10a correspond à la case de référence, à partie de laquelle je créer un div qui passer au dessus des autres cases de ma map... enfin bref, ce n'est pas très important ici.
Bref, j'ai un array qui contient chaque ligne du tableau : $_SESSION['ligne_creation'] (donc si je tape $_SESSION['ligne_creation'][5], sa m'affiche la ligne numero 5, par exemple)
Ma fonction PHP donc, doit me permettre de modifier mon fichier carte : (j'espère que j'ai été asser clair...)
En fait, pour répondre à ta question, ma page affiche la map du joueur (sa colonie) sur laquelle il peut placer des bâtiments dynamiquement, un peut comme dans n'importe quel jeu de stratégie (c'est la qu'intervient ma fonction javascript), et au moment ou joueur clique pour placer son bâtiment, je renvoi vers ma fonction PHP qui va modifier le fichier carte. Mais si le joueur doit placer plusieurs bâtiments de suite, j'ai penser que ce serait plus agréable que le bâtiment reste sélectionner plutôt que de devoir retourner le chercher dans le menu (afin que l'utilisateur n'ai de nouveau qu'a cliquer pour placer le bâtiment). Donc finalement, ce n'est pas une boucle infini, puisque la fonction PHP n'est appeler que si le
joueur place un bâtiment, et la fonction javascript n'est appelé que lorsque le joueur sélectionne un bâtiment (dans le menu de construction). Je précise que la fonction javascript s'arrête dès que l'on clique en dehors du bloc qui contient la map.
En fait, j'ai de nouveau un petit souci dans ma fonction PHP.
Comme je l'ai dit, la map est stocké dans un fichier texte, de la forme :
0 0 0 0 0 0 0b 2 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0c 0
ou chaque numéro correspond à un terrain ou un bâtiment. Mes bâtiments peuvent prendre plusieurs case, par exemple une maison (numéro 10), on aurait :
0 0 0 0 0 0 0 2 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 10 10a 1 1 1 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 1 1 1 2 1 2 2 2 2 2 2 1 1 1 1 10 10 1 1 1 1 2 2 2 2 1 0
Le 10a correspond à la case de référence, à partie de laquelle je créer un div qui passer au dessus des autres cases de ma map... enfin bref, ce n'est pas très important ici.
Bref, j'ai un array qui contient chaque ligne du tableau : $_SESSION['ligne_creation'] (donc si je tape $_SESSION['ligne_creation'][5], sa m'affiche la ligne numero 5, par exemple)
Ma fonction PHP donc, doit me permettre de modifier mon fichier carte : (j'espère que j'ai été asser clair...)
Code PHP :
<?php
//TRAITEMENT DU BATIMENT
function Batiments($coordx_batiment, $coordy_batiment, $coordx_batiment_max, $coordy_batiment_max, $nom, $orientation, $bat, $dim_x, $dim_y, $depassement_x, $depassement_y)
{
$reponse = new xajaxResponse();//Initialisation de l'objet xAJAX
$reponse->setCharEncoding('ISO-8859-1');
$posx = $_SESSION['posx'] - 22 + $coordx_batiment;//calcul des coordonnees du batiment
$posy = $_SESSION['posy'] - 6 + $coordy_batiment;
$posx_max = $_SESSION['posx'] - 22 + $coordx_batiment_max;//calcul des limites du batiment
$posy_max = $_SESSION['posy'] - 6 + $coordy_batiment_max;
for ($compteur_y = $posy; $compteur_y <= $posy_max; $compteur_y ++)//Boucle Y
{
for ($compteur_x = $posx; $compteur_x <= $posx_max; $compteur_x ++)//Boucle X
{
if($compteur_y == $posy AND $compteur_x == $posx_max)//Pour la case de référence
{
$batiment = $nom . $orientation;
}
else//Sinon, le nom normal
{
$batiment = $nom;
}
//C'est ici que sa ce complique, en fait preg_match est censé sélectionné le début de la ligne en modification, car preg_replace ,qui doit modifier juste un endroit de la ligne, supprime aussi tout ce qui précède...
$compteur_x2 = $compteur_x - 1;
preg_match('#([0-9][a-z0-9]* ){' . $compteur_x2 . '}#' ,$_SESSION['ligne_creation'][$compteur_y], $debut_ligne);
//preg_replace donc...
$fin_ligne = preg_replace('#([0-9][a-z0-9]* ){' . $compteur_x . '}#', $batiment . ' ', $_SESSION['ligne_creation'][$compteur_y], 1);
//Je reconstitue la chaine
$_SESSION['ligne_creation'][$compteur_y] = $debut_ligne[0] . $fin_ligne;
}
}
//Maintenant on enregistre tout ça dans le fichier
$Fnm = 'joueurs/colonies/' . $_SESSION['pseudo'] . '2.txt';//on ouvre le fichier
$inF = fopen($Fnm,"w+");
$carte = implode(" ", $_SESSION['ligne_creation']);//on remplace le fichier
fputs($inF, $carte);
//Et on rapelle la fonction
$reponse->addScriptCall("Deplacement", "$bat", "event", "$dim_x", "$dim_y", "$depassement_x", "$depassement_y", "$nom", "$orientation");
return $reponse->getXML();
}
//FIN
Le problème dans ce code, c'est que les variables $debut_ligne et $fin_ligne semblent ne rien contenir, alors que ce script marchait très bien avant, je ne vois pas ce que j'ai pu modifier qui foire mon script...
Voili voilou, je sais que ce n'est pas ce qu'il y à de plus simple, donc si vous avez des idées pour améliorer aussi, je suis preneur