Tout, tout, tout sur les variables !
[Partie 1/2 : Variables ? Modifier variables ? Déjà trop de choses à dire !]
Introduction
RPG maker a plusieurs atouts, mais s'il y a bien un outil sans lequel on ne pourrait pas programmer grand chose, ce sont les variables !
Alors pour cela il faut bien connaître les utilités des variables, il y en a mille !
Ce tutoriel vous explique comment fonctionnent les variables, comment s'en servir, il vous introduit tout ce qui est indispensable pour devenir le meilleur maker.
Je n’expliquerais pas tout ce qu’on peut faire avec les variables, puisqu’on peut quasiment faire tout ce qu’on peut imaginer. (Jusqu’à une certaine limite, tout de même !)
Euh... mais d'abord, c'est quoi, une variable ?
Mais, fou ! Une variable, C’EST UNE BOÎTE ! Rien de plus qu’une boîte ! :idea:
Une boîte à l’intérieur de laquelle on met un nombre, tout simplement !
C'est une variable dans le sens où le nombre varie, grâce aux modifications que vous lui apportez (Rendre égal, additionner, soustraire, multiplier, diviser... "moduler" ?)
On peut choisir d'en avoir autant qu'on veut, RPG maker nous limite à 5000 variables, (2003 tout du moins, permettez moi la flemme de vérifier sur les trois autres) ce qui est largement suffisant ! Je vous apprendrais à les économiser très efficacement, avec ma super méthode custom des variables fourre-tout et variables temporaires, mais dans un autre tutoriel ! Avant d’économiser, c’est déjà bien de savoir utiliser !
Les variables nous permettent ainsi de :
- Mémoriser un nombre
- Faire divers calculs
- Récupérer une information
- Faire des conditions
- Devenir un maker libre
- Et même plus !
Caractéristiques d'une variable
Quand vous jouez à votre jeu depuis l'éditeur, vous pouvez consulter en direct l’état de vos interrupteurs et variables dans le jeu en pressant la touche F9. Le joueur en revanche ne pourra pas le faire, comme il lancera le jeu directement depuis l'exécutable, ce debug-mode n'est accessible que lorsqu'on lance le jeu depuis l'éditeur !
La première fenêtre, c’est les 20 premiers interrupteurs, mais en pressant les touches gauche et droite, haut et bas, vous pouvez naviguer pour regarder l’état de tous les interrupteurs, mais surtout des variables.
(Exemple sous RPG Maker 2003, mais c'est la même chose sous tout RM)
1- ID de la variable :
Super méga important à comprendre pour la suite : Il faut bien distinguer l’ID de la variable, du nom de la variable ! Le nom de la variable c’est comme un commentaire, ça sert juste à se repérer, ça n’a aucune incidence sur le jeu on s’en fout, on peut le modifier quand on veut. L’ID de la variable, c’est comme le véritable nom de la variable, celui qui ne change pas, qui est fixe. On verra plus tard que c'est cet ID que l'on utilise, lorsqu'on pointe une variable.
2- Nom de la variable :
Quand vous commencez votre projet, aucune variable n’a de nom, tout comme les interrupteurs. C’est à vous de nommer les variables que vous utilisez, comme vous le voulez, simplement pour vous repérer !
3- Valeur de la variable :
Toujours entière (Pas de virgule) et peut aller de -9999999 à 9999999.
Très important : Quand on démarre le jeu, toute ces variables sont à zéro !
C'est à vous, dans vos événements, de modifier leurs valeurs quand vous voulez.
La commande "Modifier variable"
C’est grâce à cette commande magique que vous allez changer la valeur d'une variable comme vous le souhaitez !
Elle se situe ici :
(Exemple sous RPG Maker 2003)
Sur les autres RPG Maker :
Spoiler (cliquez pour afficher)
(Exemple sous RPG Maker XP)
(Exemple sous RPG Maker V
Cette commande est décomposée en trois parties :
(Exemple sous RPG Maker 2003, on verra les différences !)
A- Variables à modifier
Dans les variables à modifier, tu peux choisir de modifier une seule variable, un ensemble de variables, voir même une variable définie par une autre variable. (ouh !)
1- Une seule variable
C'est le plus simple, tu choisis la variable à modifier... Eh oui ! C'est vrai !
(Exemple sous RPG Maker 2003, mais y'a pas à tortiller du cul, c'est la même chose sous tout RM)
- a) Rangement des variables :
Cette partie sert à parcourir les variables par paquets de 20. (Excepté ce gros rebel d'XP où ce sont des paquets de 25)
Le paquet choisi dans ce screen est "[ 0001-0020 ]", on peut donc voir les 20 premières variables. (d’ID 1 à ID 20)
Si on cherche la variable dont l’ID est 186, il suffit de cliquer sur [ 0181 – 0200 ], qui affichera dans la partie "c" les variables d’ID 181 à 200. (Incluant donc la 186 ème)
- b) Nb max d’éléments :
Ce bouton sert à définir le nombre maximum de variables accessibles (Et donc étendre la partie "a"), par défaut le maximum est 100, ou 50, ici j'ai monté le maximum à 306 variables.
- c) Les variables :
C'est la liste des variables (de 0001 à 0020, comme choisis dans la partie "a") c'est ici que tu vois toute tes variables, c'est l'une d'entre elles que tu vas choisir.
- d) Nom de la variable :
C'est ici que l'on nomme nos variables, nommez vos variables suivant le contexte, ça ne modifie pas votre jeu, c'est pour vous repérer vous-même, savoir à quoi elle sert. Faites bien attention à bien nommer toute les variables que vous utilisez, et donner des noms explicites, sinon vous vous perdrez vite !
2- Plusieurs variables !
C'est tout con, les deux chiffres que tu entre là sont des ID de variables, et forment un intervalle (fermé). Toute les variables dont l’ID est comprise dans cette intervalle seront modifiées.
Dans l’exemple, nous avons 3..7, ce qui veut dire que les variables d’ID 3 à ID 7 seront modifiées.
C’est très utile par exemple pour réinitialiser un grand nombre de variables d’un coup, ce qui correspond simplement à les rendre égale à 0 ou un autre nombre.
3- Une variable d’après une variable ! (RM 2003 ONLY !)
Sachez que cette option n’existe pas pour RPG Maker XP, VX, Ace… Elle n’existe que pour RM2003 et 2000… ET C’EST UNE HONTE !!! x(
Mais bien sûr, il est facile de le faire en une ligne de script, par exemple :
Pour exprimer la variable pointée par la cinquième variable :
- Sous XP, VX et Ace, on écrit : $game_variables[$game_variables[5]]
Enfin bref, je poursuis mon explication pour RPG Maker 2003 :
Prenons un exemple :
<> Modifier variable : d'après la variable "0025: Bilou", additionner 5
Dans cet exemple, ce n'est pas la variable "Bilou" qui se verra additionnée de 5, mais la variable pointée par "Bilou".
Qu'est-ce que ça veut dire ??
Ça veut simplement dire que la valeur contenue dans "Bilou", sera considérée comme l'ID de la variable à modifier.
Si "Bilou" est égal à 5, la variable pointée par "Bilou" (et donc, la variable modifiée) sera la variable d'ID 5.
Si "Bilou" est égal à X, la variable modifiée sera la variable d'ID X.
C'est vraiment simple !
Mais à quoi ça sert ??
C’est là qu’il faut un peu d’imagination !
Imaginez par exemple qu’on fait exactement la même succession d’opérations chiantes sur plusieurs variables. Ben au lieu de répéter à chaque fois ces opérations en changeant pour chacune les variables qu’elles opèrent, il suffit d’utiliser "D'après la variable X", et répéter l’opération (Par une boucle, un appel d’événement fréquent, voire même un copier/coller) en changeant juste la variable qui stocke l’ID de la variable pour laquelle on effectuera l’opération.
L'exemple ci-dessus, appliqué avec des boucles et conditions de sortie de boucle, formerait l'algorithme que vous voulez !
Même sans parler d'algorithme, voici un exemple plus concret : Dans un A-RPG en événement, si chaque monstre a sa propre variable "PV", d'ID différente... En copiant/collant le monstre, il faudrait à chaque fois modifier les actions pointant la variable "PV" du monstre précédent pour pointer la variable "PV" du nouveau monstre... C'est chiant !!
"Variable seule à varier d'un copier/coller à l'autre" = "ID seule de la variable qui varie" = "Il faut stocker cet ID dans une autre variable, et la pointée par celle-ci !"
En utilisant à chaque fois une variable pointée par une autre, à l'intérieure de laquelle on mettrait l'ID de la variable PV du monstre, on peut s'arranger dans RPG maker 2003 pour faire une page où on définit juste la valeur d'une variable, et cette page serait appelée à chaque fois avec "Appeler événement : Page x de l'événement x" (Encore une action possible uniquement sous 2003, qu'on va voir plus bas !)
C'est un exemple un peu compliqué ! (Qui se fait détruire par les variables locales de l'Event Extender) Mais si vous savez utiliser ça intelligemment, vous pourrez faire des codes plus intelligents ! (ho ho)
B- L'opération
C'est pas compliqué à comprendre, dans cette partie on choisit si on rend égal, additionne, soustrait, etc la partie C à la partie A, bref :
1- Rendre égal, additionner, multiplier, soustraire…
Rendre égale(s) à :
On rend égal la/les variable(s) choisie(s) dans partie "A" du panneau à la valeur choisie dans la partie "C" du panneau.
(En script, on peut faire : $game_variables[ce qu'on veut] = ce qu'on veut)
Additionner :
On additionne la valeur choisie dans la partie "C" du panneau à la/aux variable(s) choisie(s) dans la partie "A" du panneau.
(En script, on peut faire : $game_variables[ce qu'on veut] += ce qu'on veut)
Multiplier :
On multiplie la/les variable(s) choisie(s) dans partie "A" du panneau par la valeur choisie dans la partie "C" du panneau.
(En script, on peut faire : $game_variables[ce qu'on veut] *= ce qu'on veut)
Soustraire :
Vous ne me croiriez pas si je vous disais ce que ça fait !
2- BEWARE la division !!
(En script : $game_variables[ce qu'on veut] /= ce qu'on veut)
Faites bien attention ! Pour la commande "diviser" !!
Ne faites JAMAIS une division par zéro, cela fera planter le jeu avec une jolie erreur.
Veillez à ce que la valeur avec laquelle vous divisez (Partie "C", opérande) ne soit jamais égale à zéro ! Quand on choisis directement le nombre on ne va pas mettre zéro, mais si on fait diviser par "la valeur d'une variable", il faut faire très attention que cette variable ne soit jamais égale à zéro !! C’est pareil si vous divisez par "la valeur d'une variable pointée par une variable", veillez à ce que la variable pointée ne sera jamais zéro.
Sinon, ben je rappelle que les variables n’ont pas de virgule, et ça se fait par troncature. C’est-à-dire que 2/3 = 0, au lieu de 0.666666.
3- Le modulo, c’est rigolo !
Pour RPG Maker, le modulo est très utile ! (Si si... !) Et contrairement à ce que j’ai dis plus haut, on apprend tous implicitement ce qu’est le modulo… A l’école primaire !
(En script : $game_variables[ce qu'on veut] %= ce qu'on veut)
Une définition toute bête :
Le modulo est le reste de la division euclidienne ! Comme indiqué sur cette jolie image :
Donc, pour "A/B = C", on a en réalité : "A/B = C + Reste/B"
Ou bien : "A = B*C + Reste"
Or : Reste = A – B*C = "A modulo B"
En faisant la division "A/B", nous comptons combien de fois il y a le nombre "B" dans le nombre "A", le reste, c'est ce qu'il reste du nombre "A" si on lui retire "X" fois le nombre "B".
Un exemple "école primaire-styyyle" :
A la récréation, 5 enfants veulent se partager 13 billes.
Combien de billes auront chaque enfant ?
- 13/5 = 2.6 ... Ils ont au moins 2 billes chacun ! ...Mais il en reste !
Il reste combien de billes ?
- Reste = 13 modulo 5 = 3 ... Il reste 3 billes !
Les enfants n'ont plus qu'à se foutre sur la gueule à coup de billes pour se départager le reste.
Je ne vais pas vous dire tout ce qu'on peut faire avec ici, ce sera plus pertinent d'en faire un tutoriel à part, promis, je le fais plus tard !
Un moyen tout bête de connaître la valeur d'un modulo :
Tapez "nombre" modulo "nombre" sur google !
Exemple : 5 modulo 6, sur google, vous verrez la jolie calculatrice de google vous donner le résultat !
L'Opérande !
Nous y voici enfin, à la partie la plus important de la commande "Modifier variable(s) !"
Après le "1.3. Une variable d’après une variable !" exclusif à RM2003, on va vraiment voir ici les différences entre les différents RM !
(Comparaison de l'opérande entre chacun des quatre RM)
- Les indices rouges correspondent aux actions qui disparaissent dans la version suivante.
- Les indices verts correspondent aux actions nouvelles à partir de la version correspondante.
1- Par un nombre
Ici, vous pouvez entrer un nombre entre -9999999 à 9999999.
C'est cool, hein ? Oui.
Vous me croyez si je vous dis que si on met 53 ici, puis "addition" en opération (Partie "B"), ça additionnera 53 à la valeur de la variable choisie en partie "A" ? Vous êtes près à croire n'importe quoi !
2- Par la valeur d'une variable
Ici, vous pouvez choisir une variable, de la même manière que vous le faite dans "A - 1" !
L'opérande sera alors la valeur de la variable choisie. Si on fait modifier variable "V[35]" += valeur de "V[20]", on additionne la valeur de la 20 ème variable à la 35 ème variable ! Si V[35] stockait le nombre 53, et V[20] stockait le nombre 10, la nouvelle valeur de V[35] sera 53+10 = 63.
MAGIQUE !
Comme expliqué dans "B - 2", faites attention quand vous divisez par la valeur d'une variable, cette variable ne doit jamais être égale à 0 !
3- Par la valeur d'une variable pointée par une variable (2003 ONLY!)
On retrouve l'exclusivité de RM 2003 une fois de plus sur RM 2003... Logique...
Je ne vais pas m'embêter à vous ré-expliquer tout, retournez à la partie "A - 3", c'est exactement la même chose, mais pour l'opérande !
Encore une fois, comme expliqué dans "B - 2", faites attention quand vous divisez par la valeur d'une variable pointée par une variable... S'il s'avère que cette variable pointée est égale à 0 à un moment donné... C'est le plantage !
4- Par un nombre aléatoire entre deux valeurs
Rien de compliqué à comprendre, vous choisissez deux nombres, par exemple -5 et 8, et ça vous donnera un nombre aléatoire entre ces deux là, -5 et 8 compris.
C'est évidemment l'option adéquat pour tout ce qui peut être aléatoire dans votre jeu. Des objets, un pierre-feuille-ciseaux, la chance de voler un objet, etc.
Pour exprimer par exemple "20% de chance d'avoir l'objet X", on rend égal une variable à une valeur aléatoire entre 1 et 100, si la variable est inférieure à 20, nous gagnons l'objet.
5- Par le nombre d'objets....
C'est pratique genre tu veux par exemple faire un événement avec un mec qui te demande de lui donner par exemple dix potions. Tu stocke le nombre de potions dans une variable, et tu fais une condition "si variable "nombre de potion" supérieur ou égal à dix" et le tour est joué.
Sous RMVX Ace
On peut voir que pour VX Ace, les objets sont séparés des armes, qui sont séparées des armures.
C'est logique puisque les trois sont séparés dans la base de donnée, alors que sur les versions antérieures tout était dans "Objet"
Qu'est ce que ça change ? Rien du tout !
Équipé(e)s/ Possédé(e)s (RM 2003 ONLY!)
Ici, RM 2003 a quelque chose en plus que les autres RM : En plus de choisir l'objet, on peut choisir si on stocke le nombre en possession, ou le nombre équipé. Sur les autres RM, on peut uniquement stocker la quantité possédée d'un objet, et non le nombre de fois qu'un objet est équipé. Mais on peut comprendre pourquoi ça a disparu, puisque déjà sur la version 2003 on pouvait directement faire une condition "Si "héros X" est équipé de "Objet X"".
En fait, ça peut s'expliquer par le fait que dans RM 2003, si on fait une condition dans les événements de combats d'un groupe de monstre, les choix sont différent que si on fait une condition dans un événement normal. Du coup, la condition "Si "héros X" est équipé de "Objet X" n'existe pas en combat, alors que "Modifier variable(s)" reste inchangé, et permet alors de savoir si tel objet est équipé. Depuis RM XP, les conditions en combat sont les mêmes que hors combat, alors ça peut confirmer cette hypothèse.
On peut aussi se dire que 2003, avec ça, il est plus facile de faire en sorte par exemple qu'une porte s'ouvre uniquement si les quatre héros ont chacun une certaine amulette d'équipée, directement en stockant le nombre d'amulettes équipées dans une variable. Alors que sur les versions plus récentes, nous sommes obligés de faire plusieurs conditions pour vérifier si les héros ont bien tous l'amulette d'équipée, et gare à nous si l'équipe peut varier avant d'arriver devant la porte, car il faudrait en plus de ça contrôler si le personnage est dans l'équipe avant de contrôler s'il a l'amulette d'équipée !
Par contre, si trois héros ont bouclier X d'équipé, ça donne 3, idem pour le casque, l'accessoire, l'armure... SAUF... L'arme ? Quel que soit le nombre de héros ayant l'arme X d'équipé, si on stocke dans une variable combien d'arme X est équipée, il renverra toujours 1, sinon 0 si aucun héros n'a l'arme d'équipée... Je suppose qu'il s'agit là d'un bug de RM. Heureusement nous avons réussis à vivre avec jusqu'à aujourd'hui !
6- Par la caractéristique d'un héros
(Caractéristiques disponibles sur un héros, suivant le RM)
Les screens sont tronqués, sachez qu'il n'y a pas qu'un menu déroulant, mais deux, le second servant à choisir le héros parmi la liste des héros définis dans la base de donnée.
Là tu peux stocker dans ta variable toute les caractéristiques du héros !
C'est très pratique pour programmer un menu au lieu d'utiliser le menu de base, tout en utilisant quand même les caractéristiques de bases.
Je ferais un tutoriel pour montrer différentes façons d'afficher un nombre sur l'écran. (Événements, pictures, évent extender...)
On peut aussi imaginer que dans VX Ace, la caractéristique "Chance" influe sur certaines actions, comme la chance d'avoir un objet rare quand on ouvre un coffre, ou la chance de réussite quand on drague une fille... Idem pour l'intelligence, le fait de pouvoir récupérer la valeur de ces caractéristiques dans une variable permet plusieurs possibilités en role-play ! =)
Nombre d'armes, armures, etc. de... (RM2003 ONLY!)
Encore une exclusivité de notre bon RPG Maker 2003 !
Alors vous me direz, quelle est l'utilité de connaître le nombre d'arme équipée qu'aurait un héros, si ce n'est que ça renverrait 0 ou 1 puisqu'il ne peut avoir qu'une seule arme d'équipée ?
Cela ne stocke pas le nombre d'armes, d'armures, ou autre, mais l'ID de l'arme équipée, l'ID de l'armure équipée, l'ID du casque équipé... !
Si l'épée du héros est le 58 ème objet de la liste d'objet, c'est donc la valeur "58" que prendra V[35] si on fait "modifier variable V[38] rendre égal à : Héros X, nombre d'armes équipée" !
Encore une information bien étrange puisque, comme expliqué plus haut, il existe aussi la condition "si héros X a l'objet Y équipé". On peut à nouveau faire l'hypothèse des conditions différentes en combat que hors combat sous RM2003, car en effet, ça devient utile dans les événements de combat.
Mais c'est assez utile si on veut programmer un menu, ou un système de combat, puisqu'on peut directement savoir quel objet est équipé, au lieu de contrôlé pour chaque objet s'il est ou non équipé. C'est aussi l'occasion de contrôler rapidement si deux héros ont un équipement en commun
7- Par la caractéristique d'un monstre
Cette option n'est utile qu'en combat, car effectivement, on ne choisit pas le monstre en fonction de son ID dans la base de donnée, mais en fonction de son ID dans le combat. (Par exemple si c'est le premier monstre, le deuxième, le troisième...)
Il est possible alors en plein combat de stocker les PV de tel monstre, et le faire parler en conséquence. Il est surtout possible de faire une attaque "Scan" en combat, qui permettrait de connaître chaque caractéristique du monstre en question !
Présent dans RM2003 ?
En effet, je n'ai pas trafiqué le screenshot affiché plus haut, et pourtant, on ne le voit pas !
C'est simplement parce que le screenshot, je l'ai fais dans un événement normal, et non dans un événement de combat ! Quand vous faites "Modifier variable(s)" dans un événement de combat, vous verrez cette partie ajoutée. C'est plus intelligent en effet comme cette option n'est utile qu'en combat et non à l'extérieur.
Il remplace justement le "8 : L'Événement" qui a l'inverse n'est utile qu'à l'extérieur des combats.
8- Information sur un événement !
(Caractéristiques disponibles sur un événement, suivant le RM)
Les screens sont tronqués, sachez qu'il n'y a pas qu'un, mais deux menus déroulants. Le second est justement l'événement concerné. On peut alors pointer n'importe quel événement créé sur la carte... Mais surtout, il est possible de pointer "Héros" ou "Cet événement" !
ID de la carte :
Tout d'abord, sachez que cette option n'a pas disparu après RM2003, elle a simplement été déplacée dans "9 : Autre" ! Et en effet, c'est plus intelligent comme ça, puisque que ça ne dépend pas d'un événement... Les événements qu'on peut choisir sont ceux de la map active, ils ont donc tous le même "ID de la carte". Enterbrain s'est donc rattrapé depuis XP !
Ça sert à stocker l'ID de ta carte, très pratique pour vérifier dans un événement fréquent si le joueur est sur telle ou telle carte. C'est d'autant plus pratique dans la mesure où depuis XP, l'action "Mémoriser la position du héros" a disparue, puisqu'en effet on peut directement utiliser ces options. Sur RM2003, c'est aussi le seul moyen de détecter dans un événement fréquent si le héros change de carte. (Excepté certains procédés barbares et ignobles)
Pour connaître l'ID d'une carte, il suffit d'aller dans ses propriétés, à l'endroit même où vous définissez son chipset, la musique de fond, sa taille, les combats aléatoires... Où ça ? Où ça ? Ben c'est simplement dans le nom de cette fenêtre "propriété" !
Depuis RMXP, il est également possible de voir l'ID de la carte directement dans la barre d'information en bas de l'éditeur.
Coordonnée X carte, Y carte de tel événement :
La bataille navale, ce bon vieux jeu de société, vous connaissez ?
Feu en F8 ! BOUM ! Touché !
...Non ? Ben tant pis.
Les coordonnées X, Y carte sont les coordonnées de l'événement ou du héros... Sur la carte !
Imaginez que votre carte, avec ses carreaux, forme un tableau :
- On a les colonnes de 0 à "Largeur de la map -1"
- On a les lignes de 0 à "Hauteur de la map -1"
- Le carreau tout en haut à gauche de la map a les coordonnées X=0, Y=0
- Le carreau tout en bas à droite de la map a les coordonnées X=LargeurMap-1, Y=HauteurMap-1
(Exemple sous RMVX Ace, mais c'est pareil pour tout RM, excepté dans le 2003 où on ne voit pas l'ID de la map ici, mais dans les propriétés de la map. J'ai simplement nommé les colonnes et lignes du tableau que forment les carreaux de la map pour que vous situiez tout ça)
Comme vous pouvez le voir sur le screen d'exemple, en cliquant sur n'importe quel carreau de votre map, vous pouvez directement voir ses coordonnées en bas à droite de l'éditeur de map.
Grâce à cette option, il est possible de stocker dans une variable la coordonnée X ou Y d'un événement ou du héros, ce qui est très pratique pour savoir si un événement se trouve à une position donnée, si par exemple on peut déplacer un gros cube, et on doit le pousser jusqu'à le poser sur un interrupteur, il suffit de stocker dans deux variables les coordonnées X et Y du gros cube, et faire deux conditions imbriquées : La première, par exemple, si "Variable X" = 5, la seconde, par exemple, si "Variable Y" = 8, on sait que le gros cube est placé sur l'interrupteur de position X=5, Y=8.
Direction de tel événement :
Cette option permet de stocker dans une variable la direction d'un événement.
Pour savoir à quel chiffre correspond une direction, c'est simple !
Il suffit de regarder votre pavé numérique :
7 8 9
4 5 6
1 2 3
0 suppr.
(Super pavé numérique !)
Et là c'est beau, on voit directement que :
8 = Haut
4 = Gauche
6 = Droite
2 = Bas
C'est visuel, bien pensé, bref, c'est l'ID de chacune des directions !
Vous me direz, c'est possible de faire directement une condition "Si "Tel événement" direction : "Telle direction"", et vous avez raison, c'est plus rapide que de stocker la direction de l'événement dans une variable, et de contrôler le chiffre donné ! Mais c'est une manière directe de mémoriser la direction du héros ou d'un événement, un moment donné, comme lorsque vous voulez téléporter votre héros et conserver sa direction.
Coordonnée X écran, Y écran de tel événement :
On a déjà fait les coordonnées X et Y ! Pourquoi y en a encore ? Y a-t-il deux type de coordonnées différente ??
Eh oui, coordonnée X et Y carte, c'est la position d'un événement sur la carte, par carreau.
Mais coordonnée X et Y écran, c'est la position de l'événement par rapport à l'écran ! Et cette position est au pixel près ! Et non pas à partir du point 0,0 de la carte mais à partir du point 0,0 qui est le premier pixel en haut à gauche dans la fenêtre de jeu !
(Exemple sous RMVX Ace, bien sûr j'ai ajouté les règles en haut et à gauche sous photoshop, n'allez pas chercher ça sous RM !)
Si cela nous donne la position à l'écran d'un pixel sur l'événement/le héros... Oui mais lequel ?
Quel que soit la version de RPG Maker, il s'agira toujours du point en bas au centre du sprite (charset) de l'événement, celui-là même :
(Point à partir duquel on récupère la coordonnée X, Y écran, situé tout en bas verticalement, au centre du sprite horizontalement. C'est à partir de ce point que le sprite est affiché dans le jeu.)
A quoi sert de savoir où se trouve un événement au pixel près à l'écran ?
Sur RM2003, c'est parfait pour afficher une image pile sur le héros, ou sur un événement ! C'est toujours possible sur les versions plus récentes, sauf que comme c'est moins bien, c'est plus difficile de faire une image qui suit les déplacements du héros/de l'événement, puisqu'il y a toujours un décalage de temps entre le moment où l'image est affichée, le moment où le sprite du héros/de l'événement est affiché, et le moment où les coordonnées écran sont calculées. Mais sous RM2003, soyez-en certain, vous pourrez synchroniser l'affichage d'une image sur le héros ou un événement sans problème !
Pour tout RM, c'est surtout parfait pour avoir des collisions précises au pixel près. En effet, au lieu de contrôler si X, Y carte d'un événement = X, Y carte d'un autre événement, pour vérifier si les deux événements se superposent, ici on peut savoir qu'ils entrent en collision au pixel près, et même faire des hit-box dimensionnées au pixel près, simplement en manipulant bien comme il faut les coordonnées X et Y écran ! Et voilà, votre A-RPG devient précis au pixel près, et personne ne viendra vous embêter à dire que c'est débile de faire un A-RPG sous RM à cause de la mauvaise précision du carreau par carreau !
ID du terrain de... (RMXP ONLY! ...Ou presque !)
Exclusivité RMXP cette fois-ci, on peut ici récupérer l'ID du terrain du carreau se trouvant en dessous de l'événement/du héros.
C'est le genre d'outil très utile pour faire des bruits de pas, des ronds dans l'eau, des trous qui font chuter le héros dedans, etc. Il suffit de vérifier si le héros ou l'événement se trouve positionné sur tel ID de terrain.
C'est d'ailleurs il me semble la seule utilité de l'option "Terrain" dans l'édition des chipset sous RMXP :
(Comment modifier les terrains sous RMXP)
En mode "Terrain", on peut assigner à chaque carreau du chipset un numéro compris entre 0 et 7, ce qui permet 8 type de sols différent, pour programmer ensuite des actions si on est sur tel terrain.
Par exemple, si je veux que le héros tombe s'il marche dans un trou, il suffit que je mette l'ID "1" par exemple aux carreaux de trous d'un chipset, et dans un événement en processus parallèle, sur la map en question, il n'y a qu'à faire "modifier variable "ID terrain" = Héros : ID du terrain", suivi de la condition "Si "ID terrain" = 1" pour coder simplement à l'intérieur la chute du héros !
Ne vous méprenez pas, RMXP n'est pas le seul à pouvoir récupérer l'ID d'un terrain !
C'est simplement le seul à le faire de cette manière ! ^^
- Sous RM2003 on verra qu'on peut même définir jusqu'à 5000 terrains différents, et qu'il y a une action "Stocker l'ID d'un terrain" toute prévue pour stocker l'ID du terrain à n'importe quelle position dans une variable.
- Sous RMVX Ace, ça ressemble déjà plus à RMXP puisqu'on assigne l'ID du terrain exactement de la même manière, et une fois de plus, on peut aller jusqu'à 7. Sauf qu'il faut utiliser l'action "Récupérer une information..." que l'on verra plus tard.
- Seul RMVX a perdu toute notion de "Terrain", puisqu'on ne peut même pas configurer le tileset comme on veut, oubliez ce logiciel, caca, pas bien !
VX Ace c'est mieux. v_v
9- Autre ?
Ouf, on sort enfin de l'explication sur les informations sur les événements, c'est fou ce que ça fait écrire, six petites options !
(Options dans "Autre" selon les différents RM)
ID de la carte :
J'ai déjà expliqué ce que ça donnait plus haut, la seule différence c'est que depuis XP, ça a été déplacé dans "Autre", alors que sous RM2003, c'était dans "Événements"
Taille de l'équipe :
Cela renvoi simplement le nombre de personnages qu'il y a dans l'équipe. Très utile pour mon tutoriel "Réorganiser l'équipe en événement".
Argent possédé :
Ça permet de stocker le nombre de fric que le joueur a dans une variable. Très utile pour faire des événements où on demande au joueur de payer une certaine somme. On peut directement savoir s'il a la somme en question en sa possession.
Nombre de pas (Non présent sous RM2003)
N'importe quel joueur serait frustré de ne pas savoir le nombre de pas qu'il a fait pendant le jeu !
Blagues à part, ne sous estimez pas l'utilité de cette option (Même si je ne l'ai jamais utilisée) C'est très utile si on veut faire des combats aléatoires sans utiliser l'aléatoire par défaut, mais c'est surtout très utile pour savoir si le héros s'est déplacé ou non. A savoir que faire une condition "Si touche "haut" est pressée" ne suffit pas à savoir si le héros a effectivement fait un pas vers le haut !
Temps de jeu (Non présent sous RM2003)
Cela donne le temps pendant lequel le joueur a joué depuis le début de sa partie. C'est cool.
Comme le résultat est donné en seconde, si vous voulez calculer le nombre de minutes et le nombre d'heures que ça fait, c'est assez simple :
Admettons que les variables "Heure" "Minutes" et "Secondes" dont les ID se suivent strictement, et auraient par exemple pour ID "50, 51, 52" :
<> Modifier variable : plusieures [50..52] = Temps de jeu
<> Modifier variable "50 : Heure" diviser par 3600
<> Modifier variable "51 : Minutes" diviser par 60
<> Modifier variable "51 : Minutes" modulo 60
<> Modifier variable "52 : Secondes" modulo 60
QUELLE MAGNIFIQUE DEMONSTRATION D'UTILISATION DU MODULOOOOO !!! *_*
Comme ça, direct, la classe ! =)
La flemme d'expliquer par contre ! Je le ferais certainement pour le tutoriel des modulos !
Chronomètre
Dans RM 2003, on a "Secondes restantes du chrono 1" et "Secondes restantes du chrono 2", mais c'est simplement parce que RM 2003 propose deux chronomètres, et les autres n'en ont qu'un seul.
Encore une fois, on peut s'amuser à calculer pour séparer les minutes des secondes. ^^
Je crois qu'à part RM2003, il n'est pas possible par défaut d'empêcher l'affichage du chronomètre à l'écran. (Je n'ai fait que survoler) En admettant qu'on fasse un script pour empêcher son affichage, il est possible de l'afficher en événement, ce qui est un peu stupide. Pour RM2003 c'est directement utile puisqu'on peut effectivement masquer le chronomètre, et que nous n'avons pas de script, c'est plus joli de faire un chronomètre en pictures !
On peut aussi afficher le temps restant du chronomètre dans un message, on verra ça plus tard !
Nombre de sauvegardes,
Nombre de combats (RM2003/VX Ace only),
Nombre de victoires, de défaites, de fuites (RM2003 only)
Ces options là, à part afficher ces résultats dans le menu, à la fin du jeu, ou comme dans Zelda Ocarina of Time, sur un petit écriteau dans la chambre du héros... Ce n'est pas très utile, mais ça peut être utile.
Pour le nombre de fuites, exclusif à RM2003, c'est possible de programmer un événement en processus parallèle qui se moque de toi à chaque fois que tu sors d'un combat en fuyant, il suffit de faire :
<> Modifier variable "Fuites OLD" = Nombre de fuites
Boucle
<> Modifier variable "Fuites NEW" = Nombre de fuites
Condition : Si "Fuites NEW" supérieur à "Fuites OLD"
<> Message : "Ouh, la grosse tapette que voilà ! Il fuit comme un bébé !"
<> Sortir de la boucle
Fin de condition
<> Attendre 5 frames
Fin de boucle
Voilà qui devrait encourager le joueur à faire du LVL up au lieu d'esquiver les combats ! (Ou l'encourager à quitter le jeu... A méditer !)
Il est également possible sous RM2003 de féliciter le joueur lorsqu'il a atteint un certain nombre de victoires, en lui offrant un petit plus ! Là ça fait plus plaisir !
Il est aussi possible sous RM2003 et VX Ace, quand vous voulez, de forcer le héros à faire par exemple 5 combats aléatoires... Pourquoi pas ! Il suffirait de faire :
<> Modifier variable "Victoires START" = Nombre de victoires
Boucle
<> Modifier variable "Victoires NB" = Nombre de victoires
<> Modifier variable "Victoires NB" soustraire "Victoires START"
Condition : Si "Victoires NB" == 5
<> Message : "Bravo, tu as gagné 5 combats comme un grand !"
<> Sortir de la boucle
Fin de condition
<> Attendre 5 frames
Fin de boucle
Au lieu d'utiliser une boucle, c'est possible de mettre la première ligne la première fois qu'on parle au personnage qui nous défie, et le contenu de la boucle (Excepté le "Sortir de la boucle") pour les fois où on lui parle après le défi lancé.
Temps (ms) depuis le début du MIDI (RM2003 only)
Ça mesure bien le temps de la musique, mais certainement pas en millisecondes.
Après un test rapide avec un midi que j'ai créé, et une documentation sur la norme MIDI, j'ai eu ma confirmation !
Cette option mesure la durée de la musique... Sur l'échelle rythmique propre à la musique ! O_o
C'est l'unité de temps propre au MIDI dont il s'agit ! ...En division de battement !
Sachant que la durée d'un battement dépend du tempo ! Le tempo lui-même peut varier dans la musique... Il est quasiment impossible de calculer à combien d'unité de temps MIDI correspond une certaine durée !
Si vous ne vous touchez pas un peu dans la musique, ça sert à rien de cliquer ici !
Spoiler (cliquez pour afficher) Bonjour les musicos !
Vous savez que dans un fichier MIDI, on peut choisir le tempo !
Et que le tempo, ça correspond au nombre de battement par minute
Et qu'un battement ça correspond à une note noire ?
Vous savez aussi qu'en notation rythmique, on peut aller jusqu'à la quadruple croche, qui représente 1/16 ème de battement/note noire ?
Ben sachez que dans le midi, un battement ne se limite pas à 16 divisions... Mais à 480 divisions !
C'est ce nombre de division jouées depuis le début du MIDI qui est stocké dans la variable, avec cette option ! Donc si votre MIDI ne dure que quatre mesures, et qu'il est en quatre temps, ça fait 4*4 battements = 16 battements, *480 = 7680 divisions !
Admettons que ces divisions, on appelle ça une "unité de temps MIDI"
On peut aussi identifier ce nombre directement avec la notation rythmique utilisée en musique :
1 quadruple croche = 30 unité de temps MIDI
1 triple croche = 60 unité de temps MIDI
1 double croche = 120 unité de temps MIDI
1 croche = 240 unité de temps MIDI
1 noire = 480 unité de temps MIDI
1 blanche = 960 unité de temps MIDI
1 ronde = 1920 unité de temps MIDI
Mais comment convertir un temps en minutes et secondes, en unité de temps MIDI ?
C'est faisable uniquement si le tempo est constant pendant toute la musique !
Si par exemple, toute votre musique est à tempo 120, le tempo par défaut du MIDI, vous savez que :
- 120 correspond à 120 battement par minute
- Un battement correspond à 480 unité de temps MIDI
- Tempo 120 correspond à 120*480 = 57600 unité de temps MIDI par minute !
Si vous voulez effectuer une action lorsque la musique est à 3 minutes et 58 secondes
- D'abord, sortez votre calculette, et passez ces minutes et secondes en minutes uniquement : 3+58/60 = 3.96667 minutes
- Maintenant, multipliez par le 57600 udtM/min correspondant au tempo 120 :
- (3+58/60)*57600 = 228480 udtM !
On sait maintenant que sur un MIDI à tempo constant à 120, 3min et 58sec correspondent à 228480 unité de temps MIDI !
On peut réduire ce raisonnement en une seule formule magique :
- Temps en udtM = (min+sec/60)*(tempo*480) !
Par contre, sachez que RM fait du 60FPS, c'est à dire 60 frames par secondes.
Le "attendre 0.0sec" est un leurre, ça correspond à "attendre 1 frame", soit 1/60 ème de seconde.
Ce qui veut dire qu'à l'instant t où vous stockez le temps du MIDI dans la variable, cette valeur est précise à 1/60 ème de seconde près.
Vous savez combien d'unité de temps MIDI il peut se passer en 1/60 ème de seconde ? Une fois encore, ça varie en fonction du tempo !
- 1/60 ème de seconde = 1/3600 ème de minute = 1/3600*57600 udtM = 16 udtM.
A tempo 120, la valeur donnée est précise à plus ou moins 16 unité de temps MIDI.
Tout ça pour dire, NE FAITES JAMAIS une condition "Si "Temps" = ...", car non, ça ne sera jamais "égal". Démerdez vous avec ">", "<", ">=", "<=", mais jamais "=" !
Voilà, pour un tempo constant, vous savez quand même manipuler un peu cette unité... Pour un tempo qui varie, c'est plus difficile à exploiter !
Mais en revanche, il est possible de faire des trucs marrant, du genre synchroniser un événement sur le tempo de la musique, quel qu'il soit ! Par exemple faire sauter un événement sur chaque pulsation, ou changer la couleur de l'écran sur chaque pulsation... Pour enfin tuer une bonne fois pour toute tous les épileptiques de la terre !
Je vous donne une solution qui fonctionne, et admirez encore la magie des modulo ! *_*
Bref, dans un PNJ en processus parallèle, regardant par défaut à gauche on peut mettre :
Boucle
<> Modifier variable "Différence de temps" = Temps (ms) depuis le début du MIDI
<> Modifier variable "Différence de temps" modulo 480
<> Attendre 0.0 Sec
<> Modifier variable "Nouveau temps" = Temps (ms) depuis le début du MIDI
<> Modifier variable "Nouveau temps" modulo 480
<> Modifier variable "Différence de temps" soustraire "Nouveau temps"
Si variable "Différence de temps" supérieur à 0
<> Déplacer/Modifier : Cet événement, Tourne de 180°
Fin de condition
Fin de boucle
Le PNJ se balancera de droite à gauche au rythme des battements de la musique !
Faites varier le tempo de la musique... Le PNJ suivra réellement le tempo !
Ici j'ai fais "modulo 480" ce qui correspond au nombre de udtM restants qui ne forment pas un battement complet, dès que ce résultat tombe à 0, ça veut dire qu'un nouveau battement est joué. Si vous faites "modulo 960", le PNJ se balancera de droite à gauche non pas sur les notes noires, mais sur les notes blanches. Idem, si on met 240, le PNJ battra les croches... C'est FUN !
Mais comme on ne peut pas faire "Si "Temps" = 0", comme je l'ai expliqué plus haut, j'ai justement joué avec le fait qu'il y ait forcément une différence de udtM après 0.0sec !
C'est alors cette différence même que je calcule, et contrôle.
Si le udtM est en train de monter, la différence entre "udtM avant 0.0sec", et "udtM après 0.0sec", sera forcément négative, puisque "udtM après 0.0sec" sera forcément plus grand que "udtM avant 0.0sec".
Vous me suivez ?
Si maintenant, pendant ces 0.0sec, udtM est retombé à "0", alors la différence entre "udtM avant 0.0sec" et "udtM après 0.0sec" n'est plus négative... Mais positive ! Et VLAM !
Comme votre personnage se dandine avec une précision de 0.0sec... 1/60 ème de seconde c'est vraiment imperceptible, vous pouvez être rassuré, il aura bien... LE RYTHME DANS LA PEAU !
Pour ceux qui n'aiment pas la musique, n'y comprennent rien, qui font parti de ces gens qui n'écoutent que ce qui passe en discoboîte ou sur radioboîte, avec des superpositions de riff tout fait qui n'ont rien à voir entre eux et qui détruisent les oreilles, je vous donne quand même une solution ultime pour détecter si le MIDI est terminé, et pouvoir faire ce qu'on veut pile à la fin du MIDI (du genre, jouer un nouveau MIDI) :
Boucle
<> Modifier variable "Différence de temps" = Temps (ms) depuis le début du MIDI
<> Attendre 0.0 Sec
<> Modifier variable "Différence de temps" soustraire Temps (ms) depuis le début du MIDI
Si variable "Différence de temps" supérieur à 0
<> Ce qu'on veut
Fin de condition
Fin de boucle
Avec ça, "Ce qu'on veut" interviendra à chaque fois que la musique recommencera.
Ici, je veux savoir quand est-ce que le temps de la musique revient à 0, RM suit effectivement le cours de la musique, jusqu'à reconnaître quand elle retourne à 0.
Mais, comme je l'ai déjà expliqué en masqué, mais il est parfaitement inutile de faire "Si "Temps" = 0", car la valeur peut trop varier d'une fraction de seconde à l'autre. Alors je mesure la différence de temps, et regarde si elle est positive ou négative, dès que la valeur est retombée à 0, la différence sera forcément négative.
Qu'en est-il des MP3 ?
Eh bien, cette option fonctionne aussi pour les MP3 ! (Qui sont natifs depuis la version 1.05 de RM 2003)
Par contre, c'est beaucoup plus gentil qu'une unité de temps MIDI, ici... Cela renvoi une valeur en seconde !
Cette valeur est bel et bien correcte, et tient compte du changement de tempo que l'on peut faire dans RPG Maker, par exemple, si on lance une musique qui dure 61 secondes à tempo 150%, dans le jeu, la musique sera plus rapide et ne durera que 40 secondes, mais à la fin de la musique, RPG Maker va quand-même donner la valeur 61 car il comptera non pas en seconde réelles, mais donnera vraiment le temps écoulé du mp3.
Comme cette valeur est en seconde, c'est beaucoup plus simple de la manipuler et on peut faire des conditions "Si temps = ..." sans scrupule. (Contrairement aux MIDIs, pour lesquels, je le répète, la valeur donnée change trop rapidement, ce qui veut dire qu'il est inutile de faire la condition "si "temps midi" = 125" par exemple, car la valeur peut sauter directement de 119 à 132 sans passer par la valeur 125.)
10- Script ? (RMVX Ace only)
Maintenant, avec VX Ace, on peut rendre une variable égale à la valeur donnée par un script !
C'est rigolo !
Mais sous XP et VX, on peut faire la même chose, mais sans passer par la commande "Modifier variable", en passant par la commande "Script"
VX Ace propose simplement de le faire plus rapidement, puisqu'on n'a plus que l'opérande à écrire en script.
Les scripts vous filent la migraine ? Sachez que vous pouvez directement par exemple taper "1+5/50*80" en opérande, le résultat sera la valeur de l'opérande !
Vous pouvez aussi faire le "Variable pointée par la variable" de RM2003 directement en écrivant en opérande :
$game_variables[$game_variables[ID QUE VOUS VOULEZ]]
Ou, bien plus joli avec l'Event Extender :
V[V[ID QUE VOUS VOULEZ]]
Ça permet aussi de faire des événements plus courts, au lieu de vous embêter à faire :
<> Modifier variable "A" = 5
<> Modifier variable "B" multiplier par 8
<> Modifier variable "A" soustraire variable "B"
<> Modifier variable "A" modulo 50
On peut directement faire :
<> Modifier variable "A" = Script : "(5 – 8*V[ID])%50"
Avec V[ID] la notation du magnifique Event Extender, sinon vous devez vous embêter avec "$game_variables[ID]" qui est nettement moins joli !
Bref, je m'arrête là pour les scripts, car comme vous le savez, les possibilités en script ne se mesurent pas ! Alors ça peut être un premier pas dans l'appréhension des scripts, si vous débutez !
11- Équipe ? (RMVX Ace only)
(La possibilité de savoir quel est le premier, second, etc., personnage de l'équipe... Enfin... Sous VX Ace !)
Ici, on peut stocker dans la variable l'ID du héros se trouvant en première position, en seconde, etc. !
J'espère qu'après toute cette lecture, vous intégrez un peu mieux la notion d'ID, l'ID du héros c'est simplement sa position dans la base de donnée, dans le premier onglet "Héros"
Pourquoi m'embêter à vous expliquer les possibilités de cette option, si vous avez déjà un beau tutoriel tout prévu à cet effet ?
Conclusion
Enfin ! C'est fini pour la commande "Modifier variable(s)" !
Vous remarquez maintenant que derrière une petite action toute simple se cache énormément de possibilités ! Alors si avant de lire ce tutoriel, vous ne saviez pas du tout comment utiliser les variables, vous pouvez mesurer un petit peu à côté de quoi vous êtes passés jusqu'à présent !
Cette deuxième partie vous apprendra l'étendue du pouvoir des variables dans plein d'autres commandes de RPG Maker ! Finissez donc votre apprentissage et devenez le meilleur maker ! Bilou !
Mis à jour le 10 décembre 2020.
Source
- Joke, « Tout, tout, tout sur les variables ! », Bilou Corp, posté le 2 novembre 2013 [consulté le 10 décembre 2020], https://www.biloucorp.com/tout-tout-tout-sur-les-variables-partie-1-2-6
|