JeuWeb - Crée ton jeu par navigateur
[PHP] Génération de perso dynamique - 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 : [PHP] Génération de perso dynamique (/showthread.php?tid=3536)

Pages : 1 2 3


[PHP] Génération de perso dynamique - Allwise - 14-01-2009

La discussion sur le système de vêtements m'a donné envie de développer ce petit outil. Encore une fois, ce qui me motive c'est d'offrir la possibilité à un joueur de télécharger son perso.
Y a pas de front end par contre, autant le back-end je l'utiliserai probablement un jour, autant le front-end que j'utiliserai je sais pas à quoi il ressemblera.

Les partisans du server-side sont peu nombreux, mais je poste quand ma contrib, ça pourra toujours servir Smile

1. Avant propos
===========
Le script utilise la librairie graphique ImageMagick et l'extension pecl Imagick. Vous devez les installer à tout prix pour que ça marche. Si certains ne peuvent pas le faire parce qu'ils sont sur du mutualisé mais veulent l'utiliser, je peux le refaire avec GD. Le script est très minimaliste et peu testé, voyez la une base, pas un truc fini.

2. Configuration
============
Pour le faire fonctionner, vous devez régler un certain nombre de choses. Tout d'abord, il vous faut vos images Smile Ensuite, il faut que vous déterminiez les différents types d'images qui apparaitront sur votre perso : yeux, casque, armure, barbiche... Ainsi que leur position et leurs dimensions. Il vous faut un répertoire accessible en écriture pour le cache, et je crois que c'est tout. Vous pouvez aussi choisir le format de sortie ( le jpg est le plus rapide ), le taux de compression, les dimensions de vos éléments.

3. Exemple d'utilisation
===============
Vous retrouverez l'exemple dans l'archive :
Code PHP :
<?php 
/*
* On instancie l'objet cache.
* 1er argument : temps de vie
* 2eme : répertoire
*/
$cache = new Perso_Cache('cache/', 3000);

/** config du perso */
$cfgPerso = array(
'imgFile' => 'images/perso.png',
'imgWidth' => 200,
'imgHeight' => 400,
'imgFormat' => 'jpg');

$perso = new Perso_Img($cfgPerso);

/** On définit quelles images on va lui ajouter */
$cheveux = new Caracteristique_Cheveux('images/cheveux1.png', 1);
$yeux = new Caracteristique_Yeux('images/yeux1.png', 2);
$bouche = new Caracteristique_Bouche('images/bouche1.png', 3);

/** on les ajoute */
$perso->add($cheveux);
$perso->add($yeux);
$perso->add($bouche);

/** nom du fichier cache */
$filename = implode('-', $perso->getItemsIdList());
if (
false === $file = $cache->load($filename))
{
/** on enregistre le fichier via la classe perso */
$perso->save($cache->cacheDir.$filename);

/** et on récupère le contenu pour l'afficher */
$file = $perso->render();
}

/** on définit le content-type propres au format de l'image */
$perso->setHeaders();

/** On affiche l'image */
echo $file;
Ce bout de script crée un perso, y ajoute des cheveux, des yeux et une bouche.

4. Notes
=========
Le système de cache a été développé à la va-vite. Si, comme Ruz, vous envisagez de stocker plusieurs centaines de milliers de fichiers, ce serait pas mal de le modifier pour qu'il gère des sous-répertoires.
Certains autres trucs ont été fait rapidos et n'ont pas été testés ( gitan que je suis )...
Niveau perf, je l'ai pas assez testé pour dire ce qu'il vaut, et surtout je n'ai aucune base pour faire des comparaisons. En tout cas, pour générer 100 images jpg, il m'a fallu 5.6 sec sur mon P4 au bureau.
Ne vous moquez pas de mon perso de test, j'ai pas la "fibre artistique" :p
Un jour, je serai amené à l'utiliser et donc à l'faire évoluer. Vos suggestions sont les bienvenues.
D'ores et déjà, je prévois d'ajouter la gestion du fond transparent ( actuellement on peut choisir la couleur de fond ), une meilleure gestion de l'ordre d'apparition / superposition des images, et un listing dynamique des images ( un listing de répertoire, ou BDD ).

5. Téléchargement
=============
Click !


RE: [PHP] Génération de perso dynamique - Ruz - 15-01-2009

(14-01-2009, 11:54 PM)Allwise a écrit : Le système de cache a été développé à la va-vite. Si, comme Ruz, vous envisagez de stocker plusieurs centaines de milliers de fichiers, ce serait pas mal de le modifier pour qu'il gère des sous-répertoires.

"Centaines de milliers de fichiers"???
Oufti, je suis un grand malade, mais pas à ce point ^^
testerai ca à l'occasion ^^


RE: [PHP] Génération de perso dynamique - Argorate - 15-01-2009

Personnellement, pour mon jeu je suis amener à empiler plusieurs images pour former l'image total d'un perso. Certes c'est loin d'être de super graphisme, mais ça passe.

Par contre je trouve que tu compliques tout avec ce système^^ (deja mettre de l'objet pour ça me fait doucement rireSmile)
Puis devoir installer des librairie graphique et autres... Juste pour faire un truc tout simple, j'avoue que je trouve ça un peu ridicule. (dsl je veux pas être méchant, mais je cherche a comprendre. J'ai peut être mal interprété le sujet justement? :heuuuSmile
Si le but de la manip c'est d'arriver a créer l'image d'un perso en empilant des images représentant: les cheveux, vêtement, couleur de peau... etc, alors tu as un truc tout simple qui marche parfaitement, compatible IE et FF, et qui est natif!
Cela s'appel des <div>! Oui... oui! Avec des propriétés de style comme le z-index et le positionnement relatif/absolute, on peut facilement arriver à empiler autant d'images qu'il en faut pour que cela donne forme a son perso. (h)


RE: [PHP] Génération de perso dynamique - Allwise - 15-01-2009

Pour la lib graphique, j'utilise IM parce qu'elle est plus performante que GD.
Ensuite, je te remercie de m'avoir appris une solution alternative avec des divs, j'y avais pas pensé :good:
Enfin, le but de cette méthode est, une fois de plus, la création d'une image qui doit pouvoir être téléchargée. Ce qui est impossible à réaliser avec la méthode sus-citée Smile C'est si difficile que ça à comprendre ?

Et l'objet... bah je sais pas quoi répondre à ça, si ça t'a fait sourire c'était pas le but mais ça me fait quand même plaisir Wink


RE: [PHP] Génération de perso dynamique - Argorate - 15-01-2009

Oui, dans le cas où tu veux la DL, je suis d'accord qu'avec les div, on aurait du mal! Big Grin

Mais c'est a quel fin, c'est juste pour que l'utilisateur puisse voir son perso en faite?


RE: [PHP] Génération de perso dynamique - Anthor - 15-01-2009

Le problème du Div, c'est qu'on ne peux pas resizer, ce qui est vite emmerdant quand tu as un listing ou tu voudrais un avatar plus petit Smile


RE: [PHP] Génération de perso dynamique - Hakushi - 15-01-2009

Oui les div, c'est une technique que je ne recommenderais pas. Ca pause trop de contraintes et beaucoup trop chiant a mettre en place par rapport a un builder via GD (ou ImageMagik) qui se fait assez facilement et te permet d'avoir autant de format que tu le souhaites et le tout en une seule image, ce qui est bien mieux au niveau de la structure de ta page (imagine 10avatars a afficher, ca en fait du div inutile ^^ )

En tout cas travail interessant Allwise, je jeterais un coup d'oeil au source, peut y avoir de quoi qui m'interesse Wink


RE: [PHP] Génération de perso dynamique - Harparine - 15-01-2009

Salut !

Une autre solution serait de faire ton truc en flash pour ensuite générer une image jpeg. L'utilisation des masques peut être très intéressante, ainsi que les changements de couleurs. Pour vous donner une idée, je développe un générateur d'avatars avec ce système : http://gwenole.stephant.free.fr/tests/avatars/ (c'est loin d'être fini !)

@+


RE: [PHP] Génération de perso dynamique - Hakushi - 15-01-2009

Ouais, si je retrouve ça dans les trefonds de mes fichiers freelance, j'ai un truc en php qui prend des "snapshot" d'un SWF, c'est assez puissant et tres pratique.
En tout cas joli boulot deja sur ton charabuilder Wink


RE: [PHP] Génération de perso dynamique - Harparine - 15-01-2009

Merci ! J'utilise aussi le code de snapshot : le développeur a fait un travail formidable Wink