Aller au contenu


Déplacement D'Un Static


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

#26 Duc Moquette

Duc Moquette

Posté 19 octobre 2010 - 19:27

Hum, sinon, nouveau problème. J'ai encore cette histoire de grésillement avant l'activation d'un son, le problème c'est que la structure n'est plus la même, et que je ne sais plus quoi faire. J'ai essayé plein de possibilités, voici la dernière en date :


Begin THO_myst_machi_chemin02


short ActivateMe
short DoOnce
float timer


If ( MenuMode == 1 )
	return
Endif

If ( DoOnce == 0 )
	If ( "in_THO_myst_machi_cap_04"-> GetStandingPC == 1 )
		Set ActivateMe to 1
	Endif
Endif


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

	If ( timer <= 1 )
		"in_THO_myst_machi_wall_06"-> Move z, 256
		Set DoOnce to 1
	Endif
Endif

If ( DoOnce == 1 )
	PlaySound "SothaDoorClose"
	Set DoOnce to 2
Endif

If ( DoOnce == 2 )
	return
Endif



Une idée ?
Image IPB Vieille Grosse Morue

Thoriak


#27 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 19 octobre 2010 - 20:48

Même erreur que plus haut.

Quand on n'est pas sûr de ce qu'on fait, il faut parcourir linéairement son script comme si on l'exécutait :
supposons qu'on commence par une frame où le joueur pose pour la première fois le pied sur l'activateur :
frame 1 :
*On n'est pas en mode menu, on continue
*On a DoOnce == 0 et "in_THO_myst_machi_cap_04"-> GetStandingPC == 1, donc ActivateMe  est mis à 1
*ActivateMe est à 1, donc on met timer (qui est à 0 pour l'instant) à ( timer + GetSecondsPassed )
*timer est vraisemblablement < 1 à cette première frame, donc on déplace un peu le static "in_THO_myst_machi_wall_06" et on met DoOnce à 1
*DoOnce est à 1 donc on met DoOnce à 2 et on joue le son "SothaDoorClose"
*DoOnce est 2 donc on fait un return (ce qui ne sert absolument à rien en fin de script)

Frame suivante :
*toujours pas en mode menu, on continue
*On a DoOnce == 2, donc on saute la mise à jour de ActivateMe (comme DoOnce n'est jamais remis à 0 dans le script on se doute déjà que l'activateur ne peut servir qu'une fois)
*ActivateMe est toujours à 1, donc on met à jour timer
*timer est toujours probablement <= 1, donc on déplace le static et on remet DoOnce à 1
*DoOnce est à 1 à nouveau et donc on joue le son "SothaDoorClose"
etc. (d'où grésillement puisqu'on joue le son à chaque frame)
idem aux frames suivantes jusqu'à ce que timer > 1

#28 Duc Moquette

Duc Moquette

Posté 19 octobre 2010 - 21:04

Donc il faut remettre ActivateMe à 0. Il me suffit donc de rajouter un "If ( timer >= 2 )" et de tout remettre à zéro, sauf DoOnce, ce qui ferme le script. Ce qui nous donne, si je ne me trompe pas, ceci :
Begin THO_myst_machi_chemin02


short ActivateMe
short DoOnce
float timer


If ( MenuMode == 1 )
 return
Endif

If ( DoOnce == 0 )
 If ( "in_THO_myst_machi_cap_04"-> GetStandingPC == 1 )
 Set ActivateMe to 1
 Endif
Endif


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

 If ( timer >= 2 )
 If ( DoOnce == 1 )
 PlaySound "SothaDoorClose"
 Set DoOnce to 2
 Endif
 	Set ActivateMe to 0
 	Set timer to 0
 
 Elseif ( timer <= 1 )
 "in_THO_myst_machi_wall_06"-> Move z, 256
 Set DoOnce to 1
 Endif
Endif

End


Sauf, si, je dois remplacer "Set DoOnce to 1" par "If ( DoOnce == 0 ) Set DoOnce to 1 Endif", mais il me semble que ce n'est pas la peine, puisqu'il n'est plus rechargé la frame suivante.


Edit: Mais ça ne le joue que lorsque timer >= 2 ; je dois donc déplacer le groupe "If ( DoOnce == 2 ) ... Endif" à timer <= 1, et rajouter "If ( DoOnce == 0 )" :)

Re-Edit: C'était bien ça, ça marche ! Merci encore Nerwal ;)

Modifié par Duc Moquette, 19 octobre 2010 - 21:19.

Image IPB Vieille Grosse Morue

Thoriak


#29 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 19 octobre 2010 - 21:22

Citation

Sauf, si, je dois remplacer "Set DoOnce to 1" par "If ( DoOnce == 0 ) Set DoOnce to 1 Endif", mais il me semble que ce n'est pas la peine, puisqu'il n'est plus rechargé la frame suivante.

La différence c'est juste que DoOnce est mis à 1 à toutes les frames tant que tandis que dans l'autre cas on teste la valeur de DoOnce à toutes les frames. Dans le cas présent ça ne change rien. Dans le cas d'exécution de commandes lourdes, au lieu d'un simple set qui ne coûte presque rien, la forme "If ( DoOnce == 0 ) Set DoOnce to 1 Endif" est préférable (par exemple on écrira if ( player->getspell "sort" == 0 ) player->addspell "sort" au lieu de faire un addspell à chaque frame ).

rq : dans le script récrit, la condition If ( DoOnce == 1 ) ne sert ici à rien, on ne passe qu'une fois dans cette branche (celle où timer > 2) puisqu'on remet ActivateMe à 0 aussitôt.




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

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