Bien le bonjour tout le monde !
Ce tuto va vous expliquer comment réaliser le plus simplement possible une zone de patinage. Qu'est-ce donc que cela ? Nous avons tous, je pense, joué à Pokémon au moins une fois dans notre vie (je cite ce jeu pour exemple, mais bien d'autres jeux ont repris ce principe) et nous avons tous traversé une grotte de glace. Et nous avons tous du traverser une zone où le sol était gelé et sur lequel le héros patinait comme un dingue en ligne droite, ne pouvant changer de direction qu’à la rencontre d’un obstacle. C’est ce que ce tuto va vous apprendre à faire. Ce genre d’énigme peut ajouter une belle touche de gameplay à votre jeu, que vous programmiez un RPG ou n’importe quel autre jeu du genre.
NIVEAU DU TUTO : Moyennement difficile.
NB : Le tuto sera réalisé avec les commandes de RM2003, mais il est bien sûr adaptable à toutes les versions de RM, sous réserve d’un tout petit peu d’adaptation selon la version utilisée.
NB2 : Pour comprendre ce tuto, il est nécessaire de bien maîtriser les variables ainsi que l’utilisation et la gestion des terrains.
Pour commencer, mappez une petite map avec un chipset de glace, pour avoir un support visuel qui vous permettra de mieux comprendre comment ça marche. Pour l’instant, mappez les contours de la map avec un terrain « adhérent » et l’intérieur avec un terrain « glissant » :
Ensuite, allez dans la base de données du logiciel et créez un nouveau terrain (pour RM2000-2003) ou attribuez un numéro (RMXP/VX/VXACe) pour le tileset utilisé pour le terrain glissant. Comme j’utilise RM2003, je crée un nouveau terrain dont le numéro sera 21.
Le système fonctionne en deux évènements.
Créez un premier événement, qui servira à stocker le terrain sur lequel le héros se trouve.
Appelez cet événement « GESTION DU TERRAIN », mettez-le en processus parallèle, puis créez trois variables :
- Héros X : pour définir la coordonnée X du héros
- Héros Y : pour définir la coordonnée Y du héros
- Héros Terrain : pour définir l’ID du terrain sur lequel le héros se trouve.
Une fois ces variables créées, faites les réglages suivants :
- Code:
-
<> Variable « Héros X » = Coordonnée X du Héros (attention : ne pas rendre égal à la coordonnée Ecran !!!)
<> Variable « Héros Y » = Coordonnée Y du Héros
Puis, allez chercher l’onglet « Stocker l’ID d’un terrain », et sélectionnez « position définie par des variables », choisissez la variable « Héros X » pour X, et idem pour Y. Puis choisissez de stocker le résultat dans la variable « Héros Terrain ».
Placez un petit temps d’attente à 0.0 frames à la fin de l’événement (ou 0.1 frames selon la version de RM que vous utilisez), pour laisser un petit temps de calcul à l’événement, qui sera bien sur imperceptible en jeu.
Voilà. Avec cet évènement plutôt rudimentaire, vous pouvez savoir sur quel terrain le héros se trouve en permanence sur votre map.
C’est maintenant que les choses se compliquent un peu :p
Créez un deuxième événement sur votre map, que vous appelez « GESTION COLLISIONS », qui va servir à savoir si le héros est sur le terrain glissant ou non, et le faire patiner ou non en conséquence.
La première page de votre évent sera celle qui servira à considérer le non-patinage, c’est à dire que le héros se trouve sur un terrain adhérent et donc à ne pas glisser. Cette page doit être en processus parallèle.
Mettez en condition de déclenchement de la page : Si variable « Héros Terrain » est inférieure à 21 (c’est l’ID que j’ai choisi, mais vous devez remplacer 21 par le chiffre que vous utiliserez pour votre sol gelé).
Dans la programmation de cette page, mettez ceci :
- Code:
-
<> Déplacer événement : Héros : Direction fixe : OFF, Animation de marche : ON
<> Autoriser l’accès au menu (oui parce qu’on va le bloquer plus tard, il ne faut pas pouvoir accéder au menu pendant qu’on patine, ça foutrait le bordel dans l’univers intrasèque de la vie des esquimaux à la fraise. Et au fonctionnement du jeu, accessoirement)
<> Attendre 0.0 frames (ou 0.1 frames)
<> Mettre une étiquette : 1
<> Attendre 0.0 frames (ou 0.1 frames)
<> Aller à une étiquette : 1
Je vous explique :
L’événement va capter que vous êtes sur un terrain qui n’a pas pour ID 21 (ou votre chiffre), il va donc vous faire revenir à une apparence de « marche », puis, pour ne pas le faire en boucle, on bloque le déroulement avec un aller-retour par étiquettes, avec un temps d’attendre pour ne pas ramer. Ceci pour permettre de ne pas entrer en contradiction avec un autre événement que déplacerait le héros si jamais vous deviez en faire un.
C’est bon, vous suivez ?
Ensuite, créez une deuxième page dans l’événement « GESTION COLLISIONS » et à l’inverse de la première page, mettez en condition de déclenchement : Si variable « Héros Terrain » est égale à 21. (et non pas supérieure ou égale, je vous expliquerai pourquoi).
Cette page doit également être en processus parallèle.
Mettez tout de suite la boucle suivante :
- Code:
-
<> Placer une étiquette : 1
<> Attendre 0.0 frames (ou 0.1 frames)
Cette première entrée de boucle contiendra la programmation qui servira à faire changer de direction le héros quand celui-ci sera bloqué par un obstacle.
Ensuite, placez les commandes suivantes :
- Code:
-
<> Déplacer un événement : Héros : Direction fixe : OFF
<> Condition : La touche Bas est pressée (Case « Sinon » Cochée)
<> Déplacer un événement : Héros : Regarde en bas, Direction fixe : ON
<> Aller à l’étiquette : 2
<> Sinon, Condition : La touche Haut est pressée (Case « Sinon » Cochée)
<> Déplacer un événement : Héros : Regarde en Haut, Direction fixe : ON
<> Aller à l’étiquette : 3
<> Sinon, Condition : La touche Droite est pressée (Case « Sinon » Cochée)
<> Déplacer un événement : Héros : Regarde à droite, Direction fixe : ON
<> Aller à l’étiquette : 4
<> Sinon, Condition : La touche Gauche est pressée (Case « Sinon » Cochée)
<> Déplacer un événement : Héros : Regarde à gauche, Direction fixe : ON
<> Aller à l’étiquette : 5
<> Sinon : Aller à l’étiquette 1
Par ces commandes vous définissez dans quelle direction le héros va regarder, et donc va patiner par la suite.
(Ici, nous aurons besoin de 4 nouvelles variables :
« Héros X glisse » et « Héros Y glisse » : redéfinir les coordonnées du héros car nous ne pouvons pas toucher aux précédentes variables, nécessaires au stockage de l’ID du terrain.
« Terrain en face » et « Evènement en face » : Ces variables serviront à savoir si un obstacle se trouve devant le héros lors de sa glissade.
Nous aurons également besoin d’un nouveau terrain : Ici je choisis le terrain suivant, ce qui me donne le numéro 22 dans la base de données de RM2003. Ce terrain servira à savoir quand le héros rencontrera un obstacle. Ce n’est pas la même chose que rencontrer un terrain adhérent. Attribuez cet ID à une case de terrain.)
(JE PLACE UN CHECKPOINT ICI. NOUS DEVRONS REVENIR A CE POINT PLUS TARD)
En dessous de toutes ces commandes, faites :
- Code:
-
<> Placer une étiquette : 2
<> Interdire l'accès au menu
<> Condition : Si héros regarde : en bas
<> Variable « Héros X glisse » = Coordonnée X du héros
<> Variable « Héros Y glisse » = Coordonnée Y du héros
IMPORTANT ! <> Variable « Héros Y glisse » + 1 (pour se placer sur la case juste devant le héros)
<> Stocker l’ID d’un terrain : X = Variable « Héros X glisse », Y = Variable « Héros Y glisse », Stocker le résultat dans la variable « Terrain en face »
<> Condition : Si la variable « Terrain en face » est différent de 22 (Case « Sinon » Cochée)
<> Stocker l’ID d’un évènement : X = Variable « Héros X glisse », Y = Variable « Héros Y glisse », Stocker le résultat dans la variable « Evènement en face »
<> Condition : Si la variable « Evènement en face » est inférieur à 1 (Case « Sinon » Cochée)
<> Déplacer un événement : Héros : Animation de marche : OFF, un pas vers le bas
<> Attendre 0.0 frames (ou 0.1 frames)
<> Aller à l’étiquette 2
<> Sinon (de la condition événement) : Aller à l’étiquette 1
<> Sinon (de la condition terrain) : Aller à l’étiquette 1
Retournez au CHECKPOINT, et refaites la programmation avec les 3 autres directions, en changeant bien le numéro d’étiquette à chaque fois :
2 = Bas
3 = Haut
4 = Droite
5 = Gauche
Il faut aussi changer la variable marquée « IMPORTANT ». Cette variable définit la case à considérer en fonction de la direction du héros, elle doit être réglée en conséquence.
Bas : Variable « Héros Y glisse » + 1
Haut : Variable « Héros Y glisse » - 1
Gauche : Variable « Héros X glisse » - 1
Droite : Variable « Héros X glisse » + 1
Mettez bien les quatres directions les unes à la suite des autres SANS LES EMBOITER DANS LEURS CONDITIONS RESPECTIVES. Les étiquettes se chargeront de différencier les directions du héros à prendre en compte pour avancer.
Je n’utilise pas la commande « Pas en avant » car je dois modifier en fonction de la direction du héros la case qui est devant lui (c’est elle qui sert à détecter s’il y a un obstacle).
Voilà, vous avez fini la programmation. Maintenant il reste un détail important à régler. Sous certains version de RM (et quasiment toutes je crois) il n’est pas possible d’attribuer un numéro de terrain aux éléments se trouvant sur la couche supérieur de la map. Pour pallier à cela, il existe une petite astuce.
Voici par exemple un placement d’obstacle :
Maintenant, je passe en couche inférieure. Sous chaque « pied » d’obstacle, là où le héros va se retrouver bloqué, je place mon terrain dont l’ID est égale à 22 (ou le chiffre que vous avez choisi)
Ici, bien sûr, j’utilise les RTP donc le résultat au niveau graphique n’est pas top car on verra en jeu qu’il y a une case sous mon « pic ». Mais ce souci peut facilement s’arranger en retouchant un poil le chipset pour créer une case spécifique qui se mariera avec la glace.
Voilà, c’est terminé !
Pour voir le résultat de ce tuto, je vous invite à jouer à ce jeu ! (PUB = OFF)
Merci à tous d’avoir suivi ce tuto de patinage hautement artistique, et je vous invite à laisser des commentaires
Gros bisous les loulous !