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).
| |
| | |
|