Les portes (Half-Life)

Écrit le 19/11/2003 par squintik
Dernière mise à jour : 30/01/2006

Introduction

Il y a plusieurs types de portes... dont 2 principaux : les portes coulissantes et les portes rotatives.
Après vous pouvez leur rajouter des vitres ou les combiner... etc... Il y a plein de possibilités... soyez créatifs.
Pour créer ces portes sous Worldcraft, on a à notre disposition 2 entités : func_door et func_door_rotating.
Je vais tenter de vous expliquer les bases pour créer une porte en vous expliquant ma démarche.
Donc je commence par les portes coulissantes... puis j'y rajouterai des vitres, et enfin les portes rotatives.
Pour les paramètres des entités, si vous comprenez que dalle en anglais, allez l'apprendre tout de suite .. ou sinon allez télécharger une traduction française de Worldcraft (HL Albator).
Pour le tutorial, j'utiliserai tous les noms en anglais.
Ah oui, je précise de suite que j'ai fait (presque) comme si je connaissais pas l'entité... en fait c'est pour essayer de vous montrer une démarche à suivre quand vous voulez utiliser une entité que vous connaissez pas.
Je sais pas si tout le monde a la même méthode mais bon un tutorial, c'est personnel donc j'ai expliqué ma méthode.
Ah ouais j'ai beaucoup testé au fur et à mesure mais bon j'ai un peu abusé :p
Configurez votre entité comme vous le sentez, compilez, puis après arrangez ce qui vous plait pas.
Et pour la compil, pour faire rapide, compilez avec le csg en entities only et le bsp en normal et le reste en No.
Mais il faut que vous ne modifiez pas la map et que vous ne créez aucune nouvelle entité (c'est juste pour mettre à jour les params).
Voilà, bonne lecture.

Les styles de portes

1) Les portes coulissantes :

http://www.game-lab.com/images/tuts/hl1_doors/tuto_portes0001.jpg
Mon résultat

Pour mieux vous expliquer, je vais prendre un exemple et expliquer comment je fais pour créer une porte coulissante.
D'abord, j'ai envie de faire une petite map dans les égouts.
Donc je regarde les textures de portes, avec des noms avec dr ou door.
Les textures en dr, y a rien qui me plait...
Par contre la texture C2A3RUSTDOOR1 va très bien pour les égouts ( métal rouillé ) et pour la porte coulissante (en tout cas, je trouve...)
Donc je fais mon bloc... je le fais de la taille de la texture parce qu'elle va bien comme ça ;)
Tie to Entity .. func_door
Bon maintenant, j'ai une porte toute simple.
Je règle dans quel sens elle va se déplacer. Dans mon cas, je mets l'angle à 270.
Je compile et je vais voir ce que ça donne.
Ca va bien avec la map... mais bon la porte est vraiment basique !
On va donc arranger ça... donc il faut régler les paramètres de la func_door pour personnaliser un peu cette porte.
Je regarde la texture, et je trouve que ça fait grosse porte en métal... donc lente à s'ouvrir.
Je regarde les paramètres... et je vois speed ( à 100 si vous avez touché à rien avant ).
Je le mets à 40 pour essayer... je compile .. et je vais voir ce que ça donne.
Ca me va... mais bon pour la porte c'est pas encore ça !
Ca manque de sons.. donc je vais voir les paramètres de la func_door et je vois Move sound et Stop sound.

D'après les noms des sons (allez jeter un coup d'oeil dans le pak au rep soundsdoors) je mets ça :
Move sound : Pneumatic ( Sliding )
Stop sound : Metal Slide Stop
Et oui l'anglais ça sert.. Sliding veut dire coulissante.
Je compile.. et je teste.
Ca va toujours.. la porte s'arrange. Mais bon, encore quelques détails et ce sera encore mieux.
Je me dis ( toujours d'après la texture ) que cette lourde porte doit faire mal si on reste coincé.
Je regarde les paramètres et comme par hasard.. je vois ça : Dammage inflicted when blocked.
Je mets ça à 10 ( le joueur perdra 10 points de vie s'il reste coincé ) parce qu'une porte comme ça, ça fait mal mais ça tue pas non plus ;)
Avant de tester ça, je vais d'abord améliorer un peu plus la porte.
Pour l'instant, quand la porte s'ouvre, elle se déplace de sa largeur ( 96 dans mon cas ) et donc elle rentre complètement dans le mur. Quand elle est ouverte, on ne la voit plus.
Donc ce serait bien d'arranger ça.. parce que ça me plait pas tellement.
Donc, toujours même démarche, je vais voir les paramètres et je vois Lip ( qui veut dire "bords" ) à 0.
En fait, si on le laisse à 0, la porte se déplacera de sa largeur. Donc, si je choisis une porte qui se déplace latéralement, elle se déplacera de sa largeur, pour une porte qui se déplace verticalement, elle se déplacera de sa hauteur.
Le Lip sert à réduire ( s'il est positif ) ou à augmenter ( s'il est négatif ) ce déplacement.
J'ai essayé de bien vous expliquer ce Lip parce qu'il sert pour quelques autres entités ( func_button ... )
Dans mon cas, je vais essayer avec 8 ... je compile.. et je vais voir.
Pas terrible.. par contre pour les dommages quand on est coincé, c'est bon.
En fait, je voudrais qu'on voit toujours la poignée donc je vais essayer 24.
Toujours pareil : compil' puis test.
C'est parfait pour la poignée et ça gêne pas le joueur.
Et voilà, je la trouve pas mal. Bon, bien sur, si vous voulez ajouter quelques trucs ( qu'il faille activer un bouton pour l'ouvrir.. etc ... ) regardez les autres paramètres et les flags aussi.

2) Les portes coulissantes avec des vitres :

http://www.game-lab.com/images/tuts/hl1_doors/tuto_portes0001.jpg
Mon résultat

En fait, pour avoir une porte avec des vitres, il faut utiliser 2 func_door.
Faites votre porte avec vos vitres (aidez-vous de la fonction Clipping).. puis sélectionnez toutes les parties vitrées .. Tie to Entity et enfin func_door.
On va lui donner un nom ( vous verrez pourquoi après ) : porte1 par exemple.
Ensuite, sélectionnez toutes les autres parties de la porte.. toujours pareil une func_door qu'on appellera porte1 aussi.
Donnez leur maintenant une direction ( la même pour les 2 ). Pour moi, c'est vers le Sud donc 270 pour l'angle.
Maintenant, pour la func_door correspondant à la partie vitrée, il faut qu'elle soit transparente donc on met le Render mode à Additive et le Fx Amount à 200 par exemple ( 0 = très transparent ; 255 = peu transparent ).
Bon maintenant, pour pouvoir l'ouvrir il ne suffit pas de s'en approcher pour qu'elle s'ouvre ( parce qu'on lui a donné un nom ). Mais comme j'aime pas trop appuyer sur entrée pour ouvrir une porte, on va se démmerder.
Donc, pour déclencher la func_door, il faut utiliser un trigger.. et comme la porte s'ouvrira à chaque fois que le joueur s'en approche, ce sera un trigger_multiple. Il faut le placer devant la porte.. mais bon je vous conseille de pas la mettre trop près non plus .. en tout cas, il faut que le joueur ne puisse pas l'éviter quand il s'approche de la porte.
Dans le Target du trigger_multiple, mettez porte1 et comme on a mis le même nom pour les 2 func_door, elles s'ouvriront en même temps ( sinon ce serait plutôt pourri ).
N'oubliez pas de mettre un trigger de chaque côté de la porte si vous voulez qu'on puisse l'ouvrir de n'importe quel côté.
Je compile pour tester tout ça..
Et je vois que la vitre ne se déplace pas autant que la partie non transparente. Normal puisque qu'elle ne fait pas la même largeur !
Donc, il va falloir arranger ça et grâce à quoi ? Le Lip ! Et vi .. encore lui ;)
Bon, on va dire que je mets un Lip de 16 pour la porte en général.. donc pour la func_door correspondant à la partie non vitrée, je mets 16 pour le Lip.
Mais pour la partie vitrée c'est un peu plus dur..
Dans mon cas, ma porte fait 80 unités de large ( j'ai pris la texture C1A0DR1) et ma partie vitrée en fait 52.
Mais comme j'ai mis un Lip de 16, la porte ne se déplacera que de 80-16 = 64
Donc, il faut que la partie vitrée se déplace aussi de 64.. donc il nous faut 52-Lip = 64 ( donc un Lip négatif )
Donc Lip = 52-64 = -12
Je compile.. je lance la map.. et voilà c'est nickel.
Bon après, il reste plus qu'à rajouter les sons... etc.. mais je vous laisse faire ça tout seul ;)
Et voilà pour les portes vitrées.. passons aux portes rotatives.

3) Les portes rotatives :

http://www.game-lab.com/images/tuts/hl1_doors/tuto_portes0003.jpg
Mon résultat

Bon pour les portes rotatives, il faut utiliser l'entité func_door_rotating ( pfiou .. j'aurai jamais deviné .. )
Mais ce qu'il faut savoir de très important, c'est qu'il faut inclure un objet origine à cette entité !
En fait, cet objet origine est un brush (un objet si vous voulez..) avec la texture origin.
Cet objet définit l'axe de rotation de la porte.. donc il faut pas le mettre n'importe où.
En fait, mettez le là où se trouveraient les gonds de la porte.
La grandeur de cet objet change rien.. ce qui compte, c'est le centre de cet objet donc ne le faites pas trop petit sinon vous aurez du mal à la retrouver plus tard.
Après, vous sélectionnez votre porte et votre objet origine.. Tie to Entity et func_door_rotating.
C'est bon vous avez une porte rotative.. mais bon je vais préciser quelques trucs.
Regardez dans les paramètres de la func_door_rotating, il y a Distance (deg) qui est à 90 par défaut.
En fait, c'est l'angle de rotation de la porte en degrés. Donc pour 90°, la porte tourne d'un angle droit. Si vous voulez, vous pouvez augmenter diminuer cette valeur mais la diminuer pas trop sinon le joueur ne pourra plus passer.
Si vous avez fait exactement comme moi, votre porte rotative s'ouvrira quand le joueur s'en approche et pourra s'ouvrir dans chaque sens. Si vous voulez qu'elle ne s'ouvre que dans un sens, cochez le flag One-way.
Vous pouvez aussi choisir selon quel axe elle s'ouvre en cochant les flags X Axis ou Y Axis.. si vous n'en cochez pas ce sera selon l'axe Z.
Après, toujours pareil, réglez les autres paramètres si vous avez envie !

4) Les portes rotatives avec des vitres :

C'est encore plus simple que les portes coulissantes avec des vitres..
D'abord créez votre porte.. avec 2 objets origine qui sont sur le même axe.
Puis sélectionnez les parties qui seront transparentes ( les vitres donc ) et mettez les en func_door_rotating sans oublier d'inclure 1 objet origine.
Ensuite, vous sélectionnez les autres objets ( qui seront pas transparents ) et mettez les en func_door_rotating bien sur.
Toujours ne pas oublier l'objet origine ( 1 par entité )
Pour qu'elles se déclenchent en même temps, donnez leur un nom ( le même pour les 2 entités, c'est plus simple ).
Puis faites les trigger_multiple toujours pareil..
Et voilà.. c'est fini ! A vous de l'améliorer un peu plus.

Conclusion

J'espère que vous avez compris les bases pour créer des portes.. maintenant c'est à vous de faire des portes originales, pas que des portes toutes simples ..
Si vous voulez vous entraîner, réfléchissez à certains types de portes qui existent et essayez de les faire.
Par exemple, essayez de faire une porte à double battant.. puis une "double porte rotative", les portes qui tournent tout le temps ( j'arrive pas trop à les décrire mais vous avez peut être compris .. )
Et puis, vous pouvez aussi inventer de nouveaux styles de portes.. etc ..
Ayez un peu d'imagination !
Pour finir, quelques conseils qui peuvent être utiles.

Quelques conseils personnels

- Pour les vitres, utilisez les textures de vitres (GLASS_...).
- Servez-vous bien des textures de portes pour voir si vous faîtes une porte rotative ou coulissante. (donc laissez-vous influencer par la texture)
- Si vous mettez plein de portes dans une map, n'obligez pas le joueur à appuyer sur entrée pour les ouvrir.. c'est vraiment lourd je trouve ! (mais ca dépend des cas bien sur..)
- TESTEZ ! TESTEZ ! ET RETESTEZ !