Skip to content
This repository has been archived by the owner on Jul 24, 2020. It is now read-only.

Variables et interrupteurs

Xavier Van de Woestyne edited this page Aug 15, 2017 · 4 revisions

Une syntaxe plus légère

Les variables et les interrupteurs sont très utilisés dans la création de jeu RPG Maker. En général, les fenêtres du logiciel permettent d'affecter des variables à certaines valeurs (par exemple la position x et y d'une image ou encore les coordonnées de téléportation du héros), cependant, leur utilisation dans un appel de script est long. Pour appeler une variable et un interrupteur, la syntaxe est comme ceci :

  • $game_variables[id désiré] pour accéder à une variable
  • $game_switches[id désiré] pour accéder à un interrupteur

Le premier objectif de ce script aura été de simplifier l'accès aux variables et aux interrupteurs. Maintenant il suffit d'utiliser les lettres V (pour les variables) et S (pour les interrupteurs).
Leur syntaxe est donc comme ceci :

  • V[id désiré] pour accéder à une variable
  • S[id désiré] pour accéder à un interrupteur

Les variables

L'attribution de valeur à une variable devient donc très facile. Par exemple, pour donner la valeur 134 à la variable 98, il suffira de faire, dans un appel de script (ou dans un script complet) : V[98] = 134
Étant donné qu'il est possible d'utiliser cette syntaxe partout, il serait tout à fait envisageable de faire : V[V[12]] = V[1]+V[2]*V[3]
Ce qui correspond à dire que la valeur de la variable 12 sera l'ID de la variable que l'on modifie, et qu'on lui donnera la valeur de la variable 1 plus le produit de la variable 2 et de la variable 3. Il existe une série d'opérateur en plus de + et *, voici une liste rapide (et potentiellement non exhaustive) des opérateurs possibles :

Opérations arithmétiques

  • + Addition, par exemple V[1] = V[2] + V[3]
  • - Soustraction, par exemple V[5] = V[3] - 3
  • * Multavaitiplication, par exemple V[10] = 7 * V[9]
  • / Division entière (5/2 = 2), par exemple V[8] = 2/4 + (V[11] / 3)
  • ** Puissance (3 ** 2 = 9), par exemple V[6] = V[1] ** V[2]
  • % Modulo, le reste de la division entière, par exemple V[1] = V[2] % 4

Simplification syntaxique

Il existe un petit raccourcis syntaxique pour compresser certaines expressions :

  • x += y : x = x + y
  • x -= y : x = x - y
  • x /= y : x = x / y
  • x *= y : x = x * y
  • x %= y : x = x % y

Cette notation peut être évidemment plus complexe. Par exemple : V[1] += (10 * (V[2] ** 2)). Comme pour les opérations arithmétiques classiques, les parenthèses permettent de changer les priorités des opérations.

Même si cette extension peut sembler superflue, elle permet de gagner un temps incroyable. Je vous invite à essayer de faire l'expression précédente (V[1] += (10 * (V[2] ** 2))) en Event Making classique, vous verrez que ça prendra beaucoup plus de lignes et de temps.

Les interrupteurs

Comme pour les variables, les interrupteurs sont accessibles via un raccourci, S[ID]. On ne peut donner que deux valeurs à des interrupteurs, true, signifiant que l'interrupteur est activé ou false, indiquant que l'interrupteur est désactivé. Voici quelques expressions :

  • S[1] = true : active l'interrupteur 1
  • S[2] = false : désactive l'interrupteur 2
  • S[3] = S[1] : donne à l'interrupteur 3, la valeur de l'interrupteur 1

Opérations logiques

Alors que les variables étaient munies d'opérations arithmétiques, les interrupteurs sont liés d'opérations logiques. On peut donc combiner des interrupteurs:

  • S[1] or S[2], pouvant s'écrire aussi S[1] || S[2] renverra une expression vraie si l'un des deux est vrai
  • S[1] and S[2], pouvant s'écrire aussi S[1] && S[2] renverra une expression vraie si les deux sont vrais
  • !S[1], pouvant s'écrire aussi not S[1] renverra l'inverse de l'expression.

Comme pour les opérations arithmétiques, les opérations logiques peuvent être composées. Par exemple une expression telle que : (S[1] and S[2]) or (not S[3]) (strictement équivalente à (S[1] && S[2]) || (!S[3])) est parfaitement valide.

Constructions de valeur pour les interrupteurs

Dans RPGMaker, on a tendance à ne faire que "activer" ou "désactiver" des interrupteurs. Pour activer (ou désactiver) un interrupteur on utilise en général une condition. Par exemple : Si ma variable 5 est plus grande que 6, alors j'active l'interrupteur 3, sinon je le désactive". C'est assez verbeux et long, alors que concrètement, l'expression ma variable 5 est plus grande que 6est déjà une expression qui vauttrueoufalse. Donc on pourrait simplifier ce genre de comportement par : S[3] = ma variable 5 est plus grande que 6?`. Nous allons survoler, dans cette section, comment produire des valeurs valides pour un interrupteur. Combinés avec des opérateurs logiques, vous verrez qu'il sera possible de représenter énormément de cas de figure et donc d'économiser des conditions !

Opérateurs de comparaison

Il existe, dans Ruby, des opérateurs permettant la comparaison de valeurs. Nous allons en survoler quelques uns.

  • x == y : renvoie true si est x égal à y, false sinon
  • x != y : renvoie true si est x différent de y, false sinon. (Donc x != y est identique à !(x == y)`
  • x > y : renvoie true si est x est strictement superieur à y, false sinon
  • x < y : renvoie true si est x est strictement inférieur à y, false sinon
  • x >= y : renvoie true si est x est superieur ou égal à y, false sinon
  • x <= y : renvoie true si est x est inférieur ou égal à y, false sinon.

Au travers de ces opérateurs il est possible de composer des expressions plus complexes. Par exemple, si je veux activer un interrupteur si ma variable 13 est plus grande que ma variable 12, et que la somme de ma variable 7 et de ma variable 8 donne un multiple de deux ou simplement que l'interrupteur est déjà activé, je pourrais simplement écrire ça : S[1] = S[1] or ((V[13] > V[12]) and (V[7] + V[8])%2 == 0). Comme vous pouvez le voir, le parenthèsage me permet de m'en sortir lors de la rédaction d'expressions complexes.

Note sur les conditions

Une condition (en Ruby ou dans un évènement) n'est exécutée que si son entrée vaut true. Sinon, elle rentre dans le Sinon, le else. Donc comme un interrupteur est, en amont, toujours égal à true ou false, la condition ne s'exécutant que si un interrupteur est activé peut se limiter à :

Si Script : S[1] alors
     code si l'interrupteur est acitvé 
Sinon 
     code si l'interrupteur n'est pas activé
fin condition

Tout ce qui a été survolé précédemment est donc toujours d'actualité dans les conditions. Par exemple, je peux tout à fait formuler une question de cette forme : Si Script > V[1] == 10 and (V[3] + 4 > V[10]) and (not S[5]) Qui en français, correspondrait à "Si la variable 1 est égal à 10 et que la somme de la valeur de la variable 3 et 4 est plus grand que la valeur de la variable 10 et que l'interrupteur 5 est désactivé".

Pointeurs

On peut spécifier n'importe quelle expression Ruby valide qui retourne un entier comme index de variable ou d'interrupteur. Par exemple S[1+2+3] désigne l'interrupteur 6. Ou encore S[V[10]] qui désigne l'interrupteur dont l'index est défini par la valeur de la variable 10 ou encore V[(V[10]+V[11])*3] qui désignera la variable dont le numéro est la somme de la variable 10 et de la variable 11 multiplié par trois. Quand nous verrons les commandes, dans une section suivante, vous verrez que certaines des commandes renvoient des entiers, il serait donc très original, mais possible, en utilisant, par exemple, la commande mouse_x, qui renvoie la position X de la souris sur l'écran, de faire une expression de cette sorte : V[mouse_x], mais je ne connais pas de cas de figure où ce serait utile !

Jutsus complémentaires

Nous allons voir quelques petites techniques particulières, capables de faire gagner du temps dans des cas précis. Ces techniques ne sont pas primordiales, mais permettent de comprendre quelques petits points servant l'expressivité de RME (les exemples sont donnés pour les variables et les interrupteurs mais fonctionnent toujours que ce soit pour les variables ou pour les interrupteurs).

  • V[1], V[2] = V[2], V[1] intervertit les valeurs de la variable 1 et 2
  • S[7..29] = true active du 7ème interrupteur au 29ème interrupteur
Clone this wiki locally