[
]II) Fonctionnement et composition d'un script "Window"
Pour ce chapitre, nous allons nous intéresser à la méthode "refresh", en effet, c'est la portion de codes la plus "importante".
Tout d'abord, une petite définition :
refresh signifie "rafraichir" en anglais, en effet,
cette méthode s'exécutera toutes les frames lorsque que la fenêtre s'affichera.
refresh contient en effet les instructions codant pour l'affichage du contenu de la fenêtre.
Commençons à remplir les lignes :p
Comme cette méthode est un processus permanent (en gros qui tourne tout le temps), la première instruction consiste à effacer ce que vous avez afficher la frame précédente, car peut-être qu'entre ces deux frame, le joueur a fait une action qui doit modifier l'affichage, et par conséquent, il vaut mieux effacer les choses précédentes, et ne pas afficher par dessus, ça fait désordre ^^
Par exemple, on pourrait prendre le cas d'une fenêtre qui affiche en direct sur la map les points de vie du héros. La plupart du temps, elle ne bouge pas, mais si par exemple le héros reçois un coup, alors la valeur des HP ne sera plus la même, et donc la fenêtre doit
mettre à jour son affichage, le rafraichir en quelque sorte... d'où le nom ! (la boucle est bouclée ^^).
Ainsi, juste en dessous de "def refresh" mettez le code (l'instruction) :
- Code: Tout sélectionner
self.contents.clear
qui signifie littéralement "effacer.le contenu.de self" c'est à dire de la fenêtre...

Une fois ceci fait, on peut mettre tout le texte que l'on veut !
Maintenant intéressons nous à l'affichage du texte proprement dit.
Pour afficher du texte dans une fenêtre, cela se fait par le code suivant :
- Code: Tout sélectionner
self.contents.draw_text(x, y, w, h, "Texte")
Cela signifie que le mot "Texte" s'écriera dans la fenêtre. Sa position en abscisse est de x (en pixel, attention à ne pas dépasser la largeur de la fenêtre ^^), sa position en ordonnée est de y (en pixel), la largeur du mot est de w (en pixel) et sa hauteur est de h...
Alors, vous allez me dire : "qu'est-ce que j'en sais moi de la largeur du mot, je l'ai pas mesuré !" et vous n'aurez pas tord ^^
C'est pour cela qu'on a inventer les deux commandes suivantes :
- Code: Tout sélectionner
contents.text_size("Texte").width
- Code: Tout sélectionner
contents.text_size("Texte").height
Je pense que vous aurez compris,
la première instructions mesure la largeur exacte du mot "Texte", en tenant compte de la taille de la police, de la police et aussi de l'état du mot (gras ou italique).
La deuxième instruction fait de même pour la
hauteur, mais elle est bien moins utilisée car peu utile mis à part si on a gros gros mot, on met souvent h = 32 pixels (pour la hauteur donc).
Ce n'empêche que c'est bien pratique ! :p
Alors concrètement, pour l'utiliser, on fait comment ?
Et bien juste avant le
- Code: Tout sélectionner
self.contents.draw_text(x, y, w, h, "Texte")
on définit une variable qui va être égale à la largeur du mot (ou sa hauteur), et puis après on met cette variable à la place de h, en gros on fait ça :
- Code: Tout sélectionner
w = contents.text_size("Texte").width
self.contents.draw_text(x, y, w, h, "Texte")
Et comme ça, "le jeu" connait la largeur du mot "Texte" avant de l'afficher...

Vous aurez remarquez que j'utilise une variable locale (voir la partie du cours si vous vous ne vous rappelez plus ^^), c'est plus propre, et ça permet d'utiliser plein de fois dans des script différent le même nom :p
Ainsi, dans votre petit script de test, vous pouvez copier le code ci-dessous, et remplacer les valeurs de x et y par ce que vous voulez, et h par 32 par exemple...
N'oubliez pas les guillemets qui entoure votre texte ! C'est super important !
Vous savez écrire du texte ! Youpi ! ^^
Mais approfondissons... on peut faire plus fort :
Il est possible d'afficher le contenu d'une variable, qu'elle soit une chaine de caractère (string) ou un nombre...
Il suffit pour cela de remplacez "Texte" (votre texte donc) sans les guillemets, par votre variable genre : "@ma_variable" ou "$votre_variable_adoré" à condition que votre variable contienne du
texte...
Si votre variable contient un
nombre (comme la variable qui contient les HP du héros principal), genre :
- Code: Tout sélectionner
@ma_variable = 6
et bien pour ceci mettez
- Code: Tout sélectionner
@ma_variable.to_s
Il faut donc mettre ".to_s" en plus (j'y reviens un peu plus tard).
En résumé : => Si votre variable à afficher contient du texte (chaine de caractères ou string) mettez directement la variable :
- Code: Tout sélectionner
self.contents.draw_text(x, y, w, h, @ma_variable)
=> Si votre variable à afficher contient un nombre (valeur numérique) alors rajoutez ".to_s" à la fin de votre variable :
- Code: Tout sélectionner
self.contents.draw_text(x, y, w, h, @ma_variable.to_s)
Je peux pas être plus clair ^^
Et pour faire tout aussi fort, sachez qu'il est possible
d'aligner son texte !
Et oui, on peut rajouter après "Texte" un petit ",s" où l'on définit "s" pour définir l'alignement (on a donc ceci:
- Code: Tout sélectionner
self.contents.draw_text(x, y, w, h, @ma_variable, s)
Si s n'existe pas dans votre code ou si il est égale à 0 (par défaut donc) le texte est aligné à gauche, ainsi on a :
- Si s = rien ou s = 0 : aligné à
gauche- Si s = 1 :
centré- Si s = 2 : aligné à
droiteVoilà vous savez tout ! ou presque ^^
J'aimerais revenir un instant sur ce que j'ai dit tout à l'heure sur le ".to_s", nous allons approfondir notre connaissance des variables.
En effet, une variable peut contenir deux types d'informations (texte ou valeur), ça, vous le savez, en revanche ce que vous ne savez peut-être pas, c'est qu'en fait, une variable à toujours les deux types d'informations qui sont contenue...
Gné ? ^^
Et bien en fait, on dit qu'une variable à une partie "symbole" et une partie "chaine", plus exactement, on peut transformer une chaine de caractère en symbole, et l'inverse.
Par exemple :
prenez "@ma-variable = 8"
- Code: Tout sélectionner
8
est la partie
symbole de @ma_variable
- Code: Tout sélectionner
"8"
est la partie
chaine de @ma_variable
Ainsi, quand on fait ".to_s" on récupère le symbole en chaine de caractères et si on fait ".to_sym" on récupère le symbole...
Regardez ceci :
- Code: Tout sélectionner
@ma_variable = 8
@ma_variable.to_s = "8"
@ma_variable.to_sym = 8
@ma_variable.to_sym.to_s = @ma_variable = 8
Comprenez ? Tant mieux ! Car c'était juste une petit parenthèse :DD
Abordons désormais l'affichage d'image dans une fenêtre.
En effet il est tout à fait possible d'afficher une imgae à l'intérieur d'une fenêtre, c'est ce qui se passe lorsque vous voyez l'icône d'un item par exemple dans le menu objets...
Et bien, pour afficher une image, il suffit de mettre l'instruction :
- Code: Tout sélectionner
img = RPG::Cache.icon("Nom_de_l'image")
pour tout d'abord définir de quelle image on parle (vous noterez qu'il y a marqué "icon", cela veut dire que le programme va chercher dans vos icônes le nom que vous avez marqué, mais si vous voulez qu'il prenne votre image dans Pictures, remplacez "icon" par "picture") puis ensuite il faut mettre :
- Code: Tout sélectionner
self.contents.blt(x, y, img, Rect.new(0, 0, w, h), o)
Étudions et décortiquons un peu tout cela : tout d'abord, il faut notez que l'on a changé de méthode d'affiche, jusqu'à présent on avait
- Code: Tout sélectionner
self.contents.draw_text
maintenant on a
- Code: Tout sélectionner
self.contents.blt
Pour le reste de la formule, je ne vous ré-explique pas à quoi correspondent le x et le y ni le w et le h, mais notez tout de même que c'est deux derniers sont définis dans une boite (Rect) et non directement, je n'irai pas plus loin pour ne pas vous embrouiller ni entrer dans des choses trop théorique, et somme toute, peu intéressantes ^^.
Ce qu'il ne faut pas oublier dans l'expression
- Code: Tout sélectionner
self.contents.blt(x, y, img, Rect.new(0, 0, w, h), o)
c'est le "img", c'est à dire qu'
il ne faut pas oublier de mettre les coordonnées de notre images, que nous avons "résumé" dans la
variable locale "img" (mais vous pouvez l'appeler comme vous voulez).
Et puis vous aurez remarquer le "o" en fin d'instruction, il désigne
l'opacité de l'image, ce qui peut être plutôt utile des fois, cependant cette donné n'est pas obligatoire, et donc l'instruction marche même si vous avez ça :
- Code: Tout sélectionner
self.contents.blt(x, y, img, Rect.new(0, 0, w, h))
N'oubliez que par défaut l'image est opaque, donc l'opacité est égale à 255 (et donc 0 signifie transparent).
Nous en avons terminé (pour cette partie) avec notre méthode "refresh" n'oubliez pas les "end" pour mettre fin à votre méthode, et aussi à la classe.
Voilà, vous avez vu déjà pas mal de choses, vous pouvez faire désormais des trucs assez intéressants, d'ailleurs, vous allez pouvoir illustrer votre nouveau savoir dans un "TP", juste après le chapitre suivant.

[
]III) Liste de balises
Pour pouvoir réaliser concrètement et facilement des fenêtres, je vous ait réunis les balises dont nous avons parlé plus haut, voici donc une liste dans laquelle allez piocher si besoin est.
N'oubliez pas que toutes ces balises (syntaxes) sont aussi sur le manuel d'aide dont je vous ait parlé en 1° partie, même si il est moins clair, aidez-vous de ça, surtout si vous avez besoin de renseignements spécifiques, comme "comment désigner les Hp du héros" où "le nombre de pas parcourus"
- Général :- Code: Tout sélectionner
$game_switches[ID]
Désigne un switch d'id "ID"- Code: Tout sélectionner
$game_variables[ID]
Désigne une variable d'id "ID"- Code: Tout sélectionner
to_s
Méthode à appliquer à une variable contenant un chiffre pour afficher ce chiffre (récupère sous forme de caractère le nombre mémorisé).- Code: Tout sélectionner
to_sym
Méthode inverse(réciproque) de "to_s" : à appliquer à une variable contenant un caractère pour récupérer un nombre au lieu d'une chaine de caractère (inutilisable en fenêtre, sert uniquement aux calculs).- Design :- Code: Tout sélectionner
self.windowskin
Désigne le windowskin (l'habillage) de la fenêtre.- Code: Tout sélectionner
RPG::Cache.windowskin("Nom_du_windowskin")
Désigne le windowskin de nom : "Nom_du_windowskin". Rendre égale ceci à "self.windowskin" pour que le windowskin de la fenêtre soit "Nom_du_windowskin".- Code: Tout sélectionner
self.contents
Désigne le contenue de la fenêtre.- Code: Tout sélectionner
self.contents.font.name
Désigne le nom de la police d'écriture utilisée pour les textes de la fenêtre.- Code: Tout sélectionner
self.contents.font.size
Désigne la taille de la police d'écriture utilisée pour les textes de la fenêtre.- Code: Tout sélectionner
self.contents.font.color
Désigne la couleur de la police d'écriture utilisée pour les textes de la fenêtre.- Code: Tout sélectionner
Color.new(r, g, b, l)
Représente une couleur codée selon la méthode RGB (RedGreenBlue). Le "r" représente le taux de rouge, le "g" le taux de vert, le "b" le taux de bleue et "l" le taux de luminosité.
r,g,b, et l varient entre 0 et 255 uniquement. Rendre égale un "Color.new(r, g, b, l)" à un "self.contents.font.color" permet de définir la couleur de la fenêtre.- Code: Tout sélectionner
self.contents.font.bold
Si cette expression est rendue égale à "true" alors le texte qui va suivre sera en gras.- Code: Tout sélectionner
self.contents.font.italic
Si cette expression est rendue égale à "true" alors le texte qui va suivre sera en italique.- Fenêtre :- Code: Tout sélectionner
self.contents.clear
Efface le contenue de la fenêtre.- Code: Tout sélectionner
self.contents.draw_text(x, y, w, h, "Texte", s)
Affiche dans la fenêtre le mot "Texte" au point de coordonnée (x,y) d'une largeur "w" et d'une hauteur "h", avec un alignement "s".- Code: Tout sélectionner
self.contents.blt(x, y, img, Rect.new(0, 0, w, h),o)
Affiche dans la fenêtre l'image définie dans la variable "img" d'une largeur "w" et d'une hauteur "h" au point de coordonnée (x,y) avec une opacité "o"(variant de 0 à 255 avec 255 = opaque).- Code: Tout sélectionner
RPG::Cache.icon("Nom_de_l'image")
Désigne l'icône de nom "Nom_de_l'image".
- Code: Tout sélectionner
RPG::Cache.picture("Nom_de_l'image")
Désigne l'image de nom "Nom_de_l'image".