Page 1 sur 1

[TUTORIEL] [SCRIPTS] Création d'une CutScene (Cinématique)

Posté : lun. 21 févr. 2005, 00:45
par Shinook
Ce tutorial vient de la TeamBG, et il me semblait intéressant d'en faire une traduction, car les CutScenes rajoutent un côté plus vivant et attractif à un MOD.

Tutorial pour les scripts de CutScene
Par Max a.k.a Potencius
Traduit par Shinook


Etape 1 : Préface

Les scripts de CutScene sont ce que vous voyez, dans le jeu, lorsque vous ne pouvez plus cliquer sur l'écran. Durant ces CutScenes, les personnages et d'autres choses peuvent agir sans peur d'être interrompus par le joueur. Il s'agit juste d'une vision générale qui éclarcit certains points qui peuvent vous poser problème.

Etape 2 : Comment est construit une CutScene

La suite met en avant la forme générale que prend une CutScene. Elle inclut deux ou plus de scripts.

Le premier script aura toujours les actions suivantes, à la fin, qui introduisent la VERITABLE CutScene...

IF
TriggersHere()
THEN
RESPONSE#100
ClearAllActions() // Voir Note #1
StartCutSceneMode() // Voir Note #2
StartCutScene("SCRIPT") // Voir Note #3
END
Notes:

1. C'est facultatif, mais vérifiez que les actions faites par les personnages ou des créatures sont annulées avant que la coupure ne commence.
2. Cette action est ce qui empêche le joueur de cliquer sur l'écran.
3. Cette action renvoie au second script qui, en réalité, réalise les actions de la CutScene.

>> -----<<

Très bien, voyons maintenant la forme générale du second script qui réalise les actions de la CutScene.

IF
True() // Voir Note #4
THEN
RESPONSE#100
CutSceneID(Object) // Voir Note #5
ActionsHere()
EndCutSceneMode() // Voir Note #6
END
4. Le "trigger" est toujours considéré comme "True" ( vrai en français ) dans une CutScene de toute façon, donc vous pouvez le faire simplement pour vous !
5. Cette action ( si on peut l'appeler comme ça ) doit être écrite au début du script d'une CutScene. Elle indique qui crée les actions qui la suivent.
6. Le nom est assez révélateur. Elle permet au joueur de recliquer sur l'écran.

Etape 3 : Actions

Les actions dans les scripts d'une CutScene sont plutôt étranges ( ou logiques, quoi que vous pensiez ) dans la façon dont elles fonctionnent. J'essaierai de l'expliquer du mieux que je puisse.


D'abord, j'aborderai l'action la plus fréquemment utilisée dans les scripts de CutScene, "ActionOverride()".
ActionOverride() spécifie un acteur et dit à cet acteur de faire une action. Donc, dans une CutScene, ça doit ressembler à ça...

IF
True()
THEN
RESPONSE#100
CutSceneID(Player1)
ActionOverride("TROLL",Kill(Myself)) // Voir Note #7
EndCutSceneMode()
END
7. Cette action a fait à "Player1" ( celui qui contrôle la CutScene ) demander à "TROLL" de se tuer.

Maintenant, ActionOverride() peut aussi être une mauvaise chose. Par exemple, l'action "PlayDead()" est une action que vous ne voulez pas utiliser en même temps que ActionOverride(). Voici pourquoi :

IF
True()
THEN
RESPONSE#100
CutSceneID(Player1)
ActionOverride("TROLL",PlayDead(180)) // Voir Note #8
MoveToObject("TROLL") // Voir Note #8
END
8. Dans ce script, juste après que Player1 dise à "TROLL" de faire le mort ( PlayDead ), il devrait avancer jusqu'à "TROLL". Cependant, il ne le fait pas. Avec cetet combinaison, Player1 avancera jusqu'à "TROLL" seulement après que l'action PlayDead() soit terminée. C'est parce que Player1 doit contrôler à la fois les actions de "TROLL" et les siennes.

Vous vous demandez donc comment régler cela ? C'est assez simple en fait. Plusieurs états du type CutSceneID() IF-THEN. Voici à quoi ça devrait ressembler...

IF
True()
THEN
RESPONSE#100
CutSceneID("TROLL")
PlayDead(180)
EMD

IF
True()
THEN
RESPONSE#100
CutSceneID(Player1)
MoveToObject("TROLL")
END
Cette combinaison d'étas fait jouer le mort à "TROLL" pendant que Player1 s'avance vers lui au même moment.

Etape 4 : Exemple


Parfait, après en on met ça en pratique. Ici, on va faire un script de CutScene rapide qui transporte votre partie dans une zone donnée.

Ceci est ce que nous voulons comme résultat final. Nous voulons aller jusqu'à une zone, sans interruption dans le jeu. L'écran deviendra noir, et tous les joueurs seront transportés dans la zone simultanément. Si ce n'est pas simultanément, alors la CutScene ne fonctionnera pas convenablement. Une fois là, l'écran redeviendra normal.

Allez, c'est parti...

D'abord, nous avons besoin d'un état qui commencera le script de la CutScene. Il devrait être placé dans quelquechose comme un script de zone, un script de créature, ou autrechose. Tant que des bonnes conditions sont rencontrées, ça devrait marcher.
IF
Trigger()
THEN
RESPONSE#100
ClearAllActions()
StartCutSceneMode()
StartCutScene("CUTMOVE")
END
Voici le second script. Il configure le mouvement de la zone. Une fois que c'est fait, compilez-le en le nommant CUTMOVE.bcs ( pour l'exemple ).
Ici, je vous autorise à prendre votre propre zone, coordonnées, et la direction dans laquelle sont tournés les personnages. Sonc trouvez une zone et prenez des coordonnées aléatoire si vous n'avez pas le temps.
IF
True()
THEN
RESPONSE#100
CutSceneID(Player1)
FadeToColor([20.0],0) // L'écran devient noir
Wait(2) // Voir Note #9
LeaveAreaLUA("AREA","",[x.y],FACE) // Voir Note #10
Wait(2)
FadeFromColor([20.0],0)
Wait(2)
EndCutSceneMode()
END

IF
True()
THEN
RESPONSE#100
CutSceneID(Player2)
Wait(2)
LeaveAreaLUA("AREA","",[x.y],FACE)
END

IF
True()
THEN
RESPONSE#100
CutSceneID(Player3)
Wait(2)
LeaveAreaLUA("AREA","",[x.y],FACE)
END

IF
True()
THEN
RESPONSE#100
CutSceneID(Player4)
Wait(2)
LeaveAreaLUA("AREA","",[x.y],FACE)
END

IF
True()
THEN
RESPONSE#100
CutSceneID(Player5)
Wait(2)
LeaveAreaLUA("AREA","",[x.y],FACE)
END

IF
True()
THEN
RESPONSE#100
CutSceneID(Player6)
Wait(2)
LeaveAreaLUA("AREA","",[x.y],FACE)
END
9. Wait() est utilisé ici pour quelques secondes pour permettre à l'écran de devenir noir ( cette action prend environ 1 seconde, on en met donc 2, juste pour être sûr ).
10. J'expliquerai juste les paramètres de cette action.
"AREA" = Le nom du fichier de la zone jusqu'à laquelle vous voulez aller.
"" = Ca contrôle en fait quelle image s'affiche sur l'écran de chargement. Laissez-le comme ceci pour qu'elle soit aléatoire.
[x.y] = Les coordonnées X et Y du point où le personnage est envoyé dans la nouvelle carte.
FACE = C'est une valeur numérique comprise entre 0 et 15. 0 veut dire que le personnage regarde vers le sud et les autres nombres sont ordonnés dans le sens des aiguilles d'une montre.


GENERAL NOTE: Maintenant, vous remarquerez que toutes les principales actions dans sont placées dans l'état de Player1. C'est parce que Player1 est toujours dans le jeu et peu d'actions n'ont pas besoin d'être réalisées deux fois.

Posté : sam. 16 mars 2013, 11:47
par Klare
Nouvelle question de ma part.

Je suis devant une tentative de réalisation de petite cutscene. Le PJ entre dans la piece, on passe en cutscene pour faire apparaitre un NPC via un sort d'invocation, et pouf c'est tout.
J'ai donc modifier l'Area avec ceci :

Code : Tout sélectionner

IF
Global("CKlareexists","AR0710",0)
THEN
RESPONSE #100
SetGlobal("CKlareexists","AR0710",1)
ClearAllActions() 
StartCutSceneMode() 
StartCutScene("CKcut1")
END
Et ensuite creer un .baf nommé CKcut1 contenant ceci :

Code : Tout sélectionner

IF
   True()
THEN
   RESPONSE #100
   CreateVisualEffect("SPSUMMON",[448.184]) 
   Wait(1)
   CreateCreature("CKlare",[448.184],1)
   CutSceneId("CKlare")
   DisplayStringWait(Myself,~1~) 
   Wait(2)
   DisplayStringWait(Myself,~2~) 
   Wait(2)
   DisplayStringWait(Myself,~3~) 
   EndCutSceneMode()
END
Donc je compile je lance et...
CHARNAME rentre dans la salle, le mod cutscene se declanche.
Et rien, il attend. Le NPC et le sort n'apparaissent meme pas, la cutscene reste active et le bug est bouclé.

Pourtant m'semblait avoir suivi le tuto en detail...

Posté : sam. 16 mars 2013, 12:31
par Isaya
Tu n'as pas commencé ton block par CutSceneId("CKlare") et au lieu de ça tu as mis d'autres instructions avant. C'est pourtant le cas dans tous les exemples du tutorial et il est bien indiqué que c'est obligatoire. Je ne serais pas surpris que ce soit la cause du problème puisque tu as cherché à faire des actions sans avoir défini qui était l'acteur de la scène.
Ce qui signifie également que l'acteur doit exister et ne peut pas être un créé au cours de la scène. Donc il te faudra sans doute choisir Player1 pour CutSceneId et recourir à des ActionOverride si tu veux faire agir un personnage créé dans le script.

Posté : sam. 16 mars 2013, 12:41
par Klare
C'etait bien le souci :whistle3:

J'avais bien suivi l'exemple, mais j'ai finalement decalé l'ID pour permettre de creer le PNJ qui devait etre l'acteur de base. sinon je n'avais pas d'acteur.

Profiter de CHARNAME m'avait même pas effleuré l'esprit.

Merci Isaya.

Posté : dim. 18 oct. 2015, 15:41
par Freddy_Gwendo
Juste une demande de précision.

J'ai lancé cette cutscene via une hotkey :

Code : Tout sélectionner

IF
	HotKey(D)
THEN
	RESPONSE #100
		ClearAllActions()
		SetInterrupt(FALSE)
		SmallWait(5)
		StartCutSceneMode()
		CutSceneId(Player1)
		CreateVisualEffectObject("SPPORTAL",Player1)
		CreateVisualEffectObject("SPPORTAL",Player2)
		CreateVisualEffectObject("SPPORTAL",Player3)
		CreateVisualEffectObject("SPPORTAL",Player4)
		CreateVisualEffectObject("SPPORTAL",Player5)
		CreateVisualEffectObject("SPPORTAL",Player6)
		Wait(2)
		FadeToColor([30.0],0)
		Wait(1)
		EndCutSceneMode()
		TextScreen("GWChap01")
		SmallWait(1)
		StartCutSceneMode()
		CutSceneId(Player1)
		LeaveAreaLUAPanicEntry("GW0000","Entry1",[0.0],4)
		LeaveAreaLUAEntry("GW0000","Entry1",[0.0],4)
		ActionOverride(Player2,LeaveAreaLUAEntry("GW0000","Entry1",[0.0],4))
		ActionOverride(Player3,LeaveAreaLUAEntry("GW0000","Entry1",[0.0],4))
		ActionOverride(Player4,LeaveAreaLUAEntry("GW0000","Entry1",[0.0],4))
		ActionOverride(Player5,LeaveAreaLUAEntry("GW0000","Entry1",[0.0],4))
		ActionOverride(Player6,LeaveAreaLUAEntry("GW0000","Entry1",[0.0],4))
		Wait(1)
		MultiPlayerSync()
		SetInterrupt(TRUE)
		FadeFromColor([30.0],0)
		Wait(1)
		EndCutSceneMode()
END

Le but du jeu étant d'insérer la commande TextScreen à l'intérieur de la Cutscene.

Problème : à la fin de la cutscene, les cercles de sélection des persos disparaissaient et tous les scripts de région de la carte GW0000 étaient désactivés (ne se lançaient pas).


Puis, miracle, au bout d'une heure de plusieurs désinstallations-réinstallations du mod (sans aucune modif.), tout fonctionne à merveille.


Quelqu'un aurait-il une idée de ce qui a bien pu se passer, ou de la ligne qui "poserait" problème ? :gign: