Aller au contenu


[Problème] Orde Des Boucles Logiques


  • Veuillez vous connecter pour répondre
13 réponses à ce sujet

#1 Emma Indoril

Emma Indoril

    Bateau ivre


Posté 04 octobre 2010 - 17:23

J'ai un petit soucis avec un script que je teste actuellement.
Le script est censé, après activation par un bouton :

- Obscurcir l'écran
- Jouer un son
- Téléporter le joueur
- Éclaircir l'écran

Voila le script :

Begin es_teleportation_ex_04

Float timer

if ( OnActivate == 1 )
	Set timer to ( timer + GetSecondsPassed )
endif

if ( timer > 5 )
	FadeTo 100 2.0
Elseif ( timer > 10 )
	PlaySound "Thunder0"
	Player->Position -12344, -74348, 1452, 90
	FadeTo 0 2.0
endif
endif
End

Il y a des erreurs dans l'ordre des boucles "if" "endif" "elseif", je ne suis pas bien sur du moment ou je dois les fermer.
Mon chrono n'est probablement pas bon, je suppose que j'aurais du placer un timer avant chaque action et pas effectuer tout un bloc d'action à la suite.

J'aimerais avoir votre avis.
Je me demande également si je ne ferme pas trop tôt ma première boucle (if ( OnActivate == 1 ))
la mise en forme laisse aussi à désirer... :rolleyes:

J'utilise le débogueur de script mais il est un peu chiche en matière d'explication !  :blush: (par contre très bien pour me taper sur les doigts si j'oublie un espace !)
"Ce qui vient au monde pour ne rien troubler ne mérite ni égard ni patience."
René Char

"Ça ne veux plus rien dire non plus, mais cela a quand même plus de sens."

#2 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 04 octobre 2010 - 17:42

OnActivate c'est vrai (== 1) pour une frame seulement. On ne peut donc pas mettre un compteur dans une boucle Onactivate.

Citation

if ( timer > 5 )
    FadeTo 100 2.0
Elseif ( timer > 10 )

Il y a un problème de logique ici, le contraire de timer > 5 c'est timer <= 5, donc aucune chance pour que ça soit > 10.

Les blocs elseif n'ont pas besoin d'endif pour être fermés.

Le bloc

Citation

PlaySound "Thunder0"
    Player->Position -12344, -74348, 1452, 90
    FadeTo 0 2.0
ne doit être exécuté qu'une fois, donc il faut prévoir une sortie de boucle.

#3 Emma Indoril

Emma Indoril

    Bateau ivre


Posté 04 octobre 2010 - 18:29

J'ai corrigé:


Begin es_teleportation_ex_04

Float timer
Short done

if ( OnActivate == 1 )
	FadeTo 100 2.0
endif

Set timer to ( timer + GetSecondsPassed )
	if ( timer> 5 )
		PlaySound "Thunder0"
		Player->Position -12344, -74348, 1452, 90
		FadeTo 0 2.0
		Set done to 1 ;pas sur de la position 
	endif
End

J'ai un problème pour le placement du done :
Je dois placer un if ( done == 0 ), mais ou ?
Avant d'éteindre la lumière ? Ou téléporter le PC ? et ensuite ?
Une fois le done == 1 le timer s'arrête de lui même ?

Le second problème est que je ne suis pas bien sur que le timer s'enclenche aprés l'activation du bouton.
Il doit bien y avoir un moyen de declencher un chrono manuellement, non ?
"Ce qui vient au monde pour ne rien troubler ne mérite ni égard ni patience."
René Char

"Ça ne veux plus rien dire non plus, mais cela a quand même plus de sens."

#4 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 04 octobre 2010 - 19:03

Comme OnActivate n'est valable que pour une frame, aux frames suivantes, on a besoin de savoir que le bouton a été activé. On doit donc faire appel à une locale, disons active. La boucle if ( OnActivate == 1 ) va mettre active à 1 pour signaler que le bouton a été activé. Ensuite, toutes les instructions suivantes vont se trouver dans une boucle if ( active == 1 ), puisque si active == 0 on ne fait rien, le bouton n'a pas été activé. Enfin, une fois que les instructions sont finies, on doit remettre timer à 0 et active à 0.

Citation

Set timer to ( timer + GetSecondsPassed )
(...)
Le second problème est que je ne suis pas bien sur que le timer s'enclenche aprés l'activation du bouton.

Dans un script tout s'exécute à chaque frame, sauf s'il y a des return, ou si bien si les conditions des boucles ne sont pas remplies. Ici Set timer to ( timer + GetSecondsPassed ) sera exécuté à toutes les frames, quoi qu'il arrive, puisqu'il n'est pas dans une boucle et qu'il n'y a pas de return dans le script.

#5 Emma Indoril

Emma Indoril

    Bateau ivre


Posté 04 octobre 2010 - 22:06

Quelque chose comme ça ?

Begin es_teleportation_ex_05

Float timer
short boutonPressé

if ( OnActivate == 1 )
	set boutonPressé to 1

if ( boutonPressé == 1)
	Set timer to ( timer + GetSecondsPassed )

	if ( timer= 5 )
		FadeTo 100 2.0
	if ( timer= 10 )
		PlaySound "Thunder0"
		Player->Position -12344, -74348, 1452, 90
		FadeTo 0 2.0
		set timer to 0
		set boutonPressé to 0
endif		
endif
endif
endif
End

Est ce que j'ai compris ?
"Ce qui vient au monde pour ne rien troubler ne mérite ni égard ni patience."
René Char

"Ça ne veux plus rien dire non plus, mais cela a quand même plus de sens."

#6 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 04 octobre 2010 - 22:29

Citation

Est ce que j'ai compris ?

Oui :)

Maintenant les détails de syntaxe :
il faut fermer tout de suite la boucle OnActivate pour que la suite ne soit incluse dedans (on n'entre dans cette boucle que si ONActivate == 1, c'est à dire 1 seule frame, à l'activation et pas le reste du temps) :

if ( onactivate == 1 )
		set boutonPressé to 1
endif

Ensuite les timer c'est des flottants donc ça tombe jamais juste sur des nombres entiers; on est obligé d'utiliser des inégalités >, <, et donc d'écrire plutôt :

if ( timer>= 10 )

			PlaySound "Thunder0"
			Player->Position -12344, -74348, 1452, 90
			FadeTo 0 2.0
			set timer to 0
			set boutonPressé to 0

elseif ( timer >= 5 ) ; timer est plus grand que 5 et plus petit que 10

			 FadeTo 100 2.0

endif

On ne ferme donc qu'avec deux endif à la fin du script (celui de if ( timer == ), et celui de if ( boutonpressé == 1 ) )

#7 Orann

Orann

    Nérévarine de Pertevue


Posté 05 octobre 2010 - 05:36

Bonjour ! Je suis peut-être extrémiste mais je n'aime pas les variables avec des accents... J'ai toujours peur qu'elles causent des bugs imprévus. A ta place, je renommerai boutonPressé en boutonPresse...
Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#8 Emma Indoril

Emma Indoril

    Bateau ivre


Posté 05 octobre 2010 - 07:55

Je vais tester cela, avant d'oublier...
Par contre une chose me surprend :
Quand on utilise un timer on doit déclarer les actions dans l'ordre inverse duquel il vont se produire ? C'est valable tout le temps ? (à chaque fois qu'il y a un chrono, je veux dire.)

@Orann : oui, l'accent je vais le virer c'était juste pour que je puisse comprendre.

Maintenant que j'ai saisi le principe, je vais essayer d'autres maniere d'activer un BoutonPressé.
"Ce qui vient au monde pour ne rien troubler ne mérite ni égard ni patience."
René Char

"Ça ne veux plus rien dire non plus, mais cela a quand même plus de sens."

#9 Korfandar

Korfandar

    Ch'ti dragon normand...dans son trou


Posté 05 octobre 2010 - 09:02

Non, en fait cela n'a rien à voir avec le timer. Quand on utilise une structure de type IF ... ELSEIF ... ELSEIF ... END, le bloc qui sera exécuté sera le premier pour lequel la condition de test est vraie, quelle que soit cette condition (test sur timer, variable globale qu'importe).
Or (x >= 5) est vrai que x vaille 6 comme 11. Donc avec une structure
If (x >= 5)
.BLABLA1.
ELSEIF (x >= 10)
.BLABLA2.
ENDIF

Si x vaut 6, on commence par le premier test à savoir (x >= 5), qui est vrai donc on s'arrête là BLABLA1 est exécuté, on ne fait même pas le second test (en fait on ne le fait surtout pas). Si x vaut 11, on commence par le premier test à savoir (x >= 5), qui est vrai donc on s'arrête aussi là, BLABLA1 est exécuté, on ne fait toujours pas le second test.
Tandis qu'avec :
If (x >= 10)
.BLABLA1.
ELSEIF (x >= 5)
.BLABLA2.
ENDIF

Si x vaut 6, on commence par le premier test à savoir (x >= 10), qui est faux donc on continue en vérifiant le second test qui est vrai et dont on exécute le bloc BLABLA2. Si x vaut 11, on commence par le premier test à savoir (x >= 10), qui est vrai donc on s'arrête là, BLABLA1 est exécuté, on ne fait pas le second test.

Donc c'est lié à la structure de tes tests.
On aurait pu faire ceci :
if ( timer < 5 )

; ne rien faire

elseif ( timer < 10 )

			 FadeTo 100 2.0
else
			PlaySound "Thunder0"
			Player->Position -12344, -74348, 1452, 90
			FadeTo 0 2.0
			set timer to 0
			set boutonPressé to 0
endif

Mais on voit que dans ce sens on a une clause vide en trop...

L'abus de SMS est dangereux pour l'élocution mentale

Le mod qui révèle (presque) tout sur les dwemers : Dwarmor

Fervent Partisan de l'Instabilité Avatarienne
Quart du quarteron des VGM...


#10 Emma Indoril

Emma Indoril

    Bateau ivre


Posté 05 octobre 2010 - 09:09

J'aurais pas du autant sécher les cours de maths au collège... :orthoseveres:
"Ce qui vient au monde pour ne rien troubler ne mérite ni égard ni patience."
René Char

"Ça ne veux plus rien dire non plus, mais cela a quand même plus de sens."

#11 Korfandar

Korfandar

    Ch'ti dragon normand...dans son trou


Posté 05 octobre 2010 - 09:16

ça veut dire que tu n'as rien compris à ce que j'ai dit et que j'ai donc mal expliqué ou est ce juste un constat sur l'état de tes connaissances ?  :mrgreen:

L'abus de SMS est dangereux pour l'élocution mentale

Le mod qui révèle (presque) tout sur les dwemers : Dwarmor

Fervent Partisan de l'Instabilité Avatarienne
Quart du quarteron des VGM...


#12 Emma Indoril

Emma Indoril

    Bateau ivre


Posté 05 octobre 2010 - 16:24

C'est un constat dépité, à l'aube de la quarantaine, sur ma décrépitude à venir et les conséquences de ma glandouillerie passée ! :mrgreen:

Edit :

Et surtout, je comprend qu'utiliser des inégalités est un peu plus complexe (d'un point de vue conceptuel) que d'utiliser des égalités.
je trouve d'ailleurs surprenant qu'il n'y ai pas de fonction type "chronomètre" dans le TESC

ce serais plus simple de faire des trucs du genre :

If activation = 1
alors start chrono
if chrono = x secondes
alors  = paf
If chrono x+y seconds
alors  = pif
stop chrono


Mais bon, on va faire avec...

Je viens de tester, il reste un problème :
une fois la téléportation effectuée, l'écran, après etre passé au clair, se fonce de nouveau, et si je force l'éclaircissement par la console, hop, rebelote. Il fonce quand même.

Il y a une boucle qui ne finit pas, je ne vois pas ou....

Begin ES_teleportation_06

Float timer
short Bouton

If ( OnActivate == 1 )
	set Bouton to 1
endif

If ( Bouton == 1 )
	Set timer to ( timer + GetSecondsPassed )

	If ( timer>= 10 )
		PlaySound "Thunder0"
		Player->Position -12344, -74348, 1452, 90
		FadeTo 0 2.0
		set timer to 0
		set Bouton to 0

	ElseIf ( timer>= 5 )
		FadeTo 100 2.0

	endif
endif


End

Modifié par Emma Indoril, 05 octobre 2010 - 09:32.

"Ce qui vient au monde pour ne rien troubler ne mérite ni égard ni patience."
René Char

"Ça ne veux plus rien dire non plus, mais cela a quand même plus de sens."

#13 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 05 octobre 2010 - 16:37

Mmmm appeler continûment le fadeto doit poser problème :(

A moins qu'on veuille absolument les cinq secondes de délai avant le passage au noir, ça marche aussi bien :

Begin ES_teleportation_06

Float timer
short Bouton

If ( onactivate == 1 )
		FadeTo 100 2.0
		set Bouton to 1
endif

If ( Bouton == 1 )
		Set timer to ( timer + GetSecondsPassed )

		If ( timer>= 5 )
				PlaySound "Thunder0"
				Player->Position -12344, -74348, 1452, 90
				FadeTo 0 2.0
				set timer to 0
				set Bouton to 0
		endif
endif


End

A tester  :mrgreen:

#14 Emma Indoril

Emma Indoril

    Bateau ivre


Posté 05 octobre 2010 - 16:52

Effectivement, ça marche.

Les cinq secondes de délai avant le noir, bof, non, pas utile.
Dans son utilisation, ce script se déclenchera si on marche sur un endroit précis.
Par contre pour le son...

l'idée était de faire comme dans HL2 :mrgreen: téléporter le gars, le laisser dans le noir, et déclencher un bruit flippant lorsqu'il retrouve la vue, oui j'ai trop joué à HL2  :mrgreen:

Ou ais je mit ma mallette et mon costume sombre ??
"Ce qui vient au monde pour ne rien troubler ne mérite ni égard ni patience."
René Char

"Ça ne veux plus rien dire non plus, mais cela a quand même plus de sens."




0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)