Pas besoin de vous inscrire pour télécharger / No need to register for downloading.
Une fois inscrit, vous devez m'envoyer un mail pour valider votre compte / Once registered, you must send me an email for validating your account.
 S'enregistrer  |  FAQ  |  Lexique  |  Rechercher  |  Liste des Membres  |  Groupes d'utilisateurs 

 Annuaire  |  Connexion 

 Ce forum en page de démarrage

 Informations pratiques 
 Merci de lire les règles ! 

   Télécharger le sujet
05. Les bases de la programmation (suite)
Mike Werewolf
Loup-garou

Site Admin


Inscrit le: 07 Oct 2004
Messages: 1676
Karma: 52
plus / moins

Localisation: France
Répondre en citant
Le terme "trigger" peut désigner deux choses relativement distinctes. Normalement, c'est le contexte qui permet de savoir à quelle signification on se réfère (un peu comme le terme "state" pour "state" et "state controller").

Voici ces deux significations :
- Les fonctions trigger
- Les conditions trigger

LES FONCTIONS TRIGGER

Ce sont celles qui sont regroupées dans la doc trigger.txt du dossier doc de Mugen. Ces fonctions renvoient des données précises, ce sont des fonctions d'information, par opposition aux fonctions d'action que sont les sctrl. Quelques exemples de fonctions trigger courantes :
- Vel X : donne la vitesse en x du personnage
- Pos Y : donne la position en y du personnage
- NumProj : donne le nombre de projectile existant appartenant au personnage
- Time : donne le temps écoulé depuis que le perso est dans le state actuel (appelé aussi StateTime)
- Ctrl : donne la valeur du flag Ctrl : 0 si le joueur n'a pas le contrôle du perso, 1 sinon
- etc.

Les fonctions trigger peuvent être utilisées dans les conditions trigger mais également dans les expressions (en fait, nous allons le voir, les conditions trigger sont des expressions). Exemples d'utilisation de fonction trigger (elles sont en gras) :

- dans des conditions trigger :
Citation:
[State -1]
type = ChangeState
value = 200
triggerall = command = "x"
triggerall = statetype = S
trigger1 = Ctrl = 1


- dans une expression quelconque :
Citation:
[State 200]
type = VelAdd
trigger1 = 1
Y = Time/2


Je ne pense pas qu'il y ait grand-chose à dire de plus sur ces fonctions ; vous trouverez tout ce dont vous avez besoin dans le Mugen Help ou dans le Mugen Doc.

La seule véritable subtilité qui existe avec les triggers sont les "redirections de triggers" que nous allons voir maintenant.

LES REDIRECTIONS DE TRIGGERS (FONCTIONS TRIGGER)

Il arrive parfois que l'on ait besoin de connaître certaines informations relatives à un joueur autre que notre propre personnage. Par exemple, on peut vouloir savoir le nombre de projectiles appartenant à l'adversaire actuellement présents à l'écran. On peut également avoir besoin de savoir la valeur d'une variable d'un helper, etc.

Pour cela, nous allons simplement utiliser les fonctions trigger, mais en les redirigeant vers le personnage voulu. Comment cela se passe ? En fait, c'est très simple, il suffit de faire précéder le trigger que l'on veut utiliser du joueur vers lequel on redirige le trigger et de séparer les deux par une virgule. Par exemple :

- NumProj : donne le nombre de projectiles appartenant à P1
- Enemy,NumProj : donne le nombre de projectiles appartenant à P2

- var(41) : donne la valeur de la variable entière n°41
- Helper(5000),var(41) : donne la valeur de la variable entière n°41 de l'Helper n°5000

Voici les redirections que l'on peut ainsi utiliser (en vous rappelant que les helpers sont considérés, d'un point de vue technique, comme des persos) :
- parent : redirige le trigger vers le "parent" du perso (ceci n'est valable que si le perso est un helper).
- root : redirige le trigger vers la "racine" du perso (càd vers le perso principal, n'est valable qu'avec un helper).
- helper : redirige le trigger vers le premier helper trouvé appartenant au joueur.
- helper(ID) : redirige le trigger vers l'helper ayant le numéro ID spécifié entre parenthèses.
- target : redirige le trigger vers la première cible trouvée.
- target(ID) : redirige le trigger vers la cible ayant le numéro ID spécifié entre parenthèses.
- partner : redirige le trigger vers le partenaire du joueur. Les helpers ne sont pas considérés comme des partenaires.
- enemy : redirige le trigger vers le premier ennemi trouvé. Les helpers ne sont pas considérés comme des ennemis.
- enemy(N) : redirige le trigger vers le Nième ennemi trouvé (N = 0 pour le 1er ennemi, 1 pour le deuxième).
- enemyNear : redirige le trigger vers l'ennemi le plus proche.
- enemyNear(N) : redirige le trigger vers le Nième ennemi le plus proche (même remarque que pour enemy(N)).
- PlayerID(ID) : redirige le trigger vers le joueur dont l'ID unique correspond au numéro ID spécifié entre parenthèses.

Quelques mots sur les root et parent :
- Admettons qu'on ait un perso "Toto" (perso principal = P1).
- Toto crée un helper nommé "H1". Pour H1, les redirections "root" et "parent" appliqueront le trigger sur "Toto".
- H1 crée un helper nommé "H2". Pour H1, la redirection "root" renverra à "Toto", alors que la redirection "parent" renverra à "H1".

LES CONDITIONS TRIGGER

Là, on ne parle plus de fonction, mais de conditions de déclenchement d'un sctrl. Concrètement, ce sont toutes les lignes qui commence par le mot "trigger". Voici un exemple (les conditions sont mises en gras) :

Citation:
[State -1]
type = ChangeState
value = 200
triggerall = command = "x"
triggerall = statetype = S
trigger1 = Ctrl = 1


J'appellerai "triggerX" les triggers suivis d'un nombre (trigger1, trigger2, etc.). Lorsqu'on parle par exemple du "trigger1", on parle bien entendu de toute la ligne débutant par "trigger1" (donc ici : "trigger1 = Ctrl = 1"). Il arrive qu'il y ait plusieurs lignes avec le même numéro de trigger, exemple :

Code:
[State -1]
type = ChangeState
value = 200
trigger1 = command = "x"
trigger1 = statetype = S
trigger1 = Ctrl = 1


Dans ce cas, on désignera la ligne voulue ainsi : trigger1,1 pour le premier trigger1, trigger1,2 pour le second trigger1, etc. Si on parle du "trigger1" sans préciser ",1" ou ",2" ou ",3", on parle dans ce cas de l'ensemble des lignes commençant par trigger1.

Si les deux concepts sont assez faciles à aborder, il y a quand même pas mal de choses à dire sur les conditions de trigger. Tout d'abord, quelques règles :
- Tout sctrl doit avoir au moins un trigger1
- Pour qu'un sctrl soit déclenché, il faut que TOUS ses triggerall (s'il y en a) soient vrais et qu'au moins un des triggerX soit vrai. Un trigger (condition trigger) est vrai quand l'expression qui le définit est différente de 0.

Par exemple, dans le sctrl ci-dessus, pour que le ChangeState se déclenche, il faut que toutes les conditions suivantes soient réunies :
- Que la commande "x" ait été réalisée
- Que le perso soit en Stand
- Que le joueur ait le contrôle

Les triggerX
Les triggerX représentent les différents cas de déclenchement possible. Chaque numéro représente un cas, ce qui signifie que plusieurs triggerX ayant le même numéro se rapportent au même cas. Pour qu'un sctrl se déclenche, il faut qu'un cas soit complètement réalisé, c'est à dire que tous les triggers de ce cas soit vrais.

Par exemple :
Code:
[State 200]
type = VelAdd
trigger1 = Time = 0
trigger2 = Anim = 201
trigger2 = MoveContact = 1
X = 1


Ici, il y a deux cas de déclenchement. Pour que le sctrl se déclenche, il faut :
- que le trigger1 soit réalisé, c'est à dire que le trigger Time (fonction trigger) soit égal à 0 - Premier cas -
OU
- que le trigger2 soit réalisé, c'est à dire que l'animation jouée soit la numéro 201 (trigger2,1) ET que le trigger MoveContact (fonction trigger) ait une valeur de 1 (trigger2,2) - Deuxième cas -

On ne peut pas sauter de numéros entre les triggerX : on ne peut donc pas avoir trigger1, puis trigger3 sans avoir trigger2.

Mugen stoppe son analyse dès qu'un cas de déclenchement est réalisé : il déclenche le sctrl puis passe au sctrl suivant. On peut donc ainsi coder un même effet pour deux occasions différentes. Par exemple, si on veut jouer un même son au début et à la fin du state, plutôt que de faire deux sctrl, on mettra ceci :

Citation:
[State 200]
type = PlaySnd
trigger1 = Time = 0 ; pour jouer le son au début du state
trigger2 = AnimTime = 0 ; pour jouer le son à la fin de l'animation (qui marque généralement la fin du state)

value = 4,0


Intéressons-nous maintenant au cas des triggerall

Les triggerall

Ce sont des conditions générales de déclenchement. Un exemple sera plus parlant :

Code:
[State 200]
type = VelAdd
triggerall = Pos Y < 0
trigger1 = Time = 0
trigger2 = Anim = 201
trigger2 = MoveContact = 1
trigger3 = P2Dist X = [50,100]
trigger4 = command = "holdfwd"
X = 1


Ce code équivaut à celui-ci :

Code:
[State 200]
type = VelAdd
trigger1 = Pos Y < 0
trigger1 = Time = 0
trigger2 = Pos Y < 0
trigger2 = Anim = 201
trigger2 = MoveContact = 1
trigger3 = Pos Y < 0
trigger3 = P2Dist X = [50,100]
trigger4 = Pos Y < 0
trigger4 = command = "holdfwd"
X = 1


Dans le deuxième code, on retrouve la condition "Pos Y < 0" dans TOUS les triggerX. On peut donc généraliser cette condition en la mettant en triggerall, comme dans le premier code.

Avec tout ça, vous devez normalement avoir compris le principe de fonctionnement des personnages et des states. La prochaine étape, qui est peut-être la plus intéressante, concerne les expressions, qui permet de donner des valeurs au paramètres des sctrl, de former les triggers, etc.

A partir de là, nous pourrons quitter la théorie.

Mike Werewolf.
Mike Werewolf est absent 
Anji



Inscrit le: 11 Oct 2006
Messages: 101
Karma: 5
plus / moins

Localisation: Hungary
Répondre en citant
Question : la redirection est-elle cumulative ?

Exemple : je voudrais faire un trigger sur la commande que rentre le propriétaire de l'helper le plus proche de moi (en partant du principe que je sais que cet helper existe, bien entendu). Est-ce que le trigger suivant fonctionnerait ?

triggerX = root,target,command = "x"

[Edit]
Réponse : non... Mugen attend un trigger après un attribut redirectionnel.

Code:
Invalid trigger : target
[/Edit]
Anji est absent Kicker ce membre de ce sujet
Mike Werewolf
Loup-garou

Site Admin


Inscrit le: 07 Oct 2004
Messages: 1676
Karma: 52
plus / moins

Localisation: France
Répondre en citant
Je confirme la réponse. Elle est explicitement fournie par Elecbyte, en fait :
Exp.txt traduit a écrit:
NB : les redirections multiples (ex : root, target, time) ne sont pas supportées pour l'instant.


Mike Werewolf.
Mike Werewolf est absent 
05. Les bases de la programmation (suite)
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum
Toutes les heures sont au format GMT + 2 Heures  
Page 1 sur 1  
Télécharger le sujet
  
  
 Poster un nouveau sujet