M   E   N   U

  N  E  W  S
    News
       Mugen News
       Site News
       Old News

 D  O  W  N  L  O  A  D
    Characters
       Athena 2001
       Athena 2002
       Neo Athena
       Evil Ryu
       Violent Ken
       Lynn Baker
       Karin
       Sissy
       Sakura
    Hosted
       Diao
       Kyo
    Stages
       Neogeo 1
       Neogeo 2
       Neogeo 3
       Neogeo 4
       EFZ
       EFZ 2
       Melty Blood
       Others
    Add-ons
       Screen Pack
       Tools/Others
       Video

 W  I  P
    Characters
       Mina

 D  O  C  S
    Tutoriels (FR)
       Personnages
       Stages
       Barres de vie
       Screen Pack
       Intro-Fin
    FAQ (FR)
       Lexique
       Mugen
       Personnages
       Stages
       Screen Pack
       Communauté
    Mugen Torch
       Text in French
       Text in English

 A  R  T  S
       Iris-Net



Tutorial Création et Adaptation de personnages sous Mugen par Sunny : 4eme Partie


En pratique


Bon, après ces quelques considérations d'ordre général, nous allons voir les states un peu plus en détail en créant une première attaque totalement basique.

Auparavant il vous vaudra faire un travail important pour la suite : parcourir une première fois le State Controller Reference et le Trigger List. La première lecture est toujours pénible car on ne comprend pas grand chose a ce qui y est décrit. Ce sera surtout vrai pour les anglophobes (en plus je crois pas qu'il y ait de traductions de ces docs sur le net). Ceci dit, forcez vous a le lire une première fois ; après cette première lecture, vous commencerez a voir ce qu'il est possible de faire sous Mugen.
De plus, ces deux documents deviendront vos documents de référence pour toute la partie programmation de la création de votre perso alors autant commencer a se familiariser un peu avec eux (Sauf si vous avez Mugen Help).

Pour en revenir a la pratique, la création de notre première attaque se fera en deux phases : la programmation du coup dans le CNS et son activation dans le CMD.

Le CNS

Dans le CNS, nous allons créer le state de l'attaque. Tapez :

[Statedef 200]
StateType = S
MoveType = A
Physics = S
anim = 200
sprpriority = 2
vel = 0,0
ctrl = 0

La ligne [Statedef 200] indique a Mugen que nous entrons dans un nouveau state, en l'occurrence le no 200. Les lignes suivantes indiquent les paramètres (caractéristiques) de ce state. En théorie, elles sont tout a fait optionnelles : il est possible de définir et de modifier ces informations dans la suite du state. En pratique, il est préférable de mettre ces infos des la définition du state. Ainsi, en un coup d’œil il sera possible de voir a quoi correspond ledit state.

Le StateType indique dans quel état est le perso : debout (S = Standing), accroupi (C = Crouching), en l'air (A = Air), a terre (L = Lie Down) ou inchangé par rapport au state précédent (U = Unchanged). En pratique, vous utiliserez fréquemment les trois premiers états, peu l'avant-dernier et rarement le dernier.

Le MoveType indique la nature du mouvement du personnage : si il est en train d'effectuer une attaque (A = Attack), si il vient d'être touche (H = Hit), si il effectue un mouvement neutre (ex : marcher, sauter - I = Idle) ou si ce mouvement est le même qu'au state précédent (U = Unchanged). N'oubliez pas de mettre \"A\" pour une attaque, ou le programme ne cherchera même pas a détecter si votre attaque touche ou pas l'adversaire.

Le Physics indique quelles loi physiques le programme doit appliquer : perte de vitesse due a la friction lorsque le personnage est debout (S = Standing), accroupi (C = Crouching), application de la gravite si le perso est en l'air (A = Air) ou application d'aucune de ces lois physiques (N = None). Dans ce dernier cas, le perso ne ralentira pas naturellement et ira indéfiniment dans la direction indiquée a la vitesse que vous lui aurez donne. Si vous ne le stoppez pas a un moment ou a un autre, il
sortira de l'écran. Dans le cas du physics = A, le personnage ira directement au state de l'atterrissage des qu'il touchera le sol.

Le anim indique le numéro de l'animation a jouer. En règle générale, si vous avez suivi les conseils que je vous ai donne dans les parties précédentes concernant la numérotation des groupes d'images et des animations, ce numéro sera le même que le numéro du state.

Le sprpriority (Sprite Priority) indique a Mugen dans quel ordre doivent être affiches les sprites ; les personnages ayant un sprpriority élevé seront affiches par dessus ceux en ayant un bas. Ces chiffres peuvent varier de -5 a 5. Généralement le stance a une priorité de 0, les mouvements neutres une priorité égale a 1, les attaques une priorité de 2 et les mouvements lorsque le perso est touche une priorité égale a -1 ou -2.

Le vel (Velocity) indique la vitesse horizontale et verticale a imprimer au personnage au début du state. Cette vitesse pourra être modifiée par la suite.

Le ctrl (Control) indique si le joueur peut contrôler le joueur pendant ce state : 1 = le personnage peut être contrôlé ; 0 = le personnage ne peut pas être contrôlé. En règle générale, le joueur ne peut pas modifier le cours d'un mouvement avant que celui-ci n'est pas termine ; il serait bizarre de voir le perso sauter alors qu'il n'avait pas fini de donner son coup.

Les autres paramètres qu'il est possible de définir dans le statedef sont : poweradd, juggle, faceP2, hitdefpersist, movehitpersist et hitcountpersist. Pour l'instant, nous ne nous occuperons pas de ces derniers. Si vous voulez neammoins des infos dessus, n'hésitez pas a demander ou a vous reporter sur le document CNS Format ( cns.txt).

A présent que nous avons défini la nature de ce state, nous allons indiquer a Mugen quelles actions il doit effectuer dans ce state. Pour celui-ci, il y en aura deux : détecter si l'attaque a touché l'adversaire et revenir au stance une fois cette attaque effectuée.

Tout d'abord nous allons créer une action pour détecter si notre attaque à touché l'adversaire :

[state 200, hitdef]
type = hitdef
trigger1 = animelem = 3
attr = S, NA
hitflag = SCA
guardflag = MA
animtype = light
ground.type = low
priority = hit, 4
damage = 60, 0
getpower = 80, 0
pausetime = 4, 4
ground.slidetime= 6
ground.hittime = 16
guard.pausetime = 0, 6
guard.slidetime = 6
guard.hittime = 24
guard.ctrltime = 24
air.hittime = 14
sparkno = 10
guard.sparkno = 40
sparkxy = (FrontEdgeBodyDist - FrontEdgeDist), -50
;hitsound =
;guardsound =
ground.velocity = -3
guard.velocity = -5
air.velocity = -4, -5

Le [state 200, hitdef] indique a Mugen le début d'une action a effectuer. Le state 200 indique que cette action appartient au state no 200. L'information qui suit (ici hitdef) est le nom de cette action en particulier. Cette information est facultative : vous pouvez soit ne rien mettre, soit mettre un nom de votre choix. Je vous conseille de donner un nom a l'action, nom qui doit être en rapport avec ce que fait l'action. Si jamais il y a une erreur dans l'une des actions du state, Mugen vous
indiquera précisément le nom de l'action qui pose problème.

Le type = hitdef indique la nature de l'action. Ici, nous allons détecter si l'attaque a touche l'adversaire (hitdef) et dans l'affirmative, ce que doit faire Mugen.

le trigger1 = animelem = 3 est le déclencheur de l'action. Ici Mugen regarde si les boites d'attaque de la troisième image du perso (animelem = 3) touchent les boites de collision de son adversaire.

S'ensuivent tous les paramètres de cette action. Je n'en ai mis ici qu'une partie : ceux qui me paraissent appropries pour l'attaque que nous créons. Pour savoir quels sont les autres paramètres, consultez le State Controller Reference.

Le attr (attributes) indique les caractéristiques de l'attaque. Le premier élément indique si c'est une attaque debout (S), accroupie (C) ou aérienne (A). Le deuxième indique si c'est une attaque normale (N = Normal), si c'est un coup spécial (S = Special) si c'est un super/hyper (H = Hyper) et si cette attaque est un coup (A = Attack), une projection (T = Throw) ou un projectile (P = Projectile). dans le cas présent, l'attaque que nous construisons est un coup normal effectue alors que le personnage est debout.

Le hitflag indique dans quelle position doit être l'adversaire pour que l'attaque le touche : debout (S), accroupi (C), debout ou accroupi (M = Medium), en l'air (A), en train de tomber (F = fall) ou a terre (D = Down). Pour cette attaque, l'adversaire doit être debout, accroupi, en l'air ou en train de tomber. Ce seront les paramètres standards de la plus part des attaques debout.
Le guardflag indique dans quel état doit être l'adversaire pour pouvoir bloquer l'attaque. Ici, il doit être debout, accroupi ou en l'air.
Ces trois paramètres sont obligatoires : ils doivent toujours être présents lors de la définition d'une attaque. Les paramètres suivants sont optionnels.

Le animtype indique quelle animation doit être jouée par l'adversaire si le coup le touche :
- light pour les coups faibles.
- medium pour les coups moyens.
- hard pour les coups forts.
- back pour les coups qui renversent le perso.
- up pour les coups qui envoient le perso en l'air.
- diagup pour les coups qui envoient le perso en arrière et en l'air. Utilisez diagup si le perso atterrit sur le ventre au lieu du dos après que vous l'ayez envoyé dans les airs.

Même chose pour le ground.type. Utilisez :
- high pour les attaques à la tête.
- low pour les attaques à l'estomac.
- trip pour les attaques qui renversent l'adversaire.
- none pour ne pas changer l'animation.
Le ground.type sera probablement à mettre au jugé ; dans certains jeux de combat, cette animation dépend de l'endroit où a été touché le perso.

Le priority indique quelle est la priorité du coup. Lorsque deux coups sont donnés en même temps, celui qui a la plus grande priorité touchera en premier le perso. Le premier paramètre, qui varie entre 1 et 7 indique cette priorité. Le second indique la nature du coup : Hit, Dodge ou Miss. Lorsque 2 coups de même priorité se rencontrent voici ce qui se passe (selon le State Controller Reference) :
Hit vs Hit -> les deux joueurs sont touchés.
Hit vs Dodge -> le Dodge évite le Hit (aucun perso n'est touché).
Hit vs Miss -> le Hit touche mais le Miss rate (seul ce perso est touché).
Dodge vs Dodge -> les deux joueurs s'évitent (aucun perso n'est touché).
Dodve vs Miss -> un joueur évite un coup qui ratait de toute façon (donc aucun perso n'est touché)/
Miss vs Miss -> les deux joueurs se ratent (aucun perso n'est touché).
La plus part de vos coups seront en 4, Hit (attaque standard).

Le damage indique les points de vie à retirer à l'adversaire et le damage indique les points d'énergie à donner au perso. Le 1er nombre est appliqué si le coup a touché et le 2ème nombre est appliqué si le coup a été paré.
Pour calculer ces valeurs, regardez le nombre de pixels de vie que fait perdre votre perso dans son jeu d'origine. Divisez cette valeur par la largeur de la barre de vie et multipliez par 1000 pour obtenir la valeur à utiliser sous Mugen (arrondissez comme vous le souhaitez si la division ne tombe pas juste - 99% des cas). Prenez le héros dudit jeu d'origine pour calculer ces valeurs : il y a de fortes chances qu'il ait une défense moyenne, ni trop haute, ni trop basse. Lorsque vous effectuez votre calcul, prenez garde à ne pas enchaîner les coups : si j'ai bien compris, apparemment dans certains jeux la défense d'un perso peut augmenter avec le nombre de coups reçus. Pour éviter cette déformation, enregistrez la partie au moment où celle-ci débute (touche F11 sous NeoRage) et rechargez là pour chaque calcul (touche F12 sous NeoRage).

Le pausetime indique pendant combien de ticks le perso (1ere valeur) et son adversaire (2ème valeur) doivent rester immobiles sous l'effet du coup. Le ground.slidetime indique pendant combien de temps l'adversaire doit reculer sous l'effet du coup. Le ground.hittime indique la durée totale pendant laquelle l'adversaire est sous l'effet du coup (pausetime + slidetime + temps de récupération une fois que l'adversaire à fini de reculer).
Pour calculer ces valeurs, il suffit de frapper un adversaire avec son perso dans son jeu d'origine et de regarder pendant combien de ticks les persos restent immobiles (ou tremblent) et pendant combien de ticks le perso touché recule puis récupère.
Même remarques que précédement pour le guard.pausetime, le guard.slidetime et le guard.hittime, hormis que ces valeurs s'appliquent lorsque l'adversaire a paré le coup. Le guard.ctrltime indique après combien de temps le perso qui a bloqué peut recommencer à bouger. Généralement cette valeur est égale au guard.hittime. Si rien n'est spécifié, le perso retrouve le contrôle de lui même une fois qu'il a fini de glisser.

Comme précédemment le air.hittime indique la durée pendant laquelle le perso est incontrôlable lorsqu'il a été touché alors qu'il était en l'air.

Le sparkno indique quel spark (effet graphique lorsque le coup touche l'adversaire) utiliser si le coup touche l'adversaire, le guard.sparkno indique quel spark utiliser si il a bloqué cette attaque et le sparkxy indique où placer ces sparks. L'abscisse est placée en fonction du centre de l'adversaire et l'ordonnée en fonction du centre du personnage. Personnellement je place horizontalement le spark là où se termine le corps de l'adversaire (d'où le FrontEdgeBodyDist - FrontEdgeDist).
Ces sparks sont les sparks standards du screenpack. Bizarrement, je n'ai trouvé trace des différents effets qu'il était possible d'appliquer que dans le fichier des incompatibilités ( incompt2.txt). Référez vous à ce fichier pour voir quels effets peuvent être appliqués. Attention toutefois : j'ai l'impression que certains ne fonctionnent pas/plus (le medium ou le strong guard spark).
Si vous préférez jouer une animation de votre fichier AIR, tapez S suivi du numéro de l'animation qui vous intéresse.

Le hitsound et le guardsound indiquent quels sons jouer si le coup touche ou est bloqué. Pour l'instant vous n'avez pas de fichier son, donc mettez ces lignes en commentaires.

Enfin le ground.velocity, le guard.velocity et le air.velocity indiquent quelle est la vitesse de recul de l'adversaire lorsque celui-ci est touché à terre ou en l'air ou si il a bloqué le coup. Si l'ordonnée est négative, le joueur sera projeté en l'air.

Petit conseil : si vous avez un tableur du type Excel, créez vous un tableau où seront regroupées ces infos pour chaque coup du perso. Cela vous permettra de :
1 - ne pas tout recalculer si vous perdez votre CNS. 2 - de comparer les caractéristiques des coups au cas où vous voudriez en rajouter par la suite.

La deuxième action que nous allons créer dira au programme de sortir de se state une fois que le coup aura été donné.

[State 200, end state]

type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1

Cette action dit au moteur de jeu de sortir de ce state (ChangeState) pour retourner au state du stance (numéro 0) lorsque la fin de l'animation que nous avions indiqué au départ est atteinte (AnimTime = 0).

Si l'attaque était une attaque accroupie, le state d'arrivé aurait été le 11 (personnage accroupi attendant que vous lui fassiez faire une action). Pour les attaques aériennes, cette action est inutile. En effet, dès que le perso touche le sol, il va directement au state de l'atterrissage qui le redirige automatiquement vers le stance.

A titre d'indication, voici la différence entre Time et AnimTime pour ceux qui confondraient les deux :
- time indique depuis combien de ticks le joueur est dans le state.
- AnimTime indique dans combien de ticks la fin de l'animation sera atteinte (avant de relooper).




 
   Home
   About
   FAQ
   Disclaimer
   Staff/Thanks
   Contact



   Forum in french
   and english.

   Iris-Net



   
   Delta Park
   Sunny World
   Neoxfight Studios
   Mike Mugen
   Gods Anger
   Matmut's Creations
   Byakko
   :o domain
   Fun Factory
   Mugen Guild
   Anime Mugen
   Shin Mugen





Cute Mugen | © 2002 - 2004 | All Rights Reserved.