❤ 1Gari Ce tutoriel est utilisable pour tous les RPGmaker ! (2000, 2003, XP, VX)
Ce tutoriel est incontournable !
Utile pour les A-RPG, mais aussi des mini-jeux et diverses utilisations.
Ce tutoriel vous explique comment détecter si un point imaginaire est à l'intérieur d'un rectangle imaginaire, par exemple : si le héros est sur une zone spéciale de la carte, si le héros est proche d'un monstre, si quelque chose est dans une certaine zone que vous définirez.
Une base à connaître de la programmation qui vous permet un peu tout par exemple si un curseur que l'on pourrait déplacer au pixel près est sur un bouton du menu ou non.
Ce tutoriel est destiné à ceux qui maîtrisent déjà les bases de RPG maker et veulent pousser plus loin la programmation, mais il peut aussi instaurer de bonnes bases aux débutants.
Il faut bien connaître ce tutoriel car je ne vais pas vous ré-expliquer ce que sont des coordonnées et des variables :
Tout, tout, tout sur les variables
Les zones par variables.
C'est le nom barbare que j'ai trouvé pour une base toute simple à beaucoup de choses dans la programmation.
J'entends par là des zones rectangulaires imaginaires où on va pouvoir détecter si un point est à l'intérieur ou à l'extérieur.
Hein ? Qu'est ce que j'sors comme connerie inutile ?
Un exemple simple dans une carte du monde : (aux zones climatiques farfelues)
Le point c'est le héros, la zone c'est celle que je montre.
Dans tous les cas, si le héros est dans ce rectangle, il neige !
Comment programmer en sorte qu'il neige dès que le héros entre dans cette zone ?
Voilà ce que j'appelle les zones par variables.
LA BASE :
Il y a trois façon de déterminer une zone :
-Déterminer une zone par deux points.
Surtout utile pour des zones sur la carte !
-Déterminer une zone par un seul point.
Même théorie que la première technique, mais surtout pour des zones autour des personnages mobiles !
-Déterminer une zone par comparaison de distance.
Même effet que la deuxième technique, mais plus simple et contractée, et à partir d'une autre théorie !
Zone par deux points
Je vais considérer que vous savez ce sont des coordonnées, et comment les utiliser dans RPG maker.
Pour commencer je vais être purement mathématique, je ne vais pas parler de coordonnées d'image, ni de coordonnées de cartes, mais simplement d'une abscisse en haut à gauche (comme RPG maker), et de points par rapport à cette abscisse.
On a :
L'abscisse (X=0, Y=0) en haut à gauche comme dans RPG maker
Le point A défini par : Xa, Ya
Le point B défini par : Xb, Yb
Le point C défini par : Xc, Yc
1) Détecter si le point est à l'intérieur de la zone
Si le point C est dans la zone, c'est que C est entre A et B, ou plus précisément :
Xc est entre Xa et Xb
Yc est entre Ya et Yb
L'abscisse pourrait être le point 0 en haut à gauche de la carte, Xa, Ya, Xb et Yb les coordonnées fixes de deux points sur la carte, Xc et Yc les coordonnées variables du héros
L'abscisse pourrait être le point 0 en haut à gauche de l'écran, Xa, Ya, Xb et Yb les coordonnées par écran fixes des deux coins imaginaires d'une image, Xc et Yc les coordonnées par écran de l'mage d'un curseur
Vous pigez rien ? Retournons dans le concret, alors :
Si le héros est dans la zone, ça veut dire que :
X héros (Xc) est entre 56 (Xa) et 88 (Xb)
Y héros (Yc) est entre 40 (Ya) et 77 (Yb)
Comment je sais les coordonnées des points A et B ?
Il suffit de le lire dans la barre en bas de RPG maker :
Ben c'est pas compliqué !
RPGmaker ne sait pas faire la condition "si variable "" est entre "" et "".
On va alors utiliser "supérieur ou égal à", "inférieur ou égal à"
Voilà le code qui fait de la neige sur ma carte du monde, il serait donc simplement dans un événement en processus parallèle :
modifier variable : "X héros" rendre égal à coordonnée X du héros
modifier variable : "Y héros" rendre égal à coordonnée Y du héros
condition : si "X héros" supérieur ou égal à "56"
--condition : si "X héros" inférieur ou égal à "88"
----condition : si "Y héros supérieur ou égal à "40"
------condition : si "Y héros inférieur ou égal à "77"
------effet météorologique : neige
------attendre : 0.3sec
------stopper cet événement
------<>
------fin
----<>
----fin
--<>
--fin
<>
fin
effet météorologique : Aucun
attendre : 0.3sec
Les conditions sont l'une dans l'autre car il faut que les 4 conditions soient réunies pour savoir que le point est à l'intérieur.
J'ai fais "stopper cet événement" si les conditions sont remplies, ça revient à relancer le code depuis le début au lieu d'aller jusqu'à la fin, donc on ne va pas jusqu'au "effet météorologique : Aucun" qui lui sera actif lorsqu'on sera hors zone.
Et voilà, avec ce code, si vous entrez dans cette zone de la carte, il y a de la neige, sinon il n'y en aura pas.
C'est la condition pour savoir si le héros est à l'intérieur de la zone, mais ça pourrait être intéressant de vérifier si le héros sort d'une zone, aussi !
C'est la même recette mais utilisée à l'envers :
2) Détecter si le point est à l'extérieur de la zone
Dans ce cas là, dès qu'on sort de cette zone, on arrive sur la carte du monde !
Si X héros et Y héros sont en dehors de la zone, c'est que :
soit :
X héros est inférieur à 2 (Xa)
ou
X héros est supérieur à 18 (Xb)
ou
Y héros est inférieur à 5 (Ya)
ou
Y héros est supérieur à 17 (Yb)
C'est simplement logique, alors j'arriverais pas à donner plus d'explication, réfléchissez simplement...
Donc pour appliquer ça en code :
modifier variable : "X héros" rendre égal à coordonnée X du héros
modifier variable : "Y héros" rendre égal à coordonnée Y du héros
condition : si "X héros" inférieur à "2"
<>téléporter l'équipe : carte du monde
<>
fin
condition : si "X héros" supérieur à "18"
<>téléporter l'équipe : carte du monde
<>
fin
condition : si "X héros" inférieur à "5"
<>téléporter l'équipe : carte du monde
<>
fin
condition : si "X héros" supérieur à "17"
<>téléporter l'équipe : carte du monde
<>
fin
attendre : 0.3sec
Tout simplement !
Alors cette méthode, je vous la montre sur des coordonnées de map car c'est le plus simple, mais on peut l'utiliser pour des coordonnées d'images !
On peut l'utiliser pour beaucoup de choses, surtout si vous faites un A-RPG !
Zone par centre (un seul point)
Une zone à partir d'un seul point au lieu de deux ?
Pourquoi faire ?
Ben par exemple, je veux qu'un monstre marche au hasard si le héros est loin, et suive le héros si le héros est près du monstre.
Pour changer, on va utiliser les coordonnées écran au lieu des coordonnées simples, les coordonnées écran ont pour abscisse le coin haut gauche de l'écran et sont précises au pixel près, idéales pour les A-RPG et avoir une vrai précision.
Voilà pourquoi ça revient au même que la méthode "deux points", car tu as les coordonnées du héros : Xh, Yh, et les coordonnées du monstre Xm, Ym, et à partir de ça tu dois trouver les points A et B !
J'ai programmé là un rayon de 60 pixels, donc le point A est à 60 pixels en haut à gauche du monstre, le point B est à 60 pixels en bas à droite du monstre.
Pour le point A, en haut à gauche c'est vers l'abscisse, vers le zéro, donc on enlève 60 pixels.
Pour le point B, en bas à droite c'est dans le bon sens, donc on ajoute 60 pixels.
Pour savoir si le héros est dans la zone, c'est les mêmes conditions que plus haut ! Sauf que cette fois-ci il faut calculer les points A et B, contrairement à avant où on les cherchait sur la carte.
Voilà alors le code pour savoir si le héros est à moins de 60 pixels du monstre :
modifier variable : "Xh" rendre égal à coordonnée X écran du héros
modifier variable : "Yh" rendre égal à coordonnée Y écran du héros
modifier variable : "Xm" rendre égal à coordonnée X écran du monstre
modifier variable : "Ym" rendre égal à coordonnée Y écran du monstre
modifier variable : "Xm" soustraire "60"
modifier variable : "Ym" soustraire "60"
condition : si "Xh" supérieur ou égal à "Xm"
--condition : si "Yh" supérieur ou égal à "Ym"
--modifier variable : "Xm" additionner "120"
--modifier variable : "Ym" additionner "120"
----condition : si "Xh" inférieur ou égal à "Xm"
------condition : si "Yh" inférieur ou égal à "Ym"
------déplacer événement "monstre" pas vers le héros
------attendre : 0.3sec
------stopper cet événement
------<>
------fin
----<>
----fin
--<>
--fin
<>
fin
déplacer événement "monstre" pas aléatoire
attendre : 0.3sec
Avec ce code, le monstre suit le héros si le héros s'en approche, sinon il se déplace au hasard !
Pourquoi j'ai fais "additionner 120" au lieu de "60" ? Parce qu'on a déjà fais un "soustraire 60", alors il faut additionner le double.
On pourrait faire pareil avec les coordonnées simples (carreaux) plutôt que les coordonnées écran (pixel), au lieu de soustraire 60 (pixels), par exemple, on enlèverait 3 (carreaux)
Comparaison de distance (Alternative à "zone par centre")
Une comparaison de distance ?
C'est plus simple à faire mais plus délicat à expliquer.
Ça a exactement le même effet que la zone par centre sauf que c'est plus simple à faire et ça ne fait pas partit de la même théorie !
Au lieu d'une zone imaginaire, on compare simplement les distance, par exemple savoir si entre le "perso 1" et le "perso 2" il y a moins de 3 carreaux d'écart.
Un écart de distance, c'est une différence de coordonnées : Vous êtes d'accord que si "perso 1" est aux coordonnées X5, Y6 et "perso 2" est aux coordonnées X8, Y10, il y a 8-5=3 carreaux d'écart horizontalement et 10-6=4 carreaux d'écart verticalement. Il suffit de soustraire les coordonnées ! Le truc à comprendre c'est que le résultat peut être négatif !
Si on soustrait les coordonnées de "Perso 1" aux coordonnées de "Perso 2"
Xdiff = Xperso2 - Xperso1
Ydiff = Yperso2 - Yperso1
-Si X diff est négatif, Xperso1 est donc une valeur plus grande que Xperso2, donc le perso1 est à droite du perso2, et s'il y a moins de 3 carreaux d'écart en X entre les deux, c'est que le résultat est entre -3 et 0, donc "X diff" >="-3"
-Si X diff est positif, Xperso1 est donc une valeur plus petite que Xperso2, donc le perso1 est à gauche du perso2, et s'il y a moins de 3 carreaux d'écart en X entre les deux, c'est que le résultat est entre 0 et 3, donc "X diff" <="3"
-Si Y diff est négatif, Yperso1 est donc une valeur plus grande que Yperso2, donc le perso1 est en bas du perso2, et s'il y a moins de 3 carreaux d'écart en Y entre les deux, c'est que le résultat est entre -3 et 0, donc "Y diff" >="-3"
-Si Y diff est positif, Yperso1 est donc une valeur plus petite que Yperso2, donc le perso1 est en haut du perso2, et s'il y a moins de 3 carreaux d'écart en Y entre les deux, c'est que le résultat est entre 0 et 3, donc "Y diff" <="3"
C'est les observations connes qui nous amènent donc au code tout couillon :
<>modif variable "X diff" = coord "X perso 2"
<>modif variable "Y diff" = coord "Y perso 2"
<>modif variable "X diff" - (soustraire) coord X "perso 1"
<>modif variable "Y diff" - (soustraire) coord Y "perso 1"
condition : si "X diff" >= -3
--condition : si "X diff" <= 3
----condition : si "Y diff" >= -3
------condition : si "Y diff" <= 3
--------<> le perso 1 est à moins de 3 carreaux du perso 2
--------<>
------fin
-----<>
----fin
--<>
--fin
<>
fin
C'est le code pour détecter si le perso 1 est à moins de 3 carreaux du perso 2, vous n'avez qu'à modifier le "3" pour mettre le nombre que vous voulez si vous voulez par exemple voir s'il est à moins de 6 carreaux, vous pouvez même faire une zone de la forme et position que vous voulez autour du perso, en mettant les valeurs que vous voulez aux quatre conditions !
Dite vous que c'est les bases du vectoriel en fait ^^" Pour savoir la valeur en X d'un vecteur AB lorsqu'on connait les coordonnées des points A et B, on fait Xb-Xa et non Xa-Xb ! Extrémité moins Origine, simple question de logique !
Pourquoi je dis ça ? Car c'est IMPORTANT <font color="yellow">si vous voulez que la zone soit autour du perso 1, vous devez faire comme je l'ai fais là :
Xdiff = Xperso2 - Xperso1
Ydiff = Yperso2 - Yperso1
Exemple : Personnage qui va peut-être être touché moins Personnage qui attaque !
Et non l'inverse !!
Ça n'a pas d'incidence pour les zones carrées pas de soucis, mais si vous voulez faire une zone bizarre genre "-3>=Xdiff>=5" et "-8>=Ydiff>=2" il sera important de respecter cet ordre !</font>
Et pour au contraire, savoir si le perso 1 est à plus de 3 carreaux du perso 2, c'est simplement... le contraire ^^
<>modif variable "X diff" = coord "X perso 2"
<>modif variable "Y diff" = coord "Y perso 2"
<>modif variable "X diff" - (soustraire) coord X "perso 1"
<>modif variable "Y diff" - (soustraire) coord Y "perso 1"
condition : si "X diff" <= -3
--<> le perso 1 est à plus de 3 carreaux du perso 2
--<>
fin
condition : si "X diff" >= 3
--<> le perso 1 est à plus de 3 carreaux du perso 2
--<>
fin
condition : si "Y diff" <= -3
--<> le perso 1 est à plus de 3 carreaux du perso 2
--<>
fin
condition : si "Y diff" >= 3
--<> le perso 1 est à plus de 3 carreaux du perso 2
--<>
fin
/\ Les conditions ne sont plus les unes à l'intérieur des autres et elles sont inversées (exemple : >= au lieu de <=)
Avantages :
-Moins de ligne
-Plus facile à comprendre, je crois
-Seulement deux variables au lieu de quatre
-Plus facile pour donner la gueule qu'on veut à la zone (Pas forcément carrée, on peut par exemple X diff>=-2, X diff<=5, Y diff>=-3, Y diff<=8)
Inconvénient :
-Y'en a pas vraiment, en fait ! x) Mais c'est utile de connaître la méthode "zone par centre" aussi !
Vous détenez dorénavant le pouvoir absolu !
Voilà la base, maintenant si vous avez compris, vous pouvez tordre cette base pour faire plus compliqué encore.
Vous pouvez faire une séquence d'infiltration en faisant les conditions nécessaires pour savoir que le héros est dans le même couloir (donc zone par deux points) que le garde et dans son champ de vision. (donc zone par centre ou comparaison de distance)
Vous pouvez savoir au pixel près si deux événements se chevauchent (pour le missile d'un tir, par exemple)
Vous pouvez faire un menu personnalisé avec le curseur à déplacer pixel par pixel et savoir quand le curseur est sur un des boutons du menu.
Vous pouvez faire beaucoup à partir de cette base, il suffit d'être malin
Bilou !
|