Problème imagecopy GD

Eléphanteau du PHP | 13 Messages

07 juin 2007, 20:00

Bonjour, je fais de php depuis déjà pas mal de temps mais je me suis arrêté sur un problème très spécial!

En fait pour tout vous dire, je découpe un Autotiles de RPG Maker XP pour mettre celui-ci en morceau.

Ce sont des bloques de 32 pixels de côtés et jusque là, tout va bien. Ensuite sur un dés bloque, je souhaite le couper en quatre pour les replacer sur une image de fond (là c'est de l'herbe).

Un exemple de ces Autotiles (coupé en 3*4)::
Image

Pour la première découpe en replacement avec la fonction imagecopy, tout ce passe bien.
Mais les trois autres images créée contiennent le découpage précédent alors que je n'ai pas l'impression de l'avoir demandé à php dans le code...

Pour que sa soit plus clair, voici le code ::
<?php
  $autotiles_replus = 'Zototiles'; // Répertoire regroupant les autotiles

  $zototiles = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_1.png'); // C'est le premier bloque
  $zototilesplus = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_2.png'); // C'est le deuxième bloque
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 16, 16, 0, 0, 16, 16);
  imagepng($coin, $autotiles_replus.'/hg.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 0, 16, 16, 0, 16, 16);
  imagepng($coin, $autotiles_replus.'/hd.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 16, 0, 0, 16, 16, 16);
  imagepng($coin, $autotiles_replus.'/bg.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 0, 0, 16, 16, 16, 16);
  imagepng($coin, $autotiles_replus.'/bd.png');
  imagedestroy($coin);
?>
Si je ne sauve pas les images une par une, les variables contenant ceux-ci contiennent tous la même chose ::
Image

Alors que sa doit ce présenter comme ceci (sans les carrés gris)::
Image

Pouvez-vous m'aider!!

ViPHP
ViPHP | 5924 Messages

07 juin 2007, 22:21

C'est ca que tu veux ?
<?php

  $autotiles_replus = 'Zototiles'; // Répertoire regroupant les autotiles 

  $zototiles = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_1.png'); // C'est le premier bloque 
  $zototilesplus = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_2.png'); // C'est le deuxième bloque 
  $coin = $zototilesplus; 
  imagecopy($coin, $zototiles, 0, 0, 0, 0, 16, 16); 
  imagecopy($coin, $zototiles, 16, 0, 16, 0, 16, 16); 
  imagecopy($coin, $zototiles, 32, 0, 0, 16, 16, 16); 
  imagecopy($coin, $zototiles, 64, 0, 16, 16, 16, 16);
  imagedestroy($coin); 
?>

Eléphanteau du PHP | 13 Messages

08 juin 2007, 16:11

Non, sa ne me donne pas le résultat voulu.

En fait, je ne veux pas qu'ils soit tous sur la même image donc sa me ferai 4 bloques séparés comme l'image au dessus. une image par bloque car par la suite je génèrerai une map avec des conditions de placement et pour que cela fonctionne bien je voudrai avec que des bloques de 32*32

Eléphanteau du PHP | 13 Messages

08 juin 2007, 16:21

Une petite explication pour la suite, le nombre à placer en GET (dans le lien) est de trois chiffres ce sont les trois premier du nom de l'autotile comme 006-[...]! (mapage.php?num=006)

Je vous donne mon script complet ::
<?php
$autotiles_rep = 'Autotiles'; // Répertoire regroupant les autotiles
// Vous pouvez tester en mettant l'autotile du premier post!
$autotiles_replus = 'Zototiles'; // Répertoire regroupant les autotiles

// Seulement si le nombre fait trois chiffres
if (strlen($_GET['num']) == 3) {
 $autotiles_open = opendir($autotiles_rep);

 // Scan du répertoire des autotiles
 unset($nbr, $passe);
 while ($autotiles_scan = readdir($autotiles_open)) {
  if ($autotiles_scan != '.' && $autotiles_scan != '..') {
   $autotiles_ext = substr($autotiles_scan, strrpos($autotiles_scan, '.') + 1);
   if ($autotiles_ext == 'png') {
    $nbr++;
    $autotiles_nom[substr($autotiles_scan, 0, 3)] = $autotiles_scan;
    if ($_GET['num'] == substr($autotiles_scan, 0, 3)) {$passe = 1;}
   }
  }
 }

 closedir($autotiles_open);
 clearstatcache();

 // Si le passage est confirmé et si le répertoire de sauvegarde n'existe pas!
 if ($passe == 1 && !file_exists($autotiles_replus.'/'.$_GET['num'])) {
  // On créer le répertoire de sauvegarde
  mkdir($autotiles_replus.'/'.$_GET['num'], 0700);

  // Repérage de l'autotile choisi
  $autotiles = imagecreatefrompng($autotiles_rep.'/'.$autotiles_nom[$_GET['num']]);

  // Indexation de l'Autotiles
  unset($k, $l);
  for ($j = 0; $j <= 11; $j++) {
   $autotiles_[$j] = imagecreate(32, 32);
   imagecopy($autotiles_[$j], $autotiles, 0, 0, $k * 32, $l * 32, 32, 32);
   imagepng($autotiles_[$j], $autotiles_replus.'/'.$_GET['num'].'/zoto_'.($j + 1).'.png');
   imagedestroy($autotiles_[$j]);
   $k++;
   if ($k > 2) {$k = 0; $l++;}
  }

  imagedestroy($autotiles);
  $zototiles = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_1.png');
  $zototilesplus = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_2.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 16, 16, 0, 0, 16, 16);
  imagepng($coin, $autotiles_replus.'/hg.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 0, 16, 16, 0, 16, 16);
  imagepng($coin, $autotiles_replus.'/hd.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 16, 0, 0, 16, 16, 16);
  imagepng($coin, $autotiles_replus.'/bg.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 0, 0, 16, 16, 16, 16);
  imagepng($coin, $autotiles_replus.'/bd.png');
  imagedestroy($coin);
 }
}
?>

Eléphanteau du PHP | 13 Messages

10 juin 2007, 10:11

J'ai réussi à trouver un échappatoire grace à toi 'Sékiltoyai', voici mon code ::
<?php
$autotiles_rep = 'Autotiles'; // Répertoire regroupant les autotiles
$autotiles_replus = 'Zototiles'; // Répertoire regroupant les autotiles

// Seulement si le nombre fait trois chiffres
if (strlen($_GET['num']) == 3) {
 $autotiles_open = opendir($autotiles_rep);

 // Scan du répertoire des autotiles
 unset($nbr, $passe);
 while ($autotiles_scan = readdir($autotiles_open)) {
  if ($autotiles_scan != '.' && $autotiles_scan != '..') {
   $autotiles_ext = substr($autotiles_scan, strrpos($autotiles_scan, '.') + 1);
   if ($autotiles_ext == 'png') {
    $nbr++;
    $autotiles_nom[substr($autotiles_scan, 0, 3)] = $autotiles_scan;
    if ($_GET['num'] == substr($autotiles_scan, 0, 3)) {$passe = 1;}
   }
  }
 }

 closedir($autotiles_open);
 clearstatcache();

 // Si le passage est confirmé et si le répertoire de sauvegarde n'existe pas!
 if ($passe == 1 && !file_exists($autotiles_replus.'/'.$_GET['num'])) {
  // On créer le répertoire de sauvegarde
  mkdir($autotiles_replus.'/'.$_GET['num'], 0700);

  // Repérage de l'autotile choisi
  $autotiles = imagecreatefrompng($autotiles_rep.'/'.$autotiles_nom[$_GET['num']]);

  // Indexation de l'Autotiles
  unset($k, $l);
  for ($j = 0; $j <= 11; $j++) {
   $autotiles_[$j] = imagecreate(32, 32);
   imagecopy($autotiles_[$j], $autotiles, 0, 0, $k * 32, $l * 32, 32, 32);
   imagepng($autotiles_[$j], $autotiles_replus.'/'.$_GET['num'].'/zoto_'.($j + 1).'.png');
   imagedestroy($autotiles_[$j]);
   $k++;
   if ($k > 2) {$k = 0; $l++;}
  }

  imagedestroy($autotiles);
  $zototiles = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_1.png');
  $coin = imagecreate(128, 32);
  $zototilesplus = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_2.png');
  imagecopy($coin, $zototilesplus, 0, 0, 0, 0, 32, 32);
  imagecopy($coin, $zototilesplus, 32, 0, 0, 0, 32, 32);
  imagecopy($coin, $zototilesplus, 64, 0, 0, 0, 32, 32);
  imagecopy($coin, $zototilesplus, 96, 0, 0, 0, 32, 32);
  imagecopy($coin, $zototiles, 16, 16, 0, 0, 16, 16);
  imagecopy($coin, $zototiles, 0 + 32, 16, 16, 0, 16, 16);
  imagecopy($coin, $zototiles, 16 + 64, 0, 0, 16, 16, 16);
  imagecopy($coin, $zototiles, 0 + 96, 0, 16, 16, 16, 16);
  $coinplus = imagecreate(32, 32);
  imagecopy($coinplus, $coin, 0, 0, 0, 0, 32, 32);
  imagepng($coinplus, $autotiles_replus.'/'.$_GET['num'].'/bd.png');
  imagecopy($coinplus, $coin, 0, 0, 32, 0, 32, 32);
  imagepng($coinplus, $autotiles_replus.'/'.$_GET['num'].'/bg.png');
  imagecopy($coinplus, $coin, 0, 0, 64, 0, 32, 32);
  imagepng($coinplus, $autotiles_replus.'/'.$_GET['num'].'/hd.png');
  imagecopy($coinplus, $coin, 0, 0, 96, 0, 32, 32);
  imagepng($coinplus, $autotiles_replus.'/'.$_GET['num'].'/hg.png');
  imagedestroy($coin);
  imagedestroy($coinplus);
 }
}
?>