Aller au contenu


[Resolu] Deplacement Aleatoire D'Objet


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

#1 drakan

drakan

Posté 10 avril 2010 - 12:26

me revoilà dans un script n'ayant pas vraiment d'utilité ^^ juste pour le plaisir des yeux
il servirait juste à rendre une caverne éclairé par des lueurs qui se deplacerai aleatoirement

j'ai choisi de n'utiliser que les translations (et deja avec ca c'est bien compliqué ^^ )
la lueur ne doit pas sortir d'un cube predefinie dans l'initialisation


je rencontre un pb:
ma lueur veut bien rester stable selon l'axe Z mais en revanche suivant X et Y , c'est pas du tout gagner.

ce n'est vraiment pas un script essentiel à mon mod donc pas la peine de prendre la tete dessus :sorcerer:

voici le code :

begin	PhMvtAletoire





;initialisation partielle des variables ( consomme moins de ressource )

	short DirectionEtSens
	short DoOnce

;ce premier morceau permet de faire bouger la lumiere

	if ( DirectionEtSens == 1 )
		move, X , -500
	elseif ( DirectionEtSens == 2 )
		move, X , 500
	elseif ( DirectionEtSens == 3 )
		move, Y , -500
	elseif ( DirectionEtSens == 4 )
		move, Y , 500
	elseif ( DirectionEtSens == 5 )
		move, Z , -500
	elseif ( DirectionEtSens == 6 )
		move, Z , 500
	endif

;celui ci sert à stopper l'avance du script et à repeter le premier morceau ;de script (celui qui deplace la lumiere ) 
;cette repetion dure ici pendant 1 seconde


	short vara
	float dureee
	set dureee to ( dureee + GetSecondsPassed )

	if ( dureee > 1 )
		set vara to vara + 1	
		set dureee to 0
	endif

	if (vara != 1)
		return
	endif

	set vara to 0



;initialisation complete

	if ( DoOnce == 0 )

		set DoOnce to 1

		float Xini
		float Yini
		float Zini

		float CoteDuCube

		float Xmin
		float Xmax
		float Ymin
		float Ymax
		float Zmin
		float Zmax

		set Xini to ( GetPos, X );prend les coordonnées initiales de la lumiere
		set Yini to ( getpos, Y )
		set Zini to ( getpos, Z )

		set CoteDuCube to 100	
;permet de changer la longueur du coté
 ;du cube dans lequel va bouger la lumière

		set Xmin to ( Xini - CoteDuCube ) ;rentre en variable les 
		set Xmax to ( Xini + CoteDuCube ) ;coordonnées à ne pas depasser
		set Ymin to ( Yini - CoteDuCube ) 
		set Ymax to ( Yini + CoteDuCube )
		set Zmin to ( Zini - CoteDuCube ) 
		set Zmax to ( Zini + CoteDuCube )


;		messagebox "lumiere initialisé 	"

	endif


			set DirectionEtSens to 0



;	donne une direction et un sens au mouvement de facon aleatoire.
;	c'est ici le point crucial du programme: il faut que
;	l'objet deplacé reste dans un cube 	

	if (random100 <= 16 ) ; bouger selon les x

		if ( (getpos, X) >= Xmin )
			set DirectionEtSens to 1

		endif

	elseif (random100 <= 32 )

		if ( (getpos, X) <= Xmax )
			set DirectionEtSens to 2
		endif

	elseif (random100 <= 48 ) ;bouger selon les Y

		if ( (getpos, Y) >= Ymin )
			set DirectionEtSens to 3 
		endif

	elseif (random100 <= 64 )

		if ( (getpos, Y) <= Ymax )
			set DirectionEtSens to 4
		endif

	elseif (random100 <= 80 ) ;bouger selon les Z

		if ( (getpos, Z) >= Zmin )
			set DirectionEtSens to 5
		endif

	elseif (random100 <=100 )

		if ( (getpos, Z ) <= Zmax )
			set DirectionEtSens to 6
		endif

	endif


End PhMvtAletoire



Modifié par drakan, 11 avril 2010 - 10:26.


#2 abg

abg

    L'ABG pour les civilisés


Posté 10 avril 2010 - 13:19

Je ne saurais t'aider à perfectionner ton script car les déplacements scriptés d'objet sont quelque chose que je maîtrise assez mal  :dry: (Ceci dit il y a sur Wiwiland au moins un autre modeur qui...  :sorcerer: )

Dans ces cas j'ai tendance à me reporter vers des solutions dans mon domaine de connaissance :
Le mod "Où vont les oiseaux" comporte des lucioles nocturnes qui peuvent être une source d'inspiration. L'auteur (Abot) a donné à ces petites créatures une lumière (objet light) dans leur inventaire. Il se repose donc entièrement sur l'IA pour que les bestioles divaguent dans l'obscurité en éclairant leur environnement  :)
Antoninus Bibulus Glaber
Coaching de PNJs chez Morrowind Renaissance

#3 drakan

drakan

Posté 10 avril 2010 - 14:23

c'est un exellente idée!
j'avais justement penser qu'il serait plus simple de le faire par AI restait à savoir comment le faire
mais avec un mod comme reference, ca devrai etre moins galere pour trouver la demarche de création d'une créature transportant une lumiere

neanmoins, je vais comme meme tenter de resoudre le probleme de mon script car il m'intrigue vraiment : pourquoi mon deplacement est borné sur l'axe des Z mais pas sur celui de X et Y alors qu'il y a exactement la mm syntaxe !

#4 elendell

elendell

    Mécano Dell'Arte


Posté 10 avril 2010 - 17:25

Bonjour drakan,

La première chose à vérifier quand tu ne comprends pas pourquoi un script ne fonctionne pas est s'il contient des erreurs de syntaxe.
Pour ça, le débugueur de script est très utile. Souvent, différentes syntaxes vont être acceptées par le Tescs et le script va fonctionner mais un simple espace en trop ou en moins (par exemple) peut déclencher un bug qui ne se produira qu'aléatoirement.

Voici le rapport du débugueur pour ton script. Note que l'explication qu'il donne n'est pas toujours compréhensible mais ça indique quand même un problème dans l'instruction écrite. Dans ce cas, essaye de l'écrire autrement, jusqu'à ce qu'il ne te renvoie plus d'erreur.

Spoiler


 drakan, le 10 avril 2010 - 14:23, dit :

neanmoins, je vais comme meme tenter de resoudre le probleme de mon script car il m'intrigue vraiment : pourquoi mon deplacement est borné sur l'axe des Z mais pas sur celui de X et Y alors qu'il y a exactement la mm syntaxe !

Quand tu auras éliminé toutes erreurs d'écriture, on pourra se pencher sur les instructions s'il y a toujours lieu.  :sorcerer:

PS :

- Y a-t-il une raison pour qu'un bonne partie des variables soient des globales ?
- Pourquoi "DirectionEtSens" est-elle déclarée en "long" ?

#5 drakan

drakan

Posté 10 avril 2010 - 20:50

je viens juste de comprendre mon probleme . dsl elendell j'ai lu ton message un peu trop tard .

mon probleme venait du fait que la fonction move prend en compte QUE les axes de l'objet. l'axe Z de l'objet etait le meme que celui de la cellule , ce qui explique pourquoi le script fonctionnai bien pour cette axe. mais ce n'etait pas le cas pour X et Y ( je ne suis pas sur d'avoir été tres clair ;) )

la solution consistait seulement à remplacer move par moveworld
car cette fonction ne tiens pas compte des axes de l'objet mais celle de la cellule (qui sont fixes)

Citation


- Y a-t-il une raison pour qu'un bonne partie des variables soient des globales ?
- Pourquoi "DirectionEtSens" est-elle déclarée en "long" ?

- il n'y a aucune variable globale dans ce script. j'ai juste declarer tt mes variable dans la section "initialisation" afin que l'ordinateur ne relise pas ces ligne à chaque frame "initialisation" se trouve au milieu du script et n'est activé qu'une seule fois

-DirectionEtSens est une variable qui est sensé prendre les valeur 1,2,3,4,5,6,0
0= aucun mvt
1 = direction x et sens positif
2 = direction x et sens negatif
....

#6 elendell

elendell

    Mécano Dell'Arte


Posté 10 avril 2010 - 22:11

 drakan, le 10 avril 2010 - 20:50, dit :

mon probleme venait du fait que la fonction move prend en compte QUE les axes de l'objet. l'axe Z de l'objet etait le meme que celui de la cellule , ce qui explique pourquoi le script fonctionnai bien pour cette axe. mais ce n'etait pas le cas pour X et Y ( je ne suis pas sur d'avoir été tres clair ;) )
Effectivement, je sais bien me servir de ces deux fonctions mais je ne comprends pas ta phrase pour autant.  :lol: (et comme je n'ai pas étudié ton script...)

 drakan, le 10 avril 2010 - 20:50, dit :

- il n'y a aucune variable globale dans ce script. j'ai juste declarer tt mes variable dans la section "initialisation" afin que l'ordinateur ne relise pas ces ligne à chaque frame "initialisation" se trouve au milieu du script et n'est activé qu'une seule fois
Là aussi je ne comprends pas. Et j'ai beau chercher dans le script, je ne vois pas où sont les variables. Pour moi, si elles ne sont pas dans le script, c'est qu'il s'agit de globales. Est-ce quelque chose propre à MWSE ? Si oui, il faut que tu le précises quand tu utilises MWSE.

 drakan, le 10 avril 2010 - 20:50, dit :

-DirectionEtSens est une variable qui est sensé prendre les valeur 1,2,3,4,5,6,0
0= aucun mvt
1 = direction x et sens positif
2 = direction x et sens negatif
....
Il prend l'une ou l'autre de ces valeurs mais une seule à la fois, non ? Donc, pour moi, une "short" suffit. A moins encore une fois qu'il s'agisse d'un script MWSE (que je ne connais pas).

#7 drakan

drakan

Posté 11 avril 2010 - 08:28

Citation

Il prend l'une ou l'autre de ces valeurs mais une seule à la fois, non ? Donc, pour moi, une "short" suffit. A moins encore une fois qu'il s'agisse d'un script MWSE (que je ne connais pas).

tout à fait j'aurai pu prendre un short ca aurai largement suffit

Citation


il n'y a aucune variable globale dans ce script. j'ai juste declarer tt mes variable dans la section "initialisation" afin que l'ordinateur ne relise pas ces ligne à chaque frame "initialisation" se trouve au milieu du script et n'est activé qu'une seule fois

Là aussi je ne comprends pas. Et j'ai beau chercher dans le script, je ne vois pas où sont les variables. Pour moi, si elles ne sont pas dans le script, c'est qu'il s'agit de globales. Est-ce quelque chose propre à MWSE ? Si oui, il faut que tu le précises quand tu utilises MWSE.


et ce qui est incroyable c'est que je ne me suis meme pas rendu compte que j'avais enlever les declarations quand bien meme tu m'ai posé la question ! XD
c'est vrai que ca peut laissé perplexe, desolé
j'ai modifié mon script initiale

#8 Kafou

Kafou

    Le canari a bouffé le rominet !


Posté 11 avril 2010 - 09:57

Commence par déclarer toutes tes variables en début de script. Les déclarer au milieu d'un bloc if est incorrect (et quand bien même ça serait correct, les variables en question ne seraient accessibles qu'à l'intérieur du bloc if, pas à l'extérieur, et donc ton script serait quand même incorrect : s'il marche, c'est que tu as beaucoup de chance mais ce comportement n'est pas normal).
You look like you need a monkey!

Attention : perfectionniste paresseux.

#9 drakan

drakan

Posté 11 avril 2010 - 10:26

;) pourtant il fonctionne mon script maintenant.
et pourtant je fais appelle à mes variables à l'exterieur du if
les voies de morrowind sont vraiment impenetrable ...
mais tant que ca marche :lol:

je te donne le nouveau script qui fonctionne en le nettoyant un peu et je vais enfin prendre la bonne habitude de mettre [resolu] sur mon topic
se rendre compte qu'on a aidé quelqu'un alors qu'il avait deja resolu son probleme dois etre assez frustrant , dsl

petite question: comment on peut inserer dans un message un spoileur? (ce qui evite d'avoir des codes qui prennent trop de place...)




begin	PhMvtAletoire

;initialisation partielle des variables ( consomme moins de ressource )
	short DirectionEtSens
	short DoOnce

;ce premier morceau permet de faire bouger la lumiere

	if ( DirectionEtSens == 1 )
		MoveWorld , X , -500
	elseif ( DirectionEtSens == 2 )
		MoveWorld , X , 500
	elseif ( DirectionEtSens == 3 )
		MoveWorld , Y , -500
	elseif ( DirectionEtSens == 4 )
		MoveWorld , Y , 500
	elseif ( DirectionEtSens == 5 )
		MoveWorld , Z , -0.5
	elseif ( DirectionEtSens == 6 )
		MoveWorld , Z , 0.5
	endif

;celui ci sert à stopper l avance du script et à repeter le premier morceau 
;de script (celui qui deplace la lumiere ) 
;cette repetion dure ici pendant 1 seconde

	short vara
	float dureee
	set dureee to ( dureee + GetSecondsPassed )

	if ( dureee > 1 )
		set vara to vara + 1	
		set dureee to 0
	endif

	if (vara != 1)
		return
	endif

	set vara to 0

;initialisation complete


	if ( DoOnce == 0 ) 	;initialisation et parametrage du mvt de la lumiere

		float Xini
		float Yini
		float Zini

		float CoteDuCube

		float Xmin
		float Xmax
		float Ymin
		float Ymax
		float Zmin
		float Zmax


		set DoOnce to 1

		set Xini to ( GetPos, X )	;prend les coordonnées initiales de la lumiere
		set Yini to ( getpos, Y )
		set Zini to ( getpos, Z )

		set CoteDuCube to 1000	;permet de changer la longueur du coté du cube dans lequel va bouger la lumière

		set Xmin to ( Xini - CoteDuCube )	;rentre en variable les coordonnées à ne pas depasser
		set Xmax to ( Xini + CoteDuCube )
		set Ymin to ( Yini - CoteDuCube ) 
		set Ymax to ( Yini + CoteDuCube )
		set Zmin to ( Zini - CoteDuCube ) 
		set Zmax to ( Zini + CoteDuCube )

		messagebox "script lumiere initialisé 	"

	endif


;	donne une direction et un sens au mouvement de facon aleatoire.
;	c est ici le point crucial du programme: il faut que l objet deplacé reste dans un cube 	

	set DirectionEtSens to 0

	if (random100 <= 16 ) ; bouger selon les x

		if ( (getpos, X) >= Xmin )
			set DirectionEtSens to 1

		endif

	elseif (random100 <= 32 )

		if ( (getpos, X) <= Xmax )
			set DirectionEtSens to 2
		endif

	elseif (random100 <= 48 ) ;bouger selon les Y

		if ( (getpos, Y) >= Ymin )
			set DirectionEtSens to 3 
		endif

	elseif (random100 <= 64 )

		if ( (getpos, Y) <= Ymax )
			set DirectionEtSens to 4
		endif

	elseif (random100 <= 80 ) ;bouger selon les Z

		if ( (getpos, Z) >= Zmin )
			set DirectionEtSens to 5
		endif

	elseif (random100 <=100 )

		if ( (getpos, Z ) <= Zmax )
			set DirectionEtSens to 6
		endif

	endif

End PhMvtAletoire



Modifié par drakan, 11 avril 2010 - 10:28.





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

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