----------------------------------- Mike Werewolf Vendredi 04 Février 2005 17:17 05. Les bases de la programmation (suite) ----------------------------------- 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 : command = "x" triggerall = statetype = S trigger1 = Ctrl = 1 - dans une expression quelconque : 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) : 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 : [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 : [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 : 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 : [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 : [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. ----------------------------------- Anji Vendredi 03 Novembre 2006 15:10 ----------------------------------- 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" Invalid trigger : target ----------------------------------- Mike Werewolf Dimanche 05 Novembre 2006 19:54 ----------------------------------- Je confirme la réponse. Elle est explicitement fournie par Elecbyte, en fait : NB : les redirections multiples (ex : root, target, time) ne sont pas supportées pour l'instant. Mike Werewolf.