❤ 0 EMG 4 : Un système de leviers
I Introduction
Ce système a été conçu pour 2003 et je n'ai pas regardé mais je doute qu'il puisse fonctionner de la même manière sur les RMs qui suivent. Ceci dit si vous voulez faire ce genre de système sur un RM postérieur à 2003, mieux vaut passer par les scripts.
Comme dit dans la description de l'article, il s'agit d'un tutoriel où on met en pratique les concepts abordée plus tôt dans les tutos précédents. De fait, il est recommandé avant de lire ce tutoriel de regarder ceci au préalable :
Tuto #1 sur les pseudos fonction -> Cliquer ici
Tuto #3 sur la simulation d'interrupteur local -> Cliquer ici
II Conceptt
Le système que nous allons voir est assez simple : Le héros se retrouve face à plusieurs leviers et doit trouver lesquels activer et lesquels laisser désactivés pur pouvoir ouvrir une porte ou activer un mécanisme quelconque.
Une solution possible serait de faire plusieurs events avec deux pages et qui pour s'activer ou se désactiver utilisent un interrupteur pour pouvoir modifier leur état. La vérification se ferait alors en s'assurant que tel levier est activé s'il le faut et que tel levier est désactivé s'il le faut.
Cette technique marche bien mais souffre de plusieurs soucis :
- Le systèmes consomme un interrupteur par levier qu'il faudra réassigner pour chaque copie (pour ne pas faire de collision)
- La vérification implique d'avoir une condition pour chaque interrupteur ce qui rend ce code assez long.
Heureusement une autre solution, basée sur les deux concepts vus précédemment, permet de réduire ces soucis à l'utilisation d 'une seule variable et donc d'une seule condition de vérification.
III Un peu de théorie
Une chose à laquelle on ne pense pas forcément tout le temps quand on examine un nombre, c'est qu'il peut aussi bien être analysé comme un seul nombre que comme une séquence de chiffres. Par exemple, 3435 peut être vu comme :
- 3435
- 3; 4; 3; 5
- 34; 35
- 343; 5
- ...
On peut alors considérer un nombre non plus comme une valeur mais comme un ensemble de valeurs. Ainsi, sin on le souhaite, on peut très bien identifier ce nombre comme représentant l'équipement d'un personnage et qu'ainsi le premier 3 désigne en fait le 3ième casque de la base de donnée.
Et comment récupérer une valeur ? C'est très simple, avec un modulo et une division.
Pour ce faire en fait on va donner à chaque chiffre un indexe qui le positionne dans la séquence, en commençant par la valeur 0 tout à droite et en ajoutant 1 à chaque déplacement vers la gauche. Ainsi :
- 5 est à l'index 0
- 3 est à l'index 1
- 4 est à l'index 2
- 3 est à l'index 3
Ce choix n'est évidement pas fait au hasard et on pourra d'ailleurs remarquer que le chiffre x en position y est égal à x * 10 ** y (x fois 10 à la puissance y). Par exemple 4 * 10 ** 2 = 400.
Et pour récupérer le 4 il suffira de faire (3435 / (10 ** 2)) % 10.
Et voilà, on peut stocker jusqu'à 7 interrupteurs dans une variable, en mettant les chiffres soit à 1 pour activé soit à 0 pour désactivé. Mais est-ce suffisant ?
En fait, une variable peut contenir des nombres de 0 à 9999999, soit 10000000 de valeurs positives. Mais nous n'en utilisons que 2**7, soit 128 (ce qui est peu). Il existe cependant une solution à ce problème -> le binaire.
En effet, une valeur binaire n'étant constituée que de 0 et de 1, cela correspond parfaitement aux valeurs qu'on voulait donner pour représenter un interrupteur. De plus, une valeur binaire ayant, à valeur égale, plus de chiffres qu'une valeur décimale, cela veut dire qu'on peut stocker bien plus d’interrupteurs sous cette forme, à savoir 22.
Ce qui est d'ailleurs cool avec ce changement de base, c'est qu'il n'y a pas besoin de convertir une valeur en binaire pour récupérer le bon bit. IL suffit seulement de remplacer cette formule :
(3435 / (10 ** 2)) % 10
Par celle-ci
(3435 / (2 ** 2)) % 2.
IV Code
Voici enfin pour vos petite mirettes le code en event :
Mais avant toute chose, pour que ce système fonctionne il faut que tous les event des leviens aient des id qui se suivent. Aussi il est recommandé de bien vérifier à la création de votre système qu'il n'y a pas de trous d'id entre vos events.
Je vais donc prendre le temps d'expliquer le fonctionnement du code :
Ici l'event met dans une variable son id. Si vous avez lu le tuto #3 ça ne devrais pas vous être étranger.
Ici on retire une valeur égale à l'id de l'event. Pourquoi ? Car on souhaite relier le premier event au chiffre en positon 0 dans la variable. Et c'est le moyen le plus simple de le faire.
Par exemple si nos event de leviers ont les id de 35 à 38, en retirant 35 à chacun on obtient les nombres de 0 à 4 et on pourra directement les utiliser comme indexe de variable.
Ici on réutilise le code de la puissance du tuto #1 pour calculer 2 à la puissance du contenu de la variable 23.
Enfin là rien de très surprenant, on a le même code que dans le tuto précédant. Sauf qu'ici, au lieu d'affecter directement la porte, on agit sur une variable en lui ajoutant la valeur correspondante au bit dont on avait calculé l'indexe en début de code.
Et pour finir voici un exemple d'utilisation :
Comme tous les interrupteurs sont sauvegardés dans une variable, il ne faut plus qu'une condition pour savir si c'est bon ou pas. Ce qui rend le code plus léger et facile à lire.
Il ne reste plus qu'à savoir comment calculer la bonne valeur selon la combinaison que vous voulez faire. Pour ce faire, lancez le jeu et rendez vous sur la map pour mettre en place la bonne combinaison. Il ne reste plus qu'à presser F9 et regarder le contenu de la variable qui stocke les interrupteurs et vous aurez la bonne valeur !
V Conclusion
Dans ce tuto, nous avons vu une application simple de ce que les concept qui nous avons abordée peuvent donner en se combinant. De plus, nous avons obtenu une preuve que cette façon de coder permet de faire du code bien plus souple et donc moins compliqué à fabriquer puisque dans ce cas, une fois le premier event terminé, il ne reste plus qu'à le copier-coller comme on le souhaite, tant qu'on ne dépasse pas les 22 leviers.
|