Aller au contenu


[résolu] Probleme De Script


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

#1 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 08 février 2006 - 14:17

Pour aller d'un quai a un autre j'ai fait un pont mouvant comportant 4 activators, 2 pour les passerelles et 2 autres pour les boutons de commande.  Le pont s'ouvre quand on active le bouton et se referme si on active une deuxieme fois. Les passerelles s'ouvrent:

<----- ====== ====== ------>

et se ferment en faisant coulisser deux parties sur l'axe X :

======= -----> <------ ========

Le probleme c'est que lorsque j'active une deuxieme fois le bouton, les passerelles ne se ferme pas, au contraire elles partent dans le sens opposé!

A force de "zut" de "flute" et de "crotte" je poste sur ce forum pour enfin savoir quel est le bins qui fait capoté ce script:

Sur chacun des boutons:

Begin GDI_bridge01

float timer

if ( MenuMode == 1 )
  return
endif

if ( OnActivate == 1 )
 PlaySound3D "bridge_buttom"
  if ( GDIbridge01 == 0 )
	set GDIbridge01 to 1
  elseif ( GDIbridge01 == 2 )
	set GDIbridge01 to 3
  endif
endif

; Moving States:
; 0  at close position
; 1  moving from closed to open position
; 2  at open position
; 3  moving from open to closed position

if ( GDIbridge01 == 0 )
  return
elseif ( GDIbridge01 == 2 )
  return
elseif ( GDIbridge01 == 1 )
  set Timer to ( Timer + GetSecondsPassed )
  if ( Timer <= 1 )
  GDI_bridge2->MoveWorld x, 100
  GDI_bridge->MoveWorld x, -100
  else
	  set Timer to 0
	  set GDIbridge01 to 2
endif
elseif ( GDIbridge01 == 3 )
set Timer to ( Timer + GetSecondsPassed )
if ( Timer <= 1 )
  GDI_bridge2->MoveWorld x,-100
  GDI_bridge->MoveWorld x, 100
else
  set Timer to 0
  set GDIbridge01 to 0
endif
endif
end

et sur chacune des passerelles:

begin GDI_bridge01_move_sound

short doonce

if ( GDIbridge01 == 1 )
 if ( doonce == 0 )
  PlaySound3D "bridge_move"
  set doonce to 1
 endif
endif

if ( GDIbridge01 == 3 )
 if ( doonce == 0 )
  PlaySound3D "bridge_move"
  set doonce to 1
 endif
endif

if ( GDIbridge01 != 1 )
 if ( GDIbridge01 != 3 )
  set doonce to 0
 endif
endif 

end

GDIbridge01 est une variable globale

Modifié par Von Zeeple, 14 février 2006 - 18:35.

Le Steampunk, c'est bon, mangez en  !

#2 Korfandar

Korfandar

    Ch'ti dragon normand...dans son trou


Posté 08 février 2006 - 16:33

A première vue je ne vois pas d'erreur.
Essais sans le script sur les passerelles et en rajoutant des messages box indiquant l'état de la variable globale ou utilise "sv" à la console entre deux activations du bouton.

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...


#3 a3jv

a3jv

    ... à 4 je reviens.


Posté 08 février 2006 - 17:08

Je pense qu'il y a un problème avec le deuxième "timer"
J'écrirais ce script plutôt comme ça :
Begin GDI_bridge01

float timer

if ( MenuMode == 1 )
   return
endif

if ( OnActivate == 1 )
   PlaySound3D "bridge_buttom"
   if ( GDIbridge01 == 0 )
	  set GDIbridge01 to 1
	  elseif ( GDIbridge01 == 2 )
	  set GDIbridge01 to 3
  endif
endif

if ( GDIbridge01 == 0 )
   return
   elseif ( GDIbridge01 == 2 )
   return
endif

set Timer to ( Timer + GetSecondsPassed )

if ( GDIbridge01 == 1 )
   if ( Timer <= 1 )
	  GDI_bridge2->MoveWorld x, 100
	  GDI_bridge->MoveWorld x, -100
	  else
	  set Timer to 0
	  set GDIbridge01 to 2
  endif
endif

if ( GDIbridge01 == 3 )
   if ( Timer <= 1 )
	  GDI_bridge2->MoveWorld x,-100
	  GDI_bridge->MoveWorld x, 100
	  else
	  set Timer to 0
	  set GDIbridge01 to 0
   endif
endif

end

Modifié par a3jv, 08 février 2006 - 17:08.

Les choses n'ont que l'importance ou la valeur qu'on leur donne.

#4 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 08 février 2006 - 17:43

J'ai essayer le truc avec les message box, elles indiquent que la variable fonctionne normalement, donc ca vient soit du timer, soit des coordonées pour le mouvement.

Le script de a3jv ne marche pas non plus :green:

J'ai remarquer que les passerelles vont beaucoup trop loins, il me semble qu'elles vont plus loins que 100 dans l'axe x

Modifié par Von Zeeple, 08 février 2006 - 17:47.

Le Steampunk, c'est bon, mangez en  !

#5 a3jv

a3jv

    ... à 4 je reviens.


Posté 08 février 2006 - 18:19

 Von Zeeple, le 08.02.2006 à 17:43, dit :

Le script de a3jv ne marche pas non plus :green:
Rien ne marche ou ça fait pareil qu'avec le 1er script : ouverture mais pas fermeture ?

Sinon, c'est le timer qui fait bouger de 100 donc, s'il y a 3 passages (3 lectures du script) avant qu'il soit > 1, ta passerelle bouge de 300, s'il y en a 5, 500.
Il y a une meilleure méthode mais je ne suis pas un spécialiste des déplacements.

Modifié par a3jv, 08 février 2006 - 18:20.

Les choses n'ont que l'importance ou la valeur qu'on leur donne.

#6 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 08 février 2006 - 19:26

Ca fait pareil qu'avec le premier script, sinon quand tu parle de "passage" tu parle de "frame"?
Le Steampunk, c'est bon, mangez en  !

#7 Korfandar

Korfandar

    Ch'ti dragon normand...dans son trou


Posté 09 février 2006 - 12:31

Non non, théoriquement le moveworld est un déplacement en seconde donc non dépendant du nombre de frames (nombre de fois ou le monde du jeu est actualisé : calculs 3D et exécution des scripts) donc là il est sensé se déplacer de 100/seconde, le problème est qu'on ne tombe pas forcément juste sur une seconde dans le timer d'ou un positionnement approximatif à la fin. Généralement quand le déplacement est terminé, on force les coordonnées à une position précise par un setpos.
A noter que j'ai eu des problèmes avec le setatstart (ok pour le XYZ mais perdait les angles !)

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...


#8 Gwen Armor

Gwen Armor

Posté 09 février 2006 - 13:31

Bonjour Von Zeeple,
Je ne vois pas de déclaration de variable pour GDI_bridge2 et GDI_bridge. Ce sont des globales ? Tu les as déclarées comme quoi : short ?
Une autre remarque, mais je ne sais pas dans le cas de l'interpréteur de morro, je me souviens avoir eu sous des vieux langages des problèmes sur des déclarations de routines "begin GDI_bridge01" qui portaient le même nom qu'une variable...
Bon courage,
Gwen.
---------------------------------------------
L'essentiel est invisible aux yeux
---------------------------------------------

#9 a3jv

a3jv

    ... à 4 je reviens.


Posté 09 février 2006 - 16:37

Gwen Armor, ce sont les ID des passerelles ! ;)

Bon j'ai légèrement remanié mon script en rajoutant notamment des espaces :
Spoiler

Si ça ne marche toujours pas, tu as une solution pour ramener les passerelles dans leur position d'origine. Mais ce sera de l'instantané.
if ( GDIbridge01 == 3 )
   "GDI_bridge2" -> SetAtStart
   "GDI_bridge" -> SetAtStart
   set GDIbridge01 to 0
endif
A mettre à la place de la dernière portion du script (GDIbridge01 == 3).
A voir si ça peut le faire !
Les choses n'ont que l'importance ou la valeur qu'on leur donne.

#10 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 09 février 2006 - 21:21

Le probleme persiste sauf qu'avec ton dernier script a3jv, les passerelles semble revenir legerement sur elles mêmes de temps en temps, en tous cas elles ne se déplacent pas de 100...

Modifié par Von Zeeple, 09 février 2006 - 21:22.

Le Steampunk, c'est bon, mangez en  !

#11 a3jv

a3jv

    ... à 4 je reviens.


Posté 10 février 2006 - 16:10

Tu dois tester avec une sauvegarde vierge de ce mod en construction.
Si oui, je ne vois vraiment pas ce qui peut clocher dans tous ces scripts.

Rien à voir, mais tu es sûr que 100 de déplacement c'est suffisant ? Pour info j'ai jeté un œil sur les grilles de la "Porte des Ames" elles se déplacent de 210 unités en montée ou descente (70 x 3 secondes) et ce n'est pas énorme.

Allez, une dernière proposition qui est de supprimer les scripts sur les passerelles et de mixer le tout sur le script du bouton :
Begin GDI_bridge01

float timer
short doonce

if ( MenuMode == 1 )
   return
endif

if ( OnActivate == 1 )
   PlaySound3D "bridge_buttom"
   if ( GDIbridge01 == 0 )
	  set GDIbridge01 to 1
	  elseif ( GDIbridge01 == 2 )
	  set GDIbridge01 to 3
   endif
endif

if ( GDIbridge01 == 0 )
   return
   elseif ( GDIbridge01 == 2 )
   return
endif

if ( GDIbridge01 == 1 )
   set timer to ( timer + GetSecondsPassed )
   if ( timer < 2 )
	  "GDI_bridge2"->MoveWorld x 50
	  "GDI_bridge"->MoveWorld x -50
		 if ( doonce == 0 )
			"GDI_bridge2"->Playsound3D "bridge_move"
			"GDI_bridge"->Playsound3D "bridge_move"
			set doonce to 1
		 endif
	  else
	  set timer to 0
	  set doonce to 0
	  set GDIbridge01 to 2
   endif
endif

if ( GDIbridge01 == 3 )
   set timer to ( timer + GetSecondsPassed )
   if ( timer <= 1 )
	  "GDI_bridge2"->MoveWorld x -50
	  "GDI_bridge"->MoveWorld x 50
		 if ( doonce == 0 )
			"GDI_bridge2"->Playsound3D "bridge_move"
			"GDI_bridge"->Playsound3D "bridge_move"
			set doonce to 1
		 endif
	  else
	  set timer to 0
	  set doonce to 0
	  set GDIbridge01 to 0
   endif
endif

end

Les choses n'ont que l'importance ou la valeur qu'on leur donne.

#12 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 10 février 2006 - 18:41

Ok je voit où est le probleme! En fait, lorsque l'un des bouton est activé, il change la valeur de la globale, mais quand la globale change de valeur, elle affecte le script du second bouton, du coup, les vecteurs de mouvement s'additionnent ou s'annulent, bref un gros beans... En fait il faudrait trouver une astuce pour qu'un script n'affecte pas l'autre.

Je vais essayer de mettre les commandes de mouvent sur un seul script, on va bien voir...
Le Steampunk, c'est bon, mangez en  !

#13 Najah

Najah

    Rainbow Warrior


Posté 11 février 2006 - 19:31

si tes objets sont uniques, tu peux acceder à leurs variables locales  :)

set machin_unique.MaVariable to 1

Gamall, le 08.08.2007 à 15:10, dit :

Je l'ai toujours dit, moi, que Kitty est l'arme absolue. Plus fort que les baffes

#14 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 14 février 2006 - 18:35

Ok c'est bien ça, en fait Le mouvement s'exécutait deux fois, j'ai donc changer l'un des srcipts des bouton, et ça marche
Le Steampunk, c'est bon, mangez en  !




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

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