Aller au menu - Aller au contenu

Icône Les déclencheurs [3]

Mise à jour : 24/01/2012
Difficulté : Facile Facile
2 942 visites depuis 7 jours, dont 48 sur ce chapitre classé 54/786
Dans cette troisième partie apparentée aux déclencheurs, je vais continuer à vous parler des entités de type logic_, que j'appelle des opérateurs, car ils servent à réaliser des opérations comme comparer deux valeurs, appeler une entité aléatoirement...

Je vous ai déjà parlé précédemment des logic_relay (relais d'appels) et de logic_auto (déclenchement automatique au démarrage de la map). Je vais donc vous en expliquer d'autres, globalement moins utiles, mais néanmoins indispensables :) .
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Opérateurs de condition

EntitésTypeDescription
logic_case Point Permet de tester une suite de conditions
logic_branch Point Permet de tester une valeur booléenne


Logic_case



Un logic_case est en quelque sorte l'équivalent d'un switch en programmation. Si vous ne connaissez pas, un switch est une condition qui teste toute une série de valeurs. Par exemple, un switch en Javascript ressemble à ceci :

Code : JavaScript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
switch(valeur) {
        case "1":
                // Si valeur vaut 1 alors...
        break;
        case "thunderseb":
                // Si valeur est égale à thunderseb alors...
        break;
        case "25":
                // Si valeur vaut 25 alors...
        break;
        default:
                / Si valeur n'est égale à aucun des choix précédents...
        break;
}


Image utilisateur
On teste successivement ce que vaut "valeur", et si on trouve, pas exemple que "valeur" vaut 3, on exécute quelque chose.
Eh bien avec le logic_case (remarquez le mot "case", qu'on trouve aussi dans le switch ^^ ), on va aussi tester une valeur et voir si elle correspond à des entrées définies.

En programmation (comme dans mon exemple), on peut mettre beaucoup de conditions de test (il n'y en a que 3 dans l'exemple). Mais dans le logic_case, on ne peut en mettre que 16, ce qui est déjà beaucoup ^^ .

Première utilisation : le switch classic



Lors du test du logic_case, si une des "case" (par "case", comprenez chaque propriété CaseXX) correspond à la valeur, l'output correspondant est déclenché. Par exemple, si la "case" 2 est vérifiée, l'output déclenché est OnCase2. Si aucune "case" ne correspond, on peut déclencher l'output OnDefault s'il est spécifié. Cela veut donc dire que vous devez spécifier claque output possible !

Image utilisateur
Remarquez que vous ne devez pas tout remplir, seulement ce dont vous avez besoin


Pour déclencher le logic_case et débuter le test, il faut utiliser son input InValue (valeur entrante en anglais) en fournissant en paramètre la valeur à tester :

Output namedTargets entitiesVia this inputParameterDelay
OnTrigger super_switch InValue thunderseb 0.00


La valeur envoyée est donc "thunderseb", ce qui correspond à la deuxième "case" (voir mon image ci-dessus). Cela veut donc dire que c'est l'output OnCase2 qui sera déclenché.

Honnêtement, je n'ai pas d'exemple simple et utile de cette utilisation. Cependant, il existe une deuxième utilisation du logic_case qui se révèle beaucoup plus intéressante !

Deuxième utilisation : le switch aléatoire



Une autre utilisation du logic_case consiste à ne pas renseigner les propriétés CaseXX mais seulement les différents outputs OnCaseXX.

Mais comment s'effectue le test des conditions ?


Il n'y a pas de test. Nous n'allons plus utiliser l'input InValue pour déclencher le logic_case, nous allons utiliser l'input PickRandom, qui signifie Choisir aléatoirement . Cela veut donc dire que parmi les différents outputs définis du logic_case, un de ces outputs va être choisi et déclenché.

Et ici, j'ai un exemple concret à vous donner ! (hou que je suis content ^^ ). Imaginez, vous débutez devant 4 portes, et une seule de ces portes est ouverte. Mais la porte qui s'ouvre n'est pas toujours la même. Le but est donc de choisir, au début de la map, quelle porte sera ouverte. Ainsi le joueur aura une petite "surprise" à chaque commencement.

Image utilisateur


Pour mettre cette idée en oeuvre, il suffit de mettre un logic_auto (souvenez-vous, je vous en ai déjà parlé) qui appelle le logic_case, lequel choisira entre 4 outputs différents (1 pour chaque porte). Voici ce que ça peut donner :

Le logic_auto
Output namedTargets entitiesVia this inputParameterDelay
OnMapSpawn super_switch PickRandom <none> 0.00


Le logic_case
Output namedTargets entitiesVia this inputParameterDelay
OnCase01 porte_01 Open <none> 0.00
OnCase02 porte_02 Open <none> 0.00
OnCase03 porte_03 Open <none> 0.00
OnCase04 porte_04 Open <none> 0.00


Logic_branch



Le logic_branch est une entité qui vérifie si une valeur est booléenne. Si vous faites de la programmation, le mot "booléen" vous dit certainement quelque chose. Si ce n'est pas le cas, je vais vous l'expliquer brièvement :) .

Image utilisateur
Une valeur booléenne (boolean en anglais) est une valeur qui peut être soit vraie soit fausse c'est à dire true ou false en anglais ou encore 1 ou 0 en électronique ou en logique.

Les valeurs à utiliser avec un logic_branch sont 0 (pour false) et 1 (pour true).

Donc le logic_branch analyse une valeur pour savoir si elle est vraie ou fausse, et en fonction du résultat du test déclanche ou output :
  • OnTrue : si la valeur est vraie (si c'est 1);
  • OnFalse : si la valeur est fausse (si c'est 0).

Faites attention que 1 est toujours vrai, mais toute autre valeur que 1 est fausse. C'est à dire que si vous mettez 42, c'est comme si vous mettiez 0, donc c'est faux.


Mais comment utiliser cette entité ?


L'entité est simple à mettre en oeuvre mais, je le concède, un peu tordue à comprendre ^^ . Je vais vous expliquer son fonctionnement par le biais d'un exemple :) .

Vous souvenez-vous du func_brush ? Pour rappel, c'est un bloc que l'ont peut afficher ou masquer. Il est censé remplacer son homologue func_wall_toggle qui permet là même chose. Mais le func_wall_toggle a quelque chose en plus, il peut être masqué s'il était affiché, et affiché s'il était masqué (d'où son nom "toggle").

En fait, grâce au logic_branch, je vais reproduire le comportement "toggle" du func_wall_toggle avec un func_brush. !

Hum, ce n'est pas super utile comme truc - utilisez directement le func_wall_toggle -, mais c'est pour vous montrer une application simple et pas trop idiote du logic_branch.


Ce qu'il faut, c'est changer la valeur du logic_branch et l'état du func_brush à chaque fois que le test est effectué. Pour cela, posons que quand le func_brush est affiché la valeur du logic_branch est 1, et s'il est masqué, la valeur est 0.

Commençons par définir les deux outputs du logic_branch qui changent l'état du func_brush. Comme le mur est affiché par défaut, mettez la valeur 1 dans la propriété Value du logic_branch.

Output namedTargets entitiesVia this inputParameterDelay
OnTrue murtoggle Disable <none> 0.00
OnFalse murtoggle Enable <none> 0.00


Grâce à ça, dès que le test est effectué, si il vaut true ça veut dire que le mu est affiché, donc on souhaite le masquer. C'est le contraire s'il vaut false. Évidemment ça ne marche qu'une fois, puisque nous n'avons pas changé la valeur. C'est pour cela que nous allons ajouter deux autres outputs, qui appellent le logic_branch (que j'ai nommé branch) (l'entité s'auto-appelle ^^ ) :

Output namedTargets entitiesVia this inputParameterDelay
OnTrue branch SetValue 0 0.00
OnFalse branch SetValue 1 0.00


Et voilà, votre func_brush est devenu un func_wall_toggle ^^ . Bien sûr si vous mettez un bouton pour faire apparaître/disparaître le mur, vous devez appeler le logic_branch, et non le func_brush en utilisant l'input Test, comme ceci :

Output namedTargets entitiesVia this inputParameterDelay
OnPressed branch Test <none> 0.00

Opérateur de comparaison

EntitéTypeDescription
logic_compare Point Permet de comparer une valeur à une autre


Les deux entités dont je vais vous parler maintenant permet de comparer deux valeurs numériques. Je ne vais pas trop m'attarder sur cette entité, car la probabilité que vous l'utilisiez est vraiment très faible (ou plutôt, c'est une excuse parce que je n'ai pas trouvé d'exemple de leur utilisation ^^ ).

Image utilisateur
Le logic_compare permet de comparer une valeur à une autre et de déclencher 4 outputs :
  • OnEqualTo : si les deux valeurs sont égales
  • OnGreaterThan : si la valeur à comparer est plus grande que la valeur de référence
  • OnLessThan : si la valeur à comparer est plus petite que la valeur de référence
  • OnNotEqual : si les deux valeurs sont différentes (un mix de OnGreaterThan et de OnLessThan quoi ^^ ).

La valeur de référence (ou la valeur de comparaison) se défini dans la propriété Compare Value. La propriété Initial Value est la valeur à comparer, c'est à dire celle qui sera opposée à la Compare Value (valeur de comparaison).

Bien évidemment il y a des inputs pour modifier ces deux valeurs (attention à ne pas les mélanger ^^ ) :

  • SetValue : pour re-définir la valeur à comparer (la propriété Initial Value donc)
  • SetCompareValue : pour re-définir la valeur de comparaison (la propriété Compare Value)

Il y a aussi deux manière de déclencher la comparaison :
  • Compare : le nom parle de lui-même ^^
  • SetValueCompare : ça a le même effet que l'input SetValue, mais après avoir re-défini la valeur, le processus de comparaison est enclenché


Il existe aussi une autre entité, nommée logic_multicompare qui permet de comparer plusieurs valeur. Vous risquez encore moins de la rencontrer ^^ .

Opérateur temporel

EntitéTypeDescription
logic_timer Point Permet déclencher des évènements en fonction du temps


Image utilisateur
Le logic_timer est une entité assez intéressante. Elle permet de déclencher des outputs à intervalles de temps réguliers ou irréguliers (aléatoire).

Image utilisateur
Pour vous expliquer son utilisation, je vais l'utiliser pour jouer un son d'ambiance bien sympa comme... le cris d'un Fast Zombie dans la nuit noir et brumeuse de Ravenholm :D .

Le principe est vraiment très simple. Un logic_timer va appeler un ambient_generic après un laps de temps aléatoire.

Commencez par placer votre ambient_generic et utilisez le son NPC_FastZombie.AlertFar. Pensez aussi à cocher le flag Play everywhere. Pour mon exemple je vais nommer cette entité "crifastzombie" (je sais, c'est original ^^ ).

Maintenant, au tour du logic_timer. Comme vous devriez déjà l'avoir remarqué, il n'y a pas énormément de propriétés. Comme nous allons jouer le son à intervalles irréguliers, mettez Yes pour la propriété Use Random Time. Il s'agit ensuite de définir les propriété Minimum et Maximum Random Time. Une valeur comprise, en secondes, entre ces deux valeurs sera utilisée comme temps aléatoire.

La propriété Refire Interval est à utiliser si vous n'utilisez pas un intervalle de temps aléatoire. Dans ce cas, cette propriété définit le temps avant le prochain déclenchement des outputs de l'entité.


Maintenant ajoutons un petit output pour jouer le son :

Output namedTargets entitiesVia this inputParameterDelay
OnTimer crifastzombie PlaySound <none> 0.00


J'utilise l'output OnTimer qui est exécuté quand le temps (aléatoire ou non) est atteint. Il existe aussi deux autres outputs, OnTimerHight et OnTimerLow qui sont déclenchés respectivement quand le temps le plus haut est atteint et quand le temps le plus bas est atteint. Ça n'a bien sûr pas d'intérêt ici.

Voilà, c'est prêt :) . Une longue complainte de zombie viendra égayer votre map ^^ .

Pour terminer, quelques inputs qui peuvent être utiles :
  • RefireTime : pour re-définir la propriété Refire interval
  • FireTimer : déclenche immédiatement le timer. Ça appelle en fait son output OnTimer, sans tenir compte de l'intervalle de temps (à utiliser si vous êtes pressé ^^ )
  • LowerRandomBound : pour re-définir le temps minimum
  • UpperRandomBound : pour re-définir le temps maximum
D'autres outputs plus précis (comme ajouter ou soustraire) on été ajoutés pour Half-Life² Episode 2. Voyez le wiki de Valve pour plus d'infos sur ces inputs.

Chapitre précédent Sommaire Chapitre suivant

Partager

1 commentaire pour "Les déclencheurs [3]"
Note moyenne : 3.89 / 4 (103 votes)
Pseudo Commentaire
Hors ligne E1iteGam3r # Posté le 06/03/2012 à 19:30:23
Avatar

Avis : Très bon

Salut , d' abord merci pour ce super tuto mais je voudrai savoir si c' est possible d' utiliser le logic_branch dans mon projet. Ce dernier est en faite un niveau dans lequel , par usage d' un bouton, le joueur change de dimension. (Le changement de dimension consiste seulement à faire apparaitre ou disparaitre des murs ) Merci d' avance. Je cherche juste un moyen de faire toogle pour plusieurs blocs dans une meme map et plusieurs entitées bloc




J' ai oublier une partie du commentaire

Voir tous les commentaires