❤ 0 Combiner expressions faciales
Souvent dans un Visual Novel, les personnages vont changer de pose, d'expression faciale, de vêtements.
Pour ne pas devoir préparer tous les combinaisons possibles entre ces divers éléments, RenPy offre la possibilité de construire l'image d'un personnage par couches.
Pour l'exemple, j'utiliserai ces quelques images :
bob_base.png
bob_content.png, bob_cool.png et bob_colere.png
bob_lunettes.png
Il est important que vos images n'aient pas d'espaces dans leur nom, sinon RenPy risque d'être confus à cause d'ambiguïtés. Préférez des tirets du bas (underscores) ! Si vous mettez des espaces dans vos noms d'images, vous allez avoir des bugs d'affichage sans comprendre d'où ils viennent.
Déclarer une image à couches
Pour déclarer une image à couches dans RenPy, nous n'allons pas utiliser le mot clé "image", comme pour les images plates, mais le mot clé "layeredimage".
1
2
3
4
| layeredimage bob:
...
define b = Character('Bob', color="#959500", image="bob") |
Quand on définit juste après notre personnage "b", on mentionne la layeredimage en tant qu'image.
Je vais utiliser une couche pour la pose, une couche pour l'expression faciale, et une couche pour les accessoires. Chaque couche est déclarée avec le mot clé "group". Les couches sont déclarées dans l'ordre de superposition.
1
2
3
4
5
6
7
8
9
10
| layeredimage bob:
group pose:
....
group emotion:
....
group accessoire:
.... |
Ensuite, je vais déclarer les différentes possibilités pour chaque couche avec le mot clé "attribute". Je vais donner un nom à chaque attribute, puis lier l'image qui correspond à cette variante.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| layeredimage bob:
group pose:
attribute debout default:
"images/bob_base.png"
group emotion:
attribute content default:
"images/bob_content.png"
attribute cool:
"images/bob_cool.png"
attribute colere:
"images/bob_colere.png"
group accessoire:
attribute lunettes:
"images/bob_lunettes.png" |
Notez le mot clé "default" apposé sur les attributes "debout" du group "pose" et "content" du group "emotion". Cela signifie que ce sont les variantes par défaut. Si on ne précise rien à RenPy, ce sont ces variantes qui seront utilisées.
Si les images de certaines couches (expressions faciales, accessoires...) sont beaucoup plus petites que l'image de base (pose), vous pouvez afficher le group avec un décalage (offset) en utilisant la commande pos(x,y) :
1
2
3
4
5
6
| group emotion:
pos (200, 100)
attribute content default:
"images/bob_content.png"
attribute cool:
"images/bob_cool.png" |
Dans l'exemple ci-dessus, le coin haut-gauche des images d'expressions faciales seront décalées de 200 pixel vers la droite et de 100 pixels vers le bas.
Ne croyez pas que recadrer vos expressions faciales pour retirer la grande zone de vide tout autour sera d'une quelconque utilité. En réalité, Ren'Py optimise automatiquement les images contenant de la transparence, donc ça ne sert à rien de recadrer manuellement toutes vos images.
Utiliser l'image à couches dans le jeu
Voyons maintenant comment afficher notre image à couches lors du jeu.
On peut mentionner les attributes soit après la commande show, soit entre l'initiale du personnage et la ligne de dialogue.
J'ai préparé la scène suivante :
1
2
3
4
5
6
7
| label start:
scene bikini bottom
show bob
b "Bonjour !"
b colere "Je suis prêt..."
b content lunettes "...pour aller pêcher la méduse !" |
La commande suivante :
va afficher "bob_base.png" (pose par défaut), "bob_content.png" (expression faciale par défaut) sans lunettes (aucun accessoire par défaut).
La commande suivante :
1
| b colere "Je suis prêt..." |
va afficher "bob_base.png" (pose par défaut), "bob_colere.png" toujours sans lunettes.
La commande suivante :
1
| b content lunettes "...pour aller pêcher la méduse !" |
va afficher "bob_base.png" (pose par défaut), "bob_content", et "bob_lunettes.png".
Remarquez que dès qu'un attribute est mentionné, cet attribut reste en place pour les lignes de dialogue suivantes, jusqu'à ce qu'un autre attribute du même group soit mentionné en remplacement.
Si vous ne souhaitez pas seulement remplacer un attribute par un autre attribute du même group, mais carrément l'effacer, c'est-à-dire que vous ne voulez plus afficher aucun attribute de ce group, c'est possible en plaçant un signe "-" devant l'attribute :
1
| b -lunettes "Je retire mes lunettes." |
<p class="margedix">
Petite subtilité :
Notez qu'on écrit
mais
1
| b colere "Bonjour, grrr !" |
parce que la commande "show" prend en paramètre une image (ici "bob") tandis que la ligne de dialogue nécessite un locuteur (ici "b").
Appliquer une transformation à une image à couches
Il est possible d'appliquer une transformation, par exemple un zoom ou une matrice colorimétrique, à une layeredimage avec le mot clé "at" :
1
2
3
4
5
6
7
8
9
10
11
12
| transform transformation_nuit:
zoom 0.75
matrixcolor TintMatrix("#7373bf")
layeredimage bob:
group pose:
...
group emotion:
...
group accessoire:
...
at transformation_nuit |
Ici le "at" a été placé au même niveau que les groups, donc toute la LayeredImage sera teintée. Il est aussi possible de placer le "at" dans un group, au même niveau que les attributes, pour affecter uniquement une couche.
Remarque : les matrixcolors ne font leur apparition qu'à partir de la version 7.4 de RenPy.
Il est possible de faire la même chose de façon moins "RenPy" et plus "Python" avec la commande At() :
1
2
3
4
5
| transform transformation_nuit:
zoom 0.75
matrixcolor TintMatrix("#7373bf")
image bob_nuit = At(bob, transformation_nuit) |
ou encore LayeredImageProxy() :
1
| image bob_nuit = LayeredImageProxy(bob, transformation_nuit) |
Si vous bidouillez beaucoup votre Visual Novel en Python, ces commandes pourraient vous être utiles.
Consultez la documentation officielle de RenPy pour voir toutes les transformations que vous pouvez appliquer à une image : https://www.renpy.org/doc/html/atl.html
Pour aller plus loin avec les images à couches, consultez la documentation Ren'Py : https://www.renpy.org/doc/html/layeredimage.html
|