JeuWeb - Crée ton jeu par navigateur
Generation de Carte via GD - 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 : Generation de Carte via GD (/showthread.php?tid=2288)

Pages : 1 2


Generation de Carte via GD - Lutin - 24-01-2008

Bonsoir à vous,

Voilà j'ai crée une carte pour un jeu que j'ai stocké dans un fichier texte de la façon suivante :
Citation :45.jpg,53.jpg,53.jpg,53.jpg,53.jpg,53.jpg,53.jpg,53.jpg,53.jpg,53.jpg,53.jpg,53.jpg,53.jpg,53.jpg,46.jpg
50.jpg,2.jpg,2.jpg,2.jpg,2.jpg,2.jpg,2.jpg,2.jpg,2.jpg,2.jpg,2.jpg,2.jpg,2.jpg,2.jpg,51.jpg
etc ...

J'avais dans un 1er temps afficher la map en la lisant le fichier, le problème c'estque plus j'ai de tile à afficher et plus le temps est long (sur une map de 15*15 avec des tiles de 32pixels), il me faut pas loin de 10 secondes si j'ai plus de 80% de tiles différents (exemple classique : une ville).

Je me suis donc dit, essayons de générer une carte via GD, et on mettra tout cà dans un cache (avec les fonctions php ob_....).

Alors voici le code de génération de l'image, mais tout ce que j'obtiens c'est cà :

Citation :Warning: imagecopy(): supplied argument is not a valid Image resource in /home/lesmonde/public_html/admin/gen_map.php on line 74
Resource id #4 ,images/ville/45.jpg,0,0,0,0,32,32
Warning: imagecopy(): supplied argument is not a valid Image resource in /home/lesmonde/public_html/admin/gen_map.php on line 74
Resource id #4 ,images/ville/53.jpg,32,0,0,0,32,32
etc ..

Voici le code :
Code :
        $image_carte = @imagecreatetruecolor (480,480) or die ("Impossible de crée un flux d'image GD");

        //Je lit le fichier de map

        $fp = fopen("maps/".$_POST['carte_edit'].".txt","r");
        $dst_y=0;
        while(!feof($fp))
        {
             $buffer = fgets($fp, 4096);
             $images=explode(",",$buffer);
             $nbre=count($images);
             for($i=0;$i<$nbre;$i++)
             {
                $dst_x=$i*32;
                $source=$rep.$images[$i];
                imagecopy($image_carte ,$source,$dst_x,$dst_y,0,0,32,32);
               }
             $dst_y=$dst_y+32;
        }
        imagecolortransparent($image_carte);
        imagepng($image_carte, "maps/".$_POST['carte_edit'].".png");
        imageDestroy ($image_carte);


Auriez vous une idée ?
Merci par avance pour votre aide.

Pour info, l'image source existe bien, un <img> me l'a bien montré.


RE: Generation de Carte via GD - Zboy74 - 25-01-2008

Salut,

J'ai utilisé un peu la librairie GD, et je crois que dans
Citation :imagecopy($image_carte ,$source,$dst_x,$dst_y,0,0,32,32);
, ton 2ème argument ( ici "$source") doit être une ressource image PHP et non pas un fichier image, comme tu essaie de le placer ... essaie avant ton imagecopy() de faire quelque chose du genre :
Citation :$source = imagecreatefromjpg($source);

Sous toutes réserves, hein, c'est d'après de vieux souvenirs...


Sinon, moi j'utilise à peu près ton système pour les écrans de jeu, avec mes "tiles" dans un tableau... je pense que ce qui est long dans ton code c'est ton "fgets()" non? Essaie de mettre des timers ... parce que moi l'affichage est très rapide, sur un screen de 20x20 par exemple, avec des personnages dessus, pré-calcul des déplacements, etc...

Dis moi ce que tu trouves, on pourrait s'aider là dessus...

A+!


PS: tu ne prévoit pas de base de donnée? Parce que un fichier texte ... au pire stocke ça dans un XML pour voir la rapidité, en plus tu pourras facilement faire du cache avec ça, et des liens très faciles avec une éventuelles base après.


RE: Generation de Carte via GD - Lutin - 25-01-2008

Merci, je vais essayer de suite, mais tu entends quoi par des timers ?

Mais je vais remplacer par imagecreatefrompng(), car entre temps je m'étais dit que comme je génerais du png, mieux valais partir d'un png .... Smile


RE: Generation de Carte via GD - Lutin - 25-01-2008

Arf c vraiment bizarre, j'obtiens celà comme erreur :
Citation :Warning: imagecreatefrompng(images/land/45.png) [function.imagecreatefrompng]: failed to open stream: No such file or directory in /home/lesmonde/public_html/admin/gen_map.php on line 74

Warning: imagecopy(): supplied argument is not a valid Image resource in /home/lesmonde/public_html/admin/gen_map.php on line 75

Alors que <img src="images/land/45.png"> m'affiche bien l'image Sad


RE: Generation de Carte via GD - Lutin - 25-01-2008

Yes ca marche Smile Merci beaucoup il me fallait mettre un @imagecreatefrompng Smile

Sinon plus technique, je crée donc une map a base de tile. Je l'affiche par une méthode quelconque, mais après c Ajax qui entre en jeu pour déplacer le perso et visualiser les autres persos. Je ne sait pas si tu connait ajax, mais dans mon cas et à l'origine, chaque image était lu dans un fichier plat, puis injecter dans un tableau de la façon suivante :
<td><div id='_X_Y'>image</div></td>
Ou X et Y sont les coordonnes numeriques.

Ensuite via Ajax je fais un addRemove ou addAppend pour afficher ou non l'interieur d'une balise ou se trouve un perso.

========================

Concernant l'idée d'une base, oui mais je préfère pas, car celle ci est déjà chargé par les requêtes diverses et variées du jeu (quêtes, maj des combats, des positions, etc ...).

Sinon maintenant que grâce à toi, l'image est générée je vais l'intégrer dans un cache ou elle sera en background d'un <table> et par dessus se trouvera uniquement des <td><div id='_X_Y'></div<</td> vide pour Ajax.


RE: Generation de Carte via GD - naholyr - 25-01-2008

Non, un bug n'est pas résolu en ajoutant un @ qui se contente de cacher l'erreur.
Déjà tu utilises imagecreatefrompng alors que tes images sont des jpeg, je pense que c'est une bonne piste pour éliminer ce warning...


RE: Generation de Carte via GD - Lutin - 25-01-2008

naholyr a écrit :Non, un bug n'est pas résolu en ajoutant un @ qui se contente de cacher l'erreur.
Déjà tu utilises imagecreatefrompng alors que tes images sont des jpeg, je pense que c'est une bonne piste pour éliminer ce warning...

Non, non dans un de mes messages précedents j'ai dit que j'avais convertit les jpg en png Wink

Je ne suis pas sûr que le '@' cache une erreur, puisque je génère une image à la fin, ce que je ne peut faire sans le '@'. Il en va de même avec mon imagecreatetruecolor. Si je ne met pas de '@' je ne génère rien.

Code :
        $image_carte = @imagecreatetruecolor (480,480) or die ("Impossible de crée un flux d'image GD");

        //Je lit le fichier de map

        $fp = fopen("maps/".$_POST['carte_edit'].".txt","r");
        $dst_y=0;
        while(!feof($fp))
        {
             $buffer = fgets($fp, 4096);
             $images=explode(",",$buffer);
             $nbre=count($images);
             for($i=0;$i<$nbre;$i++)
             {
                $dst_x=$i*32;
                $source=$rep.$images[$i];
                $source1 = @imagecreatefrompng($source);
                imagecopy($image_carte ,$source1,$dst_x,$dst_y,0,0,32,32);
               }
             $dst_y=$dst_y+32;
        }
        imagecolortransparent($image_carte);
        imagepng($image_carte, "maps/".$_POST['carte_edit'].".png");
        imageDestroy ($image_carte);

Ce code fonctionne. Je pense plutôt que le @ a une fonction bien particulière dépendant de la façon dont GD a été compilé/intégrer sur le serveur.

Le plus curieux c'est que j'ai vu des scripts avec et sans le '@'.


RE: Generation de Carte via GD - keke - 25-01-2008

Coucou,
Le message d'erreur que tu as est un Warning. Il ne devrait pas empécher l'execution de code ensuite, cependant, une image ne peut s'afficher s'il y a un message d'erreur dedans (style un warning).

Le @ cache les messges d'erreurs et il cache donc le Warning et affiche l'image. Ceci pour t'expliquer pourquoi, ... ca marche.
Cependant, c'est assez sale.

Je te conseille de résoudre ton problème au lieu de le cacher ...

Des pistes pour t'aider :
imagecreatefrompng(images/land/45.png)

N'hésites pas à mettre des guillemets autour du nom de l'image imagecreatefrompng("images/land/45.png")
Ca fait pas de mal.

Ensuite, en terme d'allocation mémoire, tu as pu constater qu'on était obligé de rajouter la fonction
imageDestroy ();
lorsqu'on utilise plus une image...

Ben comme tu utilises une image temporaire, il faudrait appeler la fonction
imageDestroy ($source1);
dans ta boucle for.

Enfin, tu devrais au minima tester lorsque tu créé une image, que celle-ci soit correctement crée. Sur le site PHP.net il y a tout les commentaires à ta disposition pour t'aider à faire ton code.

Bonne journée à toi !
Kéké.


RE: Generation de Carte via GD - Lutin - 25-01-2008

Exact, le @ cache les erreurs. J'ai remodele le code pour l'integrer dans mon 'mapmaker', et l'erreur apparaît uniquement lorsque je lit la dernière image de la ligne. Et encore n'apparait pas pour la dernière image du fichier.

Le problème proviens en fait du "\n" (ou ODOA) de fin de ligne. Il me faut le supprimer car à priori il est pris en compte.


RE: Generation de Carte via GD - Lutin - 25-01-2008

Celà était effectivement le problème.
Voici le code final qui fonctionne, l'image est généré correctement Smile

Code :
        $taille1=$map_mapx*32;
        $taille2=$map_mapy*32;
        $image_carte = imagecreatetruecolor($taille1,$taille2) or die ("Impossible de crée un flux d'image GD");
        //Je lit le fichier de map
        $fp = fopen("maps/".$_POST['strMapName'].".txt","r");
        $dst_y=0;
        while(!feof($fp))
        {
             $buffer = fgets($fp, 4096);
             $images=explode(",",$buffer);
             $nbre=count($images);
             for($i=0;$i<$nbre;$i++)
             {
                $dst_x=$i*32;
//                $source=$repertoire.$images[$i];
                $source=str_replace("\r\n","",$repertoire.$images[$i]);
                $source1 = imagecreatefrompng("".$source."") or die("Erreur de génération de la Source 1 à partir de ".$source);
                imagecopy($image_carte ,$source1,$dst_x,$dst_y,0,0,32,32);
               }
             $dst_y=$dst_y+32;
        }
        imagecolortransparent($image_carte);
        imagepng($image_carte, "maps/".$_POST['strMapName'].".png");
        imageDestroy ($image_carte);  
        imageDestroy ($source1);

Merci à vous.