Aller au contenu


[résolu] Montée De L'eau D'une Hauteur H


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

#1 Post-it

Post-it

    Attachant détachable adhérant sans tâcher


Posté 26 août 2009 - 09:32

Bonjour à tous, je me suis aperçu d'un petit bug dans l'un de mes scripts :

Le script en question monte le niveau d'eau dans une cellule intérieure à -200 puis s'arrête. C'est un script globale qui se lance une fois un activateur activé dans la dit cellule.

Le problème survient quand on sort de la cellule alors que le niveau d'eau n'est pas monté jusqu'à -200, le script continue de tourner, mais comme la cellule n'est plus la même ...
- Dans le cas où la cellule suivante est une cellule intérieure contenant de l'eau -> l'eau monte dans l'autre cellule si le niveau est < -200 sinon le script s'arrête -> pas testé mais logique !
- Dans le cas où la cellule suivante est une cellule extérieure -> niveau d'eau à zero -> le script s'arrête.
- Dans le cas où la cellule suivante est sans eau je n'ai pas testé !

Dans le deuxième cas (le plus courant) si on retourne dans la première cellule le niveau d'eau n'a pas monté et est resté le même que lorsqu'on est sorti de la cellule. Embêtant. J'aurais aimé que celui-ci soit à -200 !

Je croyais avoir trouvé la solution en écrivant ces quelques lignes de code ...

if ( CellChanged == 1 )
		 SetWaterLevel to -200
		 StopScript lil_script
		 Return
	endif

... mais cela ne fonctionne pas. Le problème doit venir du fait que le set ne s'effectue qu'après le changement de cellule ... :good:

si quelqu'un a une idée, ce serait sympa. Merci d'avance. ;)

Modifié par Post-it, 28 août 2009 - 10:02.

Y'a le Post-it et le Post-at ...

------------------------------------------------
Membre auto-proclamé des défenseurs des post-its sur forum, maintenant que je sais ce que c'est ...

#2 elendell

elendell

    Mécano Dell'Arte


Posté 26 août 2009 - 13:41

Bonjour Post-it,

Voir le messagePost-it, le 26.08.2009 à 10:31, dit :

... mais cela ne fonctionne pas. Le problème doit venir du fait que le set ne s'effectue qu'après le changement de cellule ... :good:
Effectivement, "CellChanged" est vrai quand la cellule a changé et pas quand elle va changer.

Je suppose que tu utilises un "timer" ou un compteur de frames pour la montée progressive de l'eau. Dans ce cas, au lieu de tout faire avec le script global, je te propose que celui-ci ne fasse qu'actionner le "timer" dont la variable serait une variable globale.

Le "ModWaterLevel" ou "SetWaterLevel" serait fait par le script local, celui de l'activateur ou un autre si ça ne te convient pas de l'utiliser pour ça. Tant que l'eau n'est pas à -200 ("GetWaterLevel"), la variable locale utilisée par "ModWaterLevel" est mise à la valeur qui correspond au niveau voulu, en fonction du temps écoulé (variable globale), et le script fait le "ModWaterLevel".

Le script global tourne tant que le temps désiré n'est pas écoulé puis il se stoppe. Peu importe que le PJ soit ou non dans la cellule à ce moment là car quand il y reviendra, le script local mettra aussitôt le niveau de l'eau correspondant au temps passé.

S'il quitte la cellule pour un temps plus long que le "timer", le niveau sera à -200 mais s'il la quitte pour revenir aussitôt, le niveau correspondra exactement au temps écoulé, comme si le PJ était resté dans la cellule.

PS : C'est à essayer mais je pense que tu devrais aussi pouvoir utiliser "GameHour" à la place du "Timer" et que ce serait une solution plus économique. Dans ce cas, il n'y aurait besoin ni de script global ni de la variable globale. Par contre, ça obligerait à faire des vérifications supplémentaires dans le local ("Day" et "Month") car le PJ pourrait revenir à la même heure mais 1 mois plus tard.

#3 Post-it

Post-it

    Attachant détachable adhérant sans tâcher


Posté 27 août 2009 - 08:53

Merci Elendell pour ta réponse rapide. Ton idée me plait, je n'ai pas encore utilisé de variable globale mais je crois que c'est une bonne occasion de s'y mettre ! ;)

Encore merci pour ton aide, je m'y colle de suite !

Comme prévu tout fonctionne à merveille ! Elendell t'est le plus fort ! Un grand merci à toi ! :)

Alors pour ceux que cela intéresse voilà comment je m'y suis pris :

MÉTHODE POUR MONTER L'EAU D'UNE CELLULE INTÉRIEUR D'UNE HAUTEUR H A PARTIR D'UN ACTIVATEUR :

- On commence par créer une variable globale (float ! Attention sinon ça marche pas ! J'ai testé ! :good: ) : Global_Var

- Ensuite on écrit ces deux scripts : un local (L) et un global (G)

Begin XXX_script_L
  
  Short DoOnce
  Short Switch
  
  float WaterLift
  float DifferenceLevel
  float Timer
  
  if ( MenuMode == 1 )
	 return
  endif
  
; _____ Activation du script global à l'aide de l'activateur et activation du déplacement de l'activateur _____
  
  if ( DoOnce == 0 )
	 if ( OnActivate == 1 )
		StartScript XXX_script_G	  
		set DoOnce to 1
		set Switch to 1
		PlaySound "Door Stone Open"
	 endif
  endif
  
; __________________ L'eau monte si la variable globale est différente de WaterLift _________________
; ________________ L'eau monte de la différence entre waterLift et la variable Globale ________________
  
  if ( DoOnce == 1 )
	 if ( WaterLift != Global_var )
		set DifferenceLevel to ( Global_Var - WaterLift )
		ModWaterLevel DifferenceLevel
		set WaterLift to Global_Var
	 endif
  endif
  
; _________ L'activateur se déplace suivant Y à une vitesse de -2 pendant 1 seconde ___________
  
  if ( Switch == 1 )
	 set Timer to ( Timer + GetSecondsPassed )
	 if ( Timer <= 1 )
		"XXX_activateur"->MoveWorld Y -2
	 else
		set Switch to O
	 endif
  endif
  
  End

Begin XXX_script_G
  
  if ( MenuMode == 1 )
	 return
  endif
  
; _____ La variable globale prend un à chaque seconde et le script s'arrête quand elle a atteind la valeur H _____
  
  set Global_Var to ( Global_Var + GetSecondsPassed )
  
  if ( Global_Var >= H )
	 StopScript XXX_script_G
  endif
  
  End

Modifié par Post-it, 28 août 2009 - 09:52.

Y'a le Post-it et le Post-at ...

------------------------------------------------
Membre auto-proclamé des défenseurs des post-its sur forum, maintenant que je sais ce que c'est ...

#4 alliop

alliop

    Renaissance de l'art magique.


Posté 27 août 2009 - 13:11

Merci à vous deux pour le tuto :flowers:

Voir le messageelendell, le 26.08.2009 à 14:40, dit :

"CellChanged" est vrai quand la cellule a changé et pas quand elle va changer.
Je prends des pincettes maintenant pour formuler ces déductions faites d'après une longue galère sur la fonction, donc  "sous réserve d'avoir mal compris ou de mal formuler quelque chose, je puis affirmer que j'ai vécu ce qui suit" :
C'est encore plus pervers : le CellChanged est testé en sortie de cell (c'est vérifiable et cf MFSD etc...), mais seules quelques commandes légères en tête de la liste sous la condition ont une chance de s'exécuter avant le chargement de la cell d'arrivée (c'est alors dans celle là que des commandes lourdes, ou celles de la suite de la liste, s'exécutent).
C'est aussi pourquoi on a intéret à placer le test cellchanged le plus possible en tête de script si l'on veut que des commande légères s'exécutent avant la sortie... mais c'est très aléatoire, dépendant aussi de l'ordre des scripts qui s'exécutent dans la même frame que le test je suppose.
Par ex, pour les familiers, un "modHealth 5000" précédent une sortie d'intérieur vers un extérieur (afin d'éviter le décès par dégats de chutes), ne fonctionnait pas dans toutes les saves et pas dans tous les esp de Nova selon les différences de scripts qu'ils présentaient... par contre un "disable" fonctionne à tous les coups avant le début du chargement de la cell d'arrivée, ou en tout cas avant la prise en compte des dégats de chute... si et seulement s'il n'y que très peu de tests/commandes légers avant le test cellchanged et que le disable suit immédiatement (ou presque, à 2 ou 3 commandes ou test près) celui-ci dans le script du familier (sinon il crève avant le disable).

"Bienvenue à toi, lent homme lié, poussif tresseur des vitesses."
Alain Damasio


#5 elendell

elendell

    Mécano Dell'Arte


Posté 27 août 2009 - 20:24

@ Post-it : Content que ça fonctionne !  :mrgreen:

Je précise juste pour un lecteur éventuel qui serait intéressé par tes scripts que le déplacement de l'activateur est facultatif et n'influe pas sur la montée de l'eau.

@ alliop : Effectivement, c'est encore plus pervers.  :P Ce que tu dis expliquerait sans doute pourquoi j'ai dû scinder mes instructions de remplacement du voilier (quand il change de cellule) en plusieurs frames dans le script global qui les gère. Certaines instructions ne se faisaient pas quelques fois (avec le script du MSfD). Merci pour ces précisions.

#6 Post-it

Post-it

    Attachant détachable adhérant sans tâcher


Posté 28 août 2009 - 09:57

Voir le messageelendell, le 27.08.2009 à 21:23, dit :

Je précise juste pour un lecteur éventuel qui serait intéressé par tes scripts que le déplacement de l'activateur est facultatif et n'influe pas sur la montée de l'eau.

Tout à fait, le déplacement de l'activateur peut très facilement s'enlever en retirant les variables Switch et Timer du script local ainsi que son dernier bloc. Précisons également que le script local est mis sur l'activateur.
Le topic est résolu. Merci. ;)

Y'a le Post-it et le Post-at ...

------------------------------------------------
Membre auto-proclamé des défenseurs des post-its sur forum, maintenant que je sais ce que c'est ...

#7 darkarya

darkarya

Posté 28 août 2009 - 19:38

J'ai une question.

Est ce que juste en changeant le signe on peut faire baisser le niveau de n'eau??

(je veut avoir un activateur pour remplir une piscine et un autre pour la vider).

Merci d'avance

Modifié par darkarya, 29 août 2009 - 01:39.

Si l'on devait étudier toutes les lois, on aurait pas le temps de les transgresser!

Moyen

Cool


#8 Post-it

Post-it

    Attachant détachable adhérant sans tâcher


Posté 31 août 2009 - 15:31

Bonjour darkarya,

en faisant cela sur le deuxième activateur :

if ( DoOnce == 1 )
	   if ( WaterLift != Global_var )
		  set DifferenceLevel to ( WaterLift - Global_Var )
		  ModWaterLevel DifferenceLevel
		  set WaterLift to Global_Var
	   endif
	endif

Cela devrait fonctionner.

Par contre il faut prévoir aussi de pouvoir remettre la variable globale à zéro quand l'eau a atteint le niveau voulu !! Dans le même ordre d'idée il ne faut pas pouvoir activer le deuxième activateur quand le premier utilise la variable globale !! Il y a certainement d'autres choses à prévoir ... Ce n'est pas anodin mais a priori pourquoi pas.

Modifié par Post-it, 31 août 2009 - 15:33.

Y'a le Post-it et le Post-at ...

------------------------------------------------
Membre auto-proclamé des défenseurs des post-its sur forum, maintenant que je sais ce que c'est ...

#9 darkarya

darkarya

Posté 31 août 2009 - 15:53

Et avec un seul activateur et un messagebox qui demande soit de baisser soit de monter sa fonctionnerais?

Si l'on devait étudier toutes les lois, on aurait pas le temps de les transgresser!

Moyen

Cool





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

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