Désolé pour le retard.
Je viens de m'apercevoir que j'avais oublié de renseigner ce sujet désormais réglé !
Après plusieurs tests, voici comment ça fonctionne.
L'action
StaticSequence permet à la fois de diminuer le nombre d'animations introduites dans le fichier .are (par exemple GWAnim1 - séquence 0, GWAnim1 - séquence 1, GWAnim1 - séquence 2) et le nombre de lignes de codes dans les fichiers .baf.
Je pars du principe que les animations GWAnim1 à GWAnim4 sont composées de 3 séquences (0 à 2). Mais ça fonctionne à partir de 2 séquences.
De même, je modifie la séquence apparaissant sur la carte à l'aide d'une variable de déclenchement et d'un compteur de temps.
Toutes les 12 secondes, les séquences des animations changent.
Au départ, les animations affichent toutes la séquence 0.
Script GW0001.baf gérant la carte :
IF
[INDENT]OnCreation()
Global("GWEntree","GW0001",0) // 1° entrée dans la carte GW0001.[/INDENT]
THEN
[INDENT]RESPONSE #100[/INDENT]
[INDENT][INDENT]SetGlobal("GWEntree","GW0001",1)
SetGlobal("GWVariab","GW0001",1) // Initialisation de la variable GWVariab qui régit les animations GWAnim1 à GWAnim4.
SetGlobalTimer("GWAnimTi","GW0001",12) // Initialisation du compteur qui gère le chronomètre entre deux changements de séquences.
Continue()[/INDENT][/INDENT]
END
IF
[INDENT]Global("GWVariab","GW0001",1)
GlobalTimerExpired("GWAnimTi","GW0001") // 12 s. écoulées[/INDENT]
THEN
[INDENT]RESPONSE #100[/INDENT]
[INDENT][INDENT]SetGlobal("GWVariab","GW0001",2) // Modification de la variable pour éviter un "looping".
StaticSequence("GWAnim1",1) // Changement de séquence : l'animation affiche la séquence 1
StaticSequence("GWAnim2",1)
StaticSequence("GWAnim3",1)
StaticSequence("GWAnim4",1)
SetGlobalTimer("GWAnimTi","GW0001",1) // Réinitialisation du compteur.
Continue()[/INDENT][/INDENT]
END
IF
[INDENT]Global("GWVariab","GW0001",2)
GlobalTimerExpired("GWAnimTi","GW0001")[/INDENT]
THEN
[INDENT]RESPONSE #100[/INDENT]
[INDENT][INDENT]SetGlobal("GWVariab","GW0001",3)
StaticSequence("GWAnim1",2) // Changement de séquence : l'animation affiche la séquence 2
StaticSequence("GWAnim2",2)
StaticSequence("GWAnim3",2)
StaticSequence("GWAnim4",2)
SetGlobalTimer("GWAnimTi","GW0001",12)
Continue()[/INDENT][/INDENT]
END
IF
[INDENT]Global("GWVariab","GW0001",3)
GlobalTimerExpired("GWAnimTi","GW0001")[/INDENT]
THEN
[INDENT]RESPONSE #100[/INDENT]
[INDENT][INDENT]SetGlobal("GWVariab","GW0001",1) // Retour au point de départ
StaticSequence("GWAnim1",0) // Changement de séquence : l'animation affiche de nouveau la séquence 0
StaticSequence("GWAnim2",0)
StaticSequence("GWAnim3",0)
StaticSequence("GWAnim4",0)
SetGlobalTimer("GWAnimTi","GW0001",12)
Continue()[/INDENT][/INDENT]
END
Selon ses besoins, on peut aussi gérer les variables et le compteur via un script de région (information ou piège) ou via un dialogue.
Après tests, l'avantage de l'action réside dans la fluidité avec laquelle les séquences s'enchaînent.
En effet, si on utilise plusieurs slots d'animations dans le fichier .are représentant chacune par exemple les séquences 0 (GWAnim1-Séq0), 1 (GWAnim1-Séq1) et 2 (GWAnim1-Séq2) de GWAnim1.bam, le passage de la séquence 0 à la séquence 1 via les actions
[INDENT][INDENT]
AmbientActivate("GWAnim1-Séq0",FALSE)
AmbientActivate("GWAnim1-Séq1",TRUE)[/INDENT][/INDENT]
s'avère souvent délicate et laisse un temps de latence pendant lequel aucune animation n'est affichée. Pour pallier ce problème, il faut alors introduire une autre action :
[INDENT][INDENT]AmbientActivate("GWAnim1-Séq1",TRUE)
SmallWait(8) // 8 est un exemple et dépend du nombre de frames de la séquence.
AmbientActivate("GWAnim1-Séq0",FALSE)[/INDENT][/INDENT]
Ainsi, la séquence 1 commence à apparaître à l'écran juste avant la disparition de la séquence 0.
Non seulement c'est pénible car il faut déterminer avec précision la valeur n de
SmallWait, mais en plus, j'ai expérimenté à mes dépends qu'elle dépendait de la vitesse de la machine sur laquelle on joue !
Notes :
1. On peut aussi utiliser l'action
!GlobalTimerNotExpired("GWAnimTi","GW0001") qui évite d'initialiser au départ le compteur de temps. Dans ce cas, le bloc est déclenché à la fois dès le début (temps "0") et chaque fois que le délai est expiré.
2. On peut aussi utiliser l'action
StaticSequence avec l'action
AmbientActivate. Dans l'exemple suivant, les séquences de trois animations apparaissent selon un ordre aléatoire :
► Afficher le texte
IF
[INDENT]Global("GWVariab","GW0001",1)
GlobalTimerExpired("GWAnimTi","GW0001")
RandomNum(3,1) // 1 chance sur 3[/INDENT]
THEN
[INDENT]RESPONSE #33 // Libre à chacun de choisir son %. Mettre 3 fois "RESPONSE #100" fonctionne aussi bien.[/INDENT]
[INDENT][INDENT]AmbientActivate("GWAnim1",TRUE)
StaticSequence("GWAnim1",0)
SetGlobalTimer("GWAnimTi","GW0001",12)
Continue()[/INDENT][/INDENT]
[INDENT]RESPONSE #33[/INDENT]
[INDENT][INDENT]AmbientActivate("GWAnim1",TRUE)
StaticSequence("GWAnim1",1)
SetGlobalTimer("GWAnimTi","GW0001",12)
Continue()[/INDENT][/INDENT]
[INDENT]RESPONSE #33[/INDENT]
[INDENT][INDENT]AmbientActivate("GWAnim1",TRUE)
StaticSequence("GWAnim1",2)
SetGlobalTimer("GWAnimTi","GW0001",12)
Continue()[/INDENT][/INDENT]
END
IF
[INDENT]Global("GWVariab","GW0001",1)
GlobalTimerExpired("GWAnimTi","GW0001")
RandomNum(3,2) // 1 chance sur 3[/INDENT]
THEN
[INDENT]RESPONSE #33[/INDENT]
[INDENT][INDENT]AmbientActivate("GWAnim2",TRUE)
StaticSequence("GWAnim2",0)
SetGlobalTimer("GWAnimTi","GW0001",12)
Continue()[/INDENT][/INDENT]
[INDENT]RESPONSE #33[/INDENT]
[INDENT][INDENT]AmbientActivate("GWAnim2",TRUE)
StaticSequence("GWAnim2",1)
SetGlobalTimer("GWAnimTi","GW0001",12)
Continue()[/INDENT][/INDENT]
[INDENT]RESPONSE #33[/INDENT]
[INDENT][INDENT]AmbientActivate("GWAnim2",TRUE)
StaticSequence("GWAnim2",2)
SetGlobalTimer("GWAnimTi","GW0001",12)
Continue()[/INDENT][/INDENT]
END
IF
[INDENT]Global("GWVariab","GW0001",1)
GlobalTimerExpired("GWAnimTi","GW0001")
RandomNum(3,2) // 1 chance sur 3[/INDENT]
THEN
[INDENT]RESPONSE #33[/INDENT]
[INDENT][INDENT]AmbientActivate("GWAnim3",TRUE)
StaticSequence("GWAnim3",0)
SetGlobalTimer("GWAnimTi","GW0001",12)
Continue()[/INDENT][/INDENT]
[INDENT]RESPONSE #33[/INDENT]
[INDENT][INDENT]AmbientActivate("GWAnim3",TRUE)
StaticSequence("GWAnim3",1)
SetGlobalTimer("GWAnimTi","GW0001",12)
Continue()[/INDENT][/INDENT]
[INDENT]RESPONSE #33[/INDENT]
[INDENT][INDENT]AmbientActivate("GWAnim3",TRUE)
StaticSequence("GWAnim3",2)
SetGlobalTimer("GWAnimTi","GW0001",12)
Continue()[/INDENT][/INDENT]
END
Dans ce cas, faire bien attention à ce que l'on veut faire : il peut être souhaitable de désactiver l'affichage des autres animations à chaque étape !
3. Ces scripts sont livrés "brut de béton". Pour les rendre efficients, il faut rajouter des variables propres à chaque action que l'on veut faire (afficher toutes les animations, l'une parmi les 4, etc...).
Me reste à tester les actions
StaticStart(O:Object*) et
StaticStop(O:Object*)...