Bienvenue visiteur !
|
Statistiques
Liste des membres
Contact
Mentions légales
405 connectés actuellement
30732435 visiteurs depuis l'ouverture
2414 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
◂
| Classer des variables dans l'ordre croissant/décroissant
(Pour RM2000/2003 surtout) Voici une technique simple qui permet d'indexer plusieurs variables dans un groupe de variables pour les classer de la plus petite variable à la plus grande, ou inversement. | Ecrit par Joke le 10/10/2008 |
▸
|
❤ 1Gari Ce tutoriel fonctionne pour toute les versions de RPGmaker (2000, 2003, XP, VX)
Mais il est surtout utile pour RM2000 et 2003 car pour XP et VX, les scripts sont plus utile comme l'explique Zeus81 en troisième commentaire de ce tutoriel ! =)
Ce tutoriel explique une méthode permettant de comparer, classer plusieurs variables à l'intérieur d'un groupe de plusieurs variables qui diront quelle est la première, la deuxième, la troisième, etc.
PRÉ-REQUIS
Savoir ce qu'est une variable pointée par une autre variable.
-> Explication dans le tutoriel "Tout tout, tout sur les variables !"
OBJECTIF :
Dans l'exemple d'un système de combat, déterminer l'ordre des actions des personnages suivant leur caractéristique "rapidité", le plus rapide attaque le premier, et ainsi de suite. Il y a plusieurs utilité à pouvoir classer plusieurs variables dans l'ordre croissant ou décroissant ! ^^
NÉCESSAIRE :
-Une boucle
-Un groupe de variable (variables qui se suivent) de 1 à ce qu'on veut (si on estime ne pas avoir plus de 10 variables à classer, on fait un groupe de 10 variables nommées de rang1 à rang10)
-Une variable "Numéro var. de rang"
-Une variable "Valeur de contrôle"
-Vos variables à classer (qui sont déjà faite si vous avez besoin de les classer, donc^^) elles n'ont pas besoin d'être groupées, sauf si vous êtes expert, vous pourriez concentrer 10 fois plus mon code si vos variables étaient groupées mais n'entrons pas dans le complexe ! ^^
TAILLE DU CODE :
Pas très grand, il varie suivant le nombre de variables à classer (une condition en plus pour une variable en plus)
RALENTISSEMENTS ?
Aucun, sauf qu'il faut éviter de l'utiliser pour classer des variables allant de 0 à plus de 1000, une fois ça ne ralentit pas le jeu mais si vous utiliser la technique 10 fois toute les 1 frames ça ralentira forcément^^
PRINCIPE :
The gros principe de barbare :
-Vous faites une boucle, qui n'aura surtout pas d'"attendre" à l'intérieur.
-Avant la boucle on met une variable "valeur de contrôle" à la valeur minimum des variables à classer* si on classe du plus petit au plus grand, ou la valeur maximum* si on veut classer du plus grand au plus petit.
-Dans la boucle, cette variable va diminuer de 1 à chaque tour de boucle si on veut classer du plus grand au plus petit, augmenter de 1 si on veut classer du plus petit au plus grand.
-On sort de la boucle si toute les variables sont classées ou si la variable lancée atteint : La valeur minimum que peuvent avoir les variables, si on a débuté avec la valeur maximum, et à l'inverse, la valeur maximum que peuvent avoir les variables si on a débuté avec le minimum.
Si vous classez dans l'ordre croissant, de la plus petite à la plus grande variable, la plus petite variable sera indexée* dans le rang1
Si vous classez dans l'ordre décroissant, de la plus grande à la plus petite variable, la plus grande variable sera indexée dans le rang1
*Indexer ??
Par exemple vous avez des variables "vitesse héros 1", "vitesse héros 2" etc... si c'est la variable"vitesse héros 5" la plus grande, et que vous classez de la plus grande à la plus petite, vous aurez "5" dans la variable "rang1"
*Valeur maximum et minimum des variables ??
C'est important de savoir les définir, dans l'exemple d'un système de combat, on compare les vitesse de héros alors une caractéristique de vitesse a pour minimum 1 et maximum 99, généralement. Si la variable "vitesse héros 4" est à 0 c'est que le héros est absent et c'est là que c'est important, car il ne faut pas classer les variables des héros et monstres absent ! (je suis toujours dans l'idée du système de combat mais ce pourrait être un mini-jeu ou un système de repérage de l'objet le plus proche ou autre.) donc c'est pour ça que dans cet exemple.
Le minimum serait 1 et non 0 car 0 serait la valeur des variables inactives qu'on ne veut pas classer. si on a besoin de 0 voir même de classer aussi les valeurs négatives genre à partir de -200, il faudra trouver une valeur spéciale genre -300 pour les variables inactives.
Le maximum sera la valeur maximale de vos variables, la valeur pour laquelle vos variables ne sont pas sensées dépasser, dans le cadre de leur utilisation.
Evitez de classer des variable dans une trop grande fourchette genre de -5000 à 5000
EXEMPLE DE GROUPE DE VARIABLES :
Retenez bien ce qu'est le numéro du premier rang de votre groupe, et le numéro du dernier rang.
C'est un groupe de rang1 à rang8, mais vous pouvez aussi bien faire de "rang1" à "rang 20" comme de "rang1" à "rang4" ^^ Ça ne changera pas la longueur du code ! ^^ (c'est le nombre de variable à entrer par contre qui feront 3 conditions supplémentaires pour 3 variables supplémentaires, etc...)
Vous avez tous les éléments nécessaire pour essayer de comprendre le code, maintenant :
LE CODE :
Citation: <>modifier variable : plusieurs : du "Numéro du premier rang" au "Numéro du dernier rang" rendre égal à "0"
<>modifier variable : "Numéro var. rang" rendre égal à "Numéro du premier rang"
<>modifier variable : "Valeur de contrôle" rendre égal à "Valeur la plus basse de vos variables" si vous faite dans l'ordre croissant (1er=le plus petit), rendre égal à "Valeur la plus haute de vos variables" si vous faites l'ordre décroissant (1er=le plus grand)
BOUCLE
<>condition : si variable "Valeur de contrôle" = variable "Votre première variable"
---<>modifier variable : d'après la variable "Numéro var. rang" rendre égal à "1"
---<>modifier variable : "Numéro var. rang" additionner "1"
fin de condition
<>condition : si variable "Valeur de contrôle" = variable "Votre deuxième variable"
---<>modifier variable : d'après la variable "Numéro var. rang" rendre égal à "2"
---<>modifier variable : "Numéro var. rang" additionner "1"
fin de condition
<>condition : si variable "Valeur de contrôle" = variable "Votre troisième variable"
---<>modifier variable : d'après la variable "Numéro var. rang" rendre égal à "3"
---<>modifier variable : "Numéro var. rang" additionner "1"
fin de condition
Et ainsi de suite, Mêmes conditions pour chaque variables contrôlées, il n'y a que "modifier variable : d'après la variable "Numéro var. rang" rendre égal à "..." où l'index "1", "2", "3", "..." changera ^^
<>modifier variable : "Valeur de contrôle" soustraire "1" si on classe du plus grand au plus petit, additionner "1" si on classe du plus petit au plus grand.
<>condition : si variable "Numéro var. rang" supérieur strict à variable "Numéro du dernier rang"
---<>Sortir de la boucle
fin de condition
<>condition : si variable "Valeur de contrôle" inférieur strict à "Valeur minimum des variables" si on classe du plus grand au plus petit, supérieur strict à "Valeur maximum des variables" si on classe du plus petit au plus grand.
---<>Sortir de la boucle
fin de condition
FIN DE BOUCLE |
Et avant qu'un grand défenseur du lag ne vienne me dire "eh, t'as oublié de mettre un "attendre" dans ta boucle, ça va lagger !!", je signale qu'il ne faut pas en mettre car voyez vous cette boucle va faire une centaine de tours en une fraction de seconde, et elle aura forcément cessé au bout d'une fraction de seconde grâce aux conditions qui font "sortir de la boucle". ^^ Voici donc un exemple de boucle de calcul où il ne faut pas mettre de "attendre", tant que la boucle est sensée arrêter de tourner même pas un dixième de seconde après son lancement, pas de problème, mais une boucle qui tourne pendant 5 seconde ça ferait 5 secondes de lag, alors imaginez une boucle qui ne se termine pas.^^ Donc pour ces autres cas, n'oubliez pas le "attendre".^^
YOUPI !
Et voilà, vous mettez ce code à l'endroit où vous voulez classer vos variables et vous aurez vos variables classées dans le groupe "rang1 à rangX"^^
Par exemple, si on voulait classer quatre variable :
Pv héros 1 = 58
PV héros 2 = 27
Pv héros 3 = 58
Pv héros 4 = 97
on aurait, si on classe dans l'ordre croissant :
rang 1 = 2 (le plus petit nombre)
rang 2 = 1
rang 3 = 3
rang 4 = 4
si on classe dans l'ordre décroissant :
rang 1 = 4 (le plus grand nombre)
rang 2 = 1
rang 3 = 3
rang 4 = 2
Il y a d'autres techniques c'est sûr, mais celle ci est infaillible car ça peut ne pas compter les variables inactive dans le classement et ça compte aussi les variables qui ont la même valeur, comme montré ci-dessus les variables 1 et 3 qui ont la même valeur sont classé l'une après l'autre suivant la hiérarchie des conditions à l'intérieur de la boucle.^^
Bilou !
|
Drakhaine -
posté le 08/10/2008 à 19:53:28 (53 messages postés)
| Programmeur | Sympa le tuto ! (clin d'oeil à Nemäu au passage)
|
Vieille école |
Falco -
posté le 10/10/2008 à 19:20:42 (19776 messages postés)
- | Indie game Developer | Super tuto.
J'ai put tester, ça marche niquel.
C'est vraiment quelque chose qui beaucoup ne savent pas faire en plus.
|
Inexistence Rebirth - Inexistence - Portfolio |
Zeus81 -
posté le 10/10/2008 à 21:18:12 (11071 messages postés)
| | Su XP et VX, c'est plus rapide de le faire en script et plus complet.
Les actions suivantes doivent être écrite en utilisant la commande "Insérer un script" des évènements.
Si tout ne rentre pas dans une commande, c'est pas grave, ça peut être fait en plusieurs fois.
On créé d'abord un tableau :
On y insère les id des variables à trier :
1
2
3
4
5
| @tableau.push(128)
@tableau.push(64)
@tableau.push(2352)
@tableau.push(10)
etc... |
On trie :
- Si on veut par ordre croissant :
1
| @tableau.sort! {|a, b| $game_variables[a] <=> $game_variables[b]} |
- Si on veut par ordre décroissant :
1
| @tableau.sort! {|a, b| $game_variables[b] <=> $game_variables[a]} |
On récupère le résultat :
- Si on veut récupérer l'id d'une variable :
1
| $game_variables[Numéro d'une variable où stocker le résultat] = @tableau[rang-1] |
- Si on veut récupérer la valeur d'une variable :
1
| $game_variables[Numéro d'une variable où stocker le résultat] = $game_variables[@tableau[rang-1]] |
- Par exemple si on veut la valeur de la variable qui est au 1er rang :
1
| $game_variables[Numéro d'une variable où stocker le résultat] = $game_variables[@tableau[0]] |
On supprime le tableau :
=> Pas de boucle
=> Permet de trier des variables même si elles ne se suivent pas
=> Une variable pour le résultat
Efficacité !
|
Joke -
posté le 10/10/2008 à 21:32:25 (5090 messages postés)
| Bilouteux fou | De toute façon on peut programmer ce qu'on veut en événement, ce sera plus simple de le faire en script donc ouais c'est surtout pour le 2000 et 2003, j'ai signalé ton coup de pouce dans les premières lignes du tutoriel, merci =)
|
biloumaster.fr, mon joli site ouèb tout bô tout frai ! |
Monos -
posté le 10/10/2008 à 23:22:32 (57322 messages postés)
| Vive le homebrew | C'est bien beau aussi de parler de script c'est plus simple et tous.
C'est seulement vrais pour les personnes qui savent utiliser les scripts/Scripter.
|
Signer du nez ? |
Zeus81 -
posté le 11/10/2008 à 00:16:59 (11071 messages postés)
| | C'est sur que si on essai de le faire en script alors qu'on ne sait pas scripter, c'est pas facile, mais vu que je donne tout le code, y a juste a faire copier/coller.
|
Monos -
posté le 11/10/2008 à 00:24:06 (57322 messages postés)
| Vive le homebrew | heu je doute qu'une personne qui ne connais pas le ruby sache de quoi tu parles vraiment. On place le code ou? et ses question la.
Car je suis sur que pour beaucoup de monde c'est du chinois.
|
Signer du nez ? |
Joke -
posté le 11/10/2008 à 10:10:06 (5090 messages postés)
| Bilouteux fou | Citation: Y a juste a faire copier/coller. |
C'est spécialement pour ça que je n'aime pas les RPGmaker XP et VX, le "il suffit juste de copier/coller, pas besoin de comprendre le script"...
Il faut faire des tutoriels qui décomposeraient le fonctionnement d'un script pour ne pas qu'il suffise juste de le copier coller mais de pouvoir en refaire un pour une autre utilisation, copier coller des lignes de codes sans piger d'où elles sortent c'est naze et on peut pas empêcher les gens de le faire mais c'est pour ça que lorsque je fais un tutoriel sur l'événementiel (le script je touche pas^^) je ne dis pas simplement ce qu'il faut faire mais surtout comment ça marche.
|
biloumaster.fr, mon joli site ouèb tout bô tout frai ! |
Zeus81 -
posté le 11/10/2008 à 15:40:29 (11071 messages postés)
| | J'ai édité un peu le début et je trouve que j'explique assez bien quels bouts de codes font quoi.
|
Tricky -
posté le 11/10/2008 à 16:34:16 (205 messages postés)
| |
1
| C'est sur que si on essai de le faire en script alors qu'on ne sait pas scripter, c'est pas facile |
Et j'en suis la preuve
...
Wha, c'est trop concept... Zeus a Light de DeathNote et moi L (ryuuzaki) comme avatar...
====>[]
|
Joke -
posté le 12/10/2008 à 21:49:55 (5090 messages postés)
| Bilouteux fou | Merci Dayen ça m'fait plaisir que mes tutoriels t'intéressent ! =)
Mais publier un livre pour ça ce serait du massacre d'arbre inutile ! x)
Merci Zeus81, le nouveau making (XP, VX) aurait plus fière allure si on faisait plus de tutoriels de script genre un tutoriel sur la fonction @tableau qui peut servir à trier etc... ^^
En attendant, l'événementiel reste une technique valable et bonne pour tous les RM (bien que meilleure pour 2000/2003) ^^
|
biloumaster.fr, mon joli site ouèb tout bô tout frai ! |
Gari -
posté le 12/03/2021 à 12:36:42 (5901 messages postés)
- | | Pour ceux qui ont des erreurs de code ou ne comprennent pas comment ça fonctionne, exemple pour ordre croissant, mes variables à classer pouvaient valoir entre 0 et 100. Il y avait 8 variables à classer, de l'id 30 à 37, et l'id des variables rang allait de 21 à 28 :
Spoiler (cliquez pour afficher)
Variables [Rang 1] à [Dernier Rang] = 0
Petite initialisation, si on s'en sert plusieurs fois ça reset toutes les valeurs.
Modifier [Numéro var. de rang] = numéro d'id de [Rang 1]
Vous devez insérer manuellement l'id de votre première variable rang (21 pour moi).
[color=White]Modifier [Valeur de contrôle] = plus petite valeur possible des variables à classer (ordre croissant), ou plus grande valeur (ordre décroissant).
On ouvre la boucle.
Condition : Si valeur de contrôle = contenu de la variable à classer
--- D'après [Numéro var. de rang] (troisième commande) = 1 # on met à 1 la variable pointée par la variable Numéro var. de rang.
Au début, notre variable [Numéro var. de rang] vaut 21, soit l'id de la variable [Rang 1].
Au début, toutes les variables [Rang] valent 0.
La variable [contrôle de valeur] vaut 0 (valeur minimale dans mon cas). Donc si ma [variable à classer 1] vaut 0, la variable d'id 21 ([Rang 1]) vaudra 1, signifiant que la variable à classer 1 est la première occurence (= la plus petite).
--- Numéro var. de rang +1
On ajoute 1 à la variable Numéro var. de rang pour passer au rang suivant
(si on suit l'exemple précédent, cela veut dire que notre variable vaut maintenant 22, pour pointer vers la variable Rang 2.
Fin de la condition
Suite des conditions jusqu'à arriver à la dernière [variable à classer]
Modifier Variable [Contrôle de variable] += 1 (croissant) ou -= 1 (décroissant)
Située juste après les conditions, elle rajoute 1. Il s'agit de la valeur de progression, qui va aller de la valeur minimale à la valeur maximale (croissante) ou l'inverse.
Le code fonctionne sans cette condition (la boucle fera juste plus de tours, donc elle reste utile si vous avez une grande étendue de valeurs à vérifier). Elle permet de vérifier si tous les rangs ont été attribués.
Condition : si variable [Numéro var. rang] supérieur strict à variable "Numéro du dernier rang"
---Sortir de la boucle
fin de condition
La suivante vérifie si variable contrôle est arrivée à la valeur max (croissant) ou minimale (décroissant) :
Condition : si variable [Valeur de contrôle] supérieur(croissant) / inférieur(décroissant) strict à variable [Numéro du dernier rang]
---Sortir de la boucle
fin de condition
On ferme la boucle.
Si on veut afficher la valeur des variables dans l'ordre, il suffit de remplacer une variable dans les conditions de la boucle
Citation: <>condition : si variable [Valeur de contrôle] = variable [Variable à classer 1]
---<>modifier variable : d'après la variable [Numéro var. rang] rendre égal à "1"
---<>modifier variable : [Numéro var. rang] +=1
fin de condition |
par
Citation: <>condition : si variable [Valeur de contrôle] = variable [Variable à classer 1]
---<>Modifier variable : d'après la variable [Numéro var. rang] rendre égal à Variable [Variable à classer 1]
---<>modifier variable : [Numéro var. rang] += 1
fin de condition |
Merci à Joke pour l'aide.
| |
|
|