Partagez
Aller en bas
avatar
Mist'
Staffeux retraité

Nombre de messages : 3312
Age : 25
Localisation : France // Auvergne // Cantal
Distinction : Ours Barbu é_è [/Shamu']
Artiste de talent [Yama']
Date d'inscription : 22/12/2007
http://www.rpgmakervx-fr.com

[Tuto] Action-RPG en évent

le Dim 10 Fév 2008 - 19:00
Comme j'ai vu que certains membres étaient intérresssés par ce système "à la zelda", ben, j'me suis dit que le système de Pipo conviendrais très bien =D
Donc, comme il l'a dit sur le topic qui lui est réservé sur RMXP, vraiment TOUT est personnalisable.
--------------------------------------------------------------------------------------
Maintenant, je laisse "parler" le maître Very Happy
--------------------------------------------------------------------------------------
Je viens de finir mon système d'A-RPG en events, et vu que ça m'a quand même pris une bonne semaine, autant en faire profiter les autres Very Happy

Avant tout, je dois dire un grand merci à Roys, dont les scripts d'extensions pour event-maker m'ont GRANDEMENT facilité la tâche...

http://www.rpgmxp.ch/lataverne/viewtopic.php?t=3541

Introduction:

Je sais que des scripts d'A-RPG existent déjà, mais ils sont difficilement personnalisables... C'est pourquoi j'ai voulu créer un système autonome, en events, que chacun pourra personnaliser soi-même.
Le système que je présente n'est (volontairement) qu'une "base", qui doit OBLIGATOIREMENT être modifiée (mais rien de compliqué, surtout du copier-coller^^). J'ai choisi de ne pas présenter une démo utilisable directement par un simple copier-coller, pour éviter que quelqu'un ne s'en serve sans avoir compris le principe (auquel cas il passerait à côté de pleins de choses^^).

Le tuto comporte aussi une ou deux améliorations par rapport à la démo (qui comprte un ou deux oublis... Mais finalement, comme ça peut aider à mieux comprendre, je laisse comme çà)

Avantages :
-Totalement personnalisable.
-Permet l'utilisation de compétences spéciales.
-Permet l'affichage de jauges on l'on veut, faciles à masquer.
-Permet un bouton de course avec jauge de fatigue (non inclus dans la démo).
-Bonne gestion de l'appui des touches, il ne suffit pas de laisser appuyer sur Entrée (ou de la mitrailler comme un dément) pour vaincre les ennemis.
-Malgré ce qu'on pourrait penser au vu de l'utilisation de quelques variables, ce script ne fait pas plus laguer le jeu qu'un script... Peut-être même moins que certains!
-Mode A-RPG activé par un switch, qu'il suffit de désactiver pour sortir du mode.
-Si vous êtes flemmard, possibilité de copier les évènements de ma démo qui ne seront qu'a modifier Very Happy


Désavantages:

-Si vous comptez utiliser des compétences spéciales, le nombre maximal de monstres par map est fixé d'avance. Lors de la création d'une nouvelle map, il faut commencer par créer ce nombre précis de monstre, puis ensuite les autres events. Les monstres pourront par la suite être supprimés si vous en voulez moins que le maximum.
-Certains interrupteurs doivent être désactivés et certaines variables modifiés à chaque changment de map. Solution possible : créer un évènement en processus parallèle dans chaque map qui se termine par une longue suite de "Attendre 999 frames).

PS: j'ai failli oublier le plus important, la démo
http://rapidshare.com/files/32934140/CBS.exe.html

Première Partie

Objectif : créer un monstre qui se déplace aléatoirement, et qui nous attaque si on
s'en rapproche trop.
Nécessaire:
Script de champ de vision de Near Fantastica :
http://www.rpgmxp.ch/lataverne/viewtopic.php?t=1429

Analysons l'Event n°1, le dragon.

Code:
Page1: deplacement aleatoire, vitesse et frequence, vous choisissez.
Condition de déclenchement : aucune^^ le mondtre à l'état sauvage.
Commande : interrupteur "monstre1 actif" désactivé.
                  attendre 50 frames (au hasard... Mais mieux vaut plus que moins pour éviter le lag.)

Cette commande sert à désactiver l'interrupteur qui signale que le monstre est actif. En effet, il aura surement été activé dans la map précédente...

Maintenant, il faut faire en sorte qu'il remarque quand le héros s'approche de lui à moins de 8 cases.

On va ici utiliser le script View_Range:
Créer un évènement commun déclenché par l'interrupteur nommé "A-RPG":
Code:

<>Attendre 5 Frames
<>Script : check = View_Range.new(1,8,"A")
        : check.event_view

Cela signifie que tous les 5 frames, le logiciel vérifie si le héros est à moins de 8 cases de l'évènement 1. Si c'est le cas, il active l'interrupteur local "A" de l'event 1 (le monstre) (Dans ma démo, ce n'est pas un évènement commun, je n'y avait pas pensé :corbaque7: )

Maintenant, voyons comment réagit le monstre quand on ^énètre dans son périmètre:

Code:

Conditions de l'évènement :
- L'interrupteur local [A] est activé

Conditions de déclenchement:
- Processus Parallèle

Commandes d'évènement:

<>Attendre 1 Frames
<>Interrupteur(s) [0021: monstre1actif] activé
<>

Et oui... Pour la suite, il est important qu'un certain interrupteur s'active lorsque le monstre nous a repéré. La véritable réaction du monstre se situe donc en page 3:

Code:
Conditions de l'évènement :
- L'interrupteur [0021:monstre1actif] est activé
- L'interrupteur local [A] est activé (inutile, j'ai oublié de l'effacer :corbaque7: )

Mode de déplacement:
- Type de déplacement : Suit le héros
- Vitesse de déplacement: Lent
- Fréquence de déplacement: la plus haute (IMPORTANT!!! Sinon, la marche n'est pas fluide mais par acoups)

Options:
- Animé lorsqu'il se déplace

Conditions de déclenchement:
- Au contact Evènement/Héros

Donc, notre brave monstre suit le héros, puis il arrive un moment où les deux se rencontrent... Maintenant, il faut savoir si c'est le monstre qui attaque le héros ou l'inverse 😉

La première idée qui vient à l'esprit est de créer une condition "si la touche C (entrée/espace) est appuyée", mais dans ce cas-là, il suffirait de la laisser appuyer en permanence pour être invulnérable...

Donc ==> évènement commun n°1 de la démo.


Code:
Evènement Commun ID: 001, Nom: commande
Déclenchement Parallele - Switch: 0010:A-RPG

Commandes d'évènement:

<>Attendre 1 Frames
<>Condition : si la touche C est pressée
  <>Interrupteur(s) [0001: Attaque] activé
(Si vous souhaitez qu'une petite anim de coup d'épée s'affiche à chaque fois que vous appuyez sur entrée, qu'il y aie un monstre ou non, faites-le ici)
  <>Attendre 2 Frames
  <>Interrupteur(s) [0001: Attaque] désactivé
  <>Attendre 1 Frames
  <>
: Fin
<>

Voilà! Au final, la touche C est moins réactive qu'elle ne le devrait... Résultat: si on se contente de tapoter la touche Entrée (ou espace...) en attendant que le monstre se jette sur notre lame, et ben ça marchera pas... Vous pouvez changer ces valeurs si elles ne vous plaisent pas, mais faites attention à ne pas mettre des valeurs trop fortes, sans quoi votre jeu sera injouable 😉

Maintenant, regardons le début des commandes du monstre (qui, je le rappelle, s'active en cas de contact):

Code:
<>Attendre 1 Frames (pour éviter le lag)
<>Condition : si l'interrupteur [0001:Attaque] est activé
  <>Afficher une animation sur Cet évènement, [Coup d'Epée]
  <>Variable(s) [0011: xmonstre1] rendre égale à Cet évènement --> Coordonnée X
  <>Variable(s) [0012: ymonstre1] rendre égale à Cet évènement --> Coordonnée Y
  <>Variable(s) [0013: hp monstre1] retirer 1 (important, sinon il est immortel :P )
  <>Condition : si Héros regarde vers la Gauche
    <>Variable(s) [0011: xmonstre1] retirer 1
    <>
  : Sinon
    <>Condition : si Héros regarde vers la Droite
      <>Variable(s) [0011: xmonstre1] ajouter 1
      <>
    : Sinon
      <>Condition : si Héros regarde vers le Haut
        <>Variable(s) [0012: ymonstre1] retirer 1
        <>
      : Sinon
        <>Condition : si Héros regarde vers le Bas
          <>Variable(s) [0012: ymonstre1] ajouter 1
          <>
        : Fin
        <>
      : Fin
      <>
    : Fin
    <>
  : Fin
  <>Modifier position d'un évènement : Cet évènement, X: [0011], Y: [0012]
  <>Interrupteur(s) [0001: Attaque] désactivé

Ainsi, le monstre (qui est ici un boss) recule d'une case seulement quand vous le frappez, ce qui n'est pas beaucoup... Pour un vrai ennemi, préférez une valeur de 2.

Maintenant, que se passe-t-il si votre héros est touché? Il perd de l'énergie, et recule d'une case... A priori, la démarche serait la même que ci-dessus. Seulement, quelques test montrent que si le héros se fait toucher alors qu'il est dos au mur, il pénètre à l'intérieur... Et s'il est dos au bord de l'écran, il se téléporte de l'autre côté... La solution : créer un charset spécial, sans animation et inversé (si le héros marche à droite, il regarde à gauche)

Code:
: Sinon (si l'interrupteur attaque est désactivé)
  <>Afficher une animation sur Héros, [Coup simple]
  <>Variable(s) [0008: HP héros] retirer 5
  <>Déplacer l'évènement : Héros
  :                      : Modifier l'apparence : 'charaset1touché', 0, 2, 0 (charset spécial, donc)
  <>Condition : si Cet évènement regarde vers la Droite
    <>Déplacer l'évènement : Héros (ignorer commandes si impossible)
    :                      : Un pas vers le droite(à cause du charset spécial, on a vraiment l'impression que le héros est éjecté)
    <>
  : Sinon
    <>Condition : si Cet évènement regarde vers la Gauche
      <>Déplacer l'évènement : Héros (ignorer commandes si impossible)
      :                      : Un pas vers la gauche
      <>
    : Sinon
      <>Condition : si Cet évènement regarde vers le Bas
        <>Déplacer l'évènement : Héros (ignorer commandes si impossible)
        :                      : Un pas vers le bas
        <>
      : Sinon
        <>Condition : si Cet évènement regarde vers le Haut
          <>Déplacer l'évènement : Héros (ignorer commandes si impossible)
          :                      : Un pas vers le haut
          <>
        : Fin
        <>
      : Fin
      <>
    : Fin
    <>
  : Fin
  <>Tout déplacer
  <>Déplacer l'évènement : Héros
  :                      : Modifier l'apparence : 'charaset1', 0, 2, 0
  :                      : Tourne de 180° (ben oui, maintenant il ne regarde plus l'ennemi, donc il faut qu'il se retourne)
  <>Déplacer l'évènement : Cet évènement
  :                      : Attendre : 10 frames (sinon, il attaquera sans répit jusqu'a ce que mort s'ensuive...)
  <>
: Fin
<>

Pendant qu'on y est, page 4:
Code:

Conditions de l'évènement :
- L'interrupteur [0006:STOP!] est activé

Mode de déplacement:
- Type de déplacement : Fixe
- Vitesse de déplacement: Lent
- Fréquence de déplacement: Basse

Options:
- Animé lorsqu'il se déplace

Conditions de déclenchement:
- Par la touche action

Commandes d'évènement:

<>

Cela permet de bloquer tout les monstres quand on veut (lors de l'affichage d'un message ou de l'exécution d'une attque spéciale)

La suite au prochain post...
avatar
Mist'
Staffeux retraité

Nombre de messages : 3312
Age : 25
Localisation : France // Auvergne // Cantal
Distinction : Ours Barbu é_è [/Shamu']
Artiste de talent [Yama']
Date d'inscription : 22/12/2007
http://www.rpgmakervx-fr.com

Re: [Tuto] Action-RPG en évent

le Dim 10 Fév 2008 - 19:02
--------------------------------------------------------------------
La suite Very Happy
--------------------------------------------------------------------

Et bien sur, page 5:
Code:

Conditions de l'évènement :
- L'interrupteur [0011:monstre1 mort] est activé

Apparence:
- Aucun(e)

Mode de déplacement:
- Type de déplacement : Fixe
- Vitesse de déplacement: Lent
- Fréquence de déplacement: Basse

Options:
- Animé lorsqu'il se déplace

Conditions de déclenchement:
- Par la touche action

Commandes d'évènement:
<>désactiver l'interrupteur "monstre1 actif" #(non présent dans la démo, j'ai honte...)

Quand il est mort^^

Ca y est, vous avez ce qu'il vous faut pour créer la base même d'un action-rpg. Bien que, pas encore de jauges, ni d'attaques spéciales... Ce sera pour la prochaine fois, mon clavier est brulant Laughing


Deuxième partie Partie

Ici, on entre dasn le partie délicate... Les compétences. Donc, encore une fois, je vous conseille de suivre avec la démo 😉
Personnellement, j'ai choisi de les activer grâce à la touche "A" (Shift gauche ou droite, selon qu'on utilise Entrée ou Espace 😉 )

Observons maintenant le début de l'évènement commun qui gère l'effet des compétences sur le monstre 1 :

Code:
Evènement Commun ID: 002, Nom: compétence ==> monstre1
Déclenchement Parallele - Switch: 010:A-RPG

Commandes d'évènement:

<>Attendre 1 Frames
<>Condition : si l'interrupteur [0021: monstre1mort] est désactivé (oublié dans la démo...)
<>Condition : si la variable [0007: MP héros] est strictement supérieur à 0
  <>Condition : si la touche A est préssée
    <>Variable(s) [0009: xhéros] rendre égale à Héros --> Coordonnée X
    <>Variable(s) [0010: yhéros] rendre égale à Héros --> Coordonnée Y
    <>Variable(s) [0011: xmonstre1] rendre égale à [Evénement ID:001 map en cours] --> Coordonnée X
    <>Variable(s) [0012: ymonstre1] rendre égale à [Evénement ID:001 map en cours] --> Coordonnée Y
    <>Variable(s) [0010: yhéros] ajouter 1

Traduction : si le monstre 1 est vivant ets'il reste des MP au héros et que la touche A est pressée, l'évènement stocke les coordonées du monstre 1 ainsi que celle du héros. La coordonnée Y a été modifiée pour une raison graphique et esthétique... Afin que l'animation d'attaque à distance soit mieux centrée sur le héros.

Code:
    <>Attendre 2 Frames
    <>Condition : si la touche Bas est préssée
      <>Variable(s) [0007: MP héros] retirer 5
      <>Modifier position d'un évènement : [Evénement ID:007 map en cours], X: [0009], Y: [0010]
      <>Variable(s) [0010: yhéros] retirer 1
      <>Interrupteur(s) [0004: slash  bas] activé
      <>Déplacer l'évènement : Héros
      :                      : Effet sonore : 096-Attack08', 80, 105

Si la touche bas est appuyée en même temps que Maj, l'évènement 007 représentant l'attaque à distance prend le position déterminée par les variables déterminées ci-dessus (attention! Si le nombre 7 est choisi ici, l'évènement "slash" devra toujours être le septième évènement de chaque map de combat... Ce nombre est conseillé si vous avez choisi 6 comme nombre maximal de monstres par map)
Important: ne pas oublier de faire revenir la variable y héros à la normale...

De plus, l'interrupteur "slash bas" s'active, afin de signaler à l'évènement en question qu'il doit partir vers le bas. Vous êtes libres de remplacer ces commandes par une animation.

Code:
      <>Condition : si la variable [0009: xhéros] est égale à Variable [0011: xmonstre1]
        <>Condition : si la variable [0010: yhéros] est strictement inférieur à Variable [0012: ymonstre1]
          <>Déplacer l'évènement : [Evénement ID:001 map en cours]
          :                      : Attendre : 20 frames
          <>Attendre 15 Frames
          <>Interrupteur(s) [0004: slash  bas] désactivé
          <>Afficher une animation sur [Evénement ID:001 map en cours], [Lumière 1]
          <>Variable(s) [0013: hp monstre1] retirer 5
          <>
  : Sinon
          <>Attendre 15 Frames
          <>Interrupteur(s) [0004: slash  bas] désactivé
          <>

Si le monstre1 est sur la même colonne que le héros, mais plus bas, il se fait toucher par l'attaque à distance, tout simplement!!! L'interrupteur slash bas est ensuite désactivé (le slash est masqué) et l'ennemi perd des hp. Vous pouvez très bien faire varier cette valeur selon la magie du héros par la commande "gestion des variables"=>héros=>intelligence.

Si ce n'est pas le cas (si le monstre ne se fait pas toucher) il faut tout de même désactiver l'interrupteur slash bas, après le même délai (15 frames).

Pour la suite, c'est à peu près la même chose, à ceci près que, pour l'attaque vers le haut, la variable y doit encore être manipulée, pour des raisons d'affichage (vous n'aurez pas ce problème si vous utilisez une animation 😉 )

Maintenant, petite pause sur ce script : j'ai cité l'évènement n°7 sans le présenter...

Page1:
vide^^

Page2:
Code:
------ PAGE 2 ------

Conditions de l'évènement :
- L'interrupteur [0005:slash haut] est activé

Apparence:
- Character : slash, Ton : 0, Regarde en Bas, Modèle n°0, Opacité : 255, Transparence : Normal

Mode de déplacement:
- Type de déplacement : Fixe
- Vitesse de déplacement: Le plus rapide
- Fréquence de déplacement: la plus haute

Options:
- Animé lorsqu'il se déplace
- Mode Fantôme (Traversable) #IMPORTANT!!!

Conditions de déclenchement:
- Processus Parallèle

Commandes d'évènement:

<>Déplacer l'évènement : Cet évènement
:                      : Un pas vers le haut
<>

Ca se passe de commentaires, ce n'est pas très dur à comprendre...
Pour les pages 3, 4 et 5, c'est la même chose. En cas de doute, regardez la démo Smile


Bon, maintenant, on peut revenir sur la fin de notre évènement commun :
il faut qu'en laissant appuyer sur la touche maj, le héros charge son énergie, puis lance une puissante attaque de zone, à large rayon d'action.

Code:
 : Sinon
            <>Attendre 3 Frames
            <>Condition : si la touche A est préssée
              <>Déplacer l'évènement : Héros
              :                      : Modifier l'apparence : 'charaset1', 30, 2, 0
              :                      : Attendre : 10 frames
              <>Attendre 10 Frames
              <>Condition : si la touche A est préssée
                <>Déplacer l'évènement : Héros
                :                      : Modifier l'apparence : 'charaset1', 30, 2, 0
                :                      : Attendre :10 frames
                <>Attendre 10 Frames
                <>Condition : si la touche A est préssée
                  <>Déplacer l'évènement : Héros
                  :                      : Modifier l'apparence : 'charaset1', 30, 2, 0
                  :                      : Attendre : 10 frames
                  <>Attendre 10 Frames
                  <>Condition : si la touche A est préssée
                    <>Déplacer l'évènement : Héros
                    :                      : Modifier l'apparence : 'charaset1', 30, 2, 0
                    :                      : Attendre : 10 frames

Sinon (si aucune touche directionnelle n'est appuyée), on change l'apparence du héros. Ici, il devient blond (l'attaque est trop puissante pour être digne d'un roux??? Nan, c'est juste que j'ai pas de character approprié sous la main...)
Il se bloque pendant une demie-seconde (on ne peut plus le déplacer), et l'évènement attend aussi une demie-seconde. Si la touche est encore appuyée, on recommence (rafraichir aussi l'apparence au cas où le héros se ferait toucher par un ennemi). Puis on recommence encore deux fois afin d'atteindre un temps de chargement de deux secondes. Puis:

Code:
 <>Variable(s) [0007: MP héros] retirer 15
                    <>Afficher une animation sur Héros, [Coup Circulaire]
                    <>Déplacer l'évènement : Héros
                    :                      : Attendre : 20 frames
                    <>Condition : si l'interrupteur [0021:monstre1actif] est activé
                      <>Afficher une animation sur [Evénement ID:001 map en cours], [Slash]
                      <>Interrupteur(s) [0006: STOP!] activé
                      <>Attendre 30 Frames
                      <>Interrupteur(s) [0006: STOP!] désactivé
                      <>Variable(s) [0013: hp monstre1] retirer 10
                      <>
                    : Fin
                    <>
                  : Fin
                  <>
                : Fin
                <>
              : Fin
              <>Déplacer l'évènement : Héros
              :                      : Modifier l'apparence : 'charaset1', 0, 2, 0
          <>

Si la touche est bien restée appuyée, le héros perd 15 mp, l'animation s'affiche, le héros s'arrête pendant 20 frames, pius, si le monstre 1 est actif (et donc en combat^^) on affiche une animation pour montrer qu'il se fait trancher, il se stoppe 30 frames, comme TOUS les monstres de la map (merci interrupteur STOP), puis il perd 10 hp (dix fois plus qu'un coup normal). Ensuite, que la technique ait été exécutée ou non, le héros redevient normal.


Le reste est tellement simple qu'il suffit de regarder la démo... Pas besoin de s'appeler Einstein pour comprendre Very Happy
Afficher les jauges (regarder les instructions au début du script de roys - Merci roys!-), faire en sorte que les mosntres sans HP meurent, puis donner des hp aux monstres PUIS désactiver les interrupteurs de mort à chaque entrée dans la zone.

PS : si vous n'aimez pas ces jauges, un autre script de roys est basé sur des images de jauge que ous créez vous-même! Le lien est au début du tuto.
PPS: pendant que j'y suis : si vous utilisez l'anti-lag de Near Fantastica, il faut le mettre au-dessus des scripts de roys)


------------------------------------------------------------------


Voilà ^^
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum