Aller au contenu


Mouvement Dans Le Monde


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

#26 Post-it

Post-it

    Attachant détachable adhérant sans tâcher


Posté 12 août 2009 - 21:20

Il me semble que ce que tu veux faire c'est changer ton localdayspassed à chaque jour et non à chaque frame ...

pour cela tu crées la variable currentday ...

Donc :

if ( currentday != day )
   
   set localdayspassed to ( localdayspassed + 1 )
   set currentday to day
   
endif

A vérifier qu'en même ... j'ai pas le msfd quelque chose sous les yeux ...

Modifié par Post-it, 13 août 2009 - 14:40.

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

#27 Dallara

Dallara

    Fortificateur fortiche


Posté 12 août 2009 - 21:29

Voir le messagePost-it, le 12.08.2009 à 22:19, dit :

Il me semble que ce que tu veux faire c'est changer ton localdayspassed à chaque jour et non à chaque frame ...

pour cela tu crées la variable currentday ...

Donc :

if ( currentday =! day )
 
 set localdayspassed to ( localdayspassed +1 )
 set currentday to day
 
 endif

A vérifier qu'en même ... j'ai pas le msfd quelque chose sous les yeux ...

Je vais essayer sa demain merci Post-it
Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#28 elendell

elendell

    Mécano Dell'Arte


Posté 12 août 2009 - 23:05

Bonjour Dallara,

Je t'invite à relire plusieurs fois <ce message> et plusieurs fois si nécessaire.

#29 Dallara

Dallara

    Fortificateur fortiche


Posté 18 août 2009 - 22:07

Bonsoir,

Je refais se message ce dernier n'étant pas clair.

Donc j'ai insérer des messages box dans le script. Ceux-ci (celui-ci) s'affichent trois fois (ou en permanence ??) (en rafales ??) mais s'enlève au bon moment.

J'ai un autre problème plutôt gênant : A la fin du script les collisions du bateau disparaissent (très grave parce que il doit y avoir des NPCs) (équipage du bateau).
Ceux-ci tombent déjà enpartie pendant le traget.

Le SetatStart ne fait pas son effet j'ai essayé par diverse manière pour les conditions mais rien à faire.
La consition actuelle pour le SetatStart est un OkPosy >= "cordonnée locale y"
Il y en a-t-il une meilleur ?

begin CDH_bateau_Mar_01

float  timer
Short localdaysPassed
Short currentDay
Short OkPosy

if ( MenuMode == 1 )
	return
endif

if ( currentDay != Day )
	 set localdaysPassed to localdaysPassed + 1
	 set currentDay to Day
endif

if ( localdaysPassed == 4 )

	   if ( GameHour >= 13 )

		 set timer to ( timer + GetSecondsPassed )

		 

		 if ( timer < 75.597 )
			  Move y, -130
			  Messagebox "un bateau arrive au port"
		 endif

		 if ( OkPosy >= 210157 )
			 SetatStart	   
			 Messagebox "Un bateau part du port"
		 endif
		  

	 endif

endif

end CDH_bateau_Mar_01

Bonne soirée et merci

Dallara

Modifié par Dallara, 18 août 2009 - 22:08.

Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#30 elendell

elendell

    Mécano Dell'Arte


Posté 18 août 2009 - 22:09

Bonjour Dallara,

Désolé, j'avais lu ton message sans pouvoir y répondre de suite et ensuite, j'ai oublié et n'avais plu ce sujet en gras pour me prévenir qu'il y avait une demande en attente.

Voir le messageDallara, le 13.08.2009 à 18:33, dit :

le bateau perd sa collision à la fin.
Peux-tu préciser et me dire aussi quel est le type d'objet du bateau ?

Voir le messageDallara, le 13.08.2009 à 18:33, dit :

il ne reviens pas en SetatStart.
Tu as mis comme condition que le SetAtStart se fasse quand "fin" est à 1 mais qu'est-ce qui met "fin" à 1 ?

Voir le messageDallara, le 13.08.2009 à 18:33, dit :

Le script ne marche que une fois (sans doutes a cause du fait qu'il ne se finis pas correctement).
Parce que tu n'as pas tenu compte de mon avertissement :

Voir le messageelendell, le 11.08.2009 à 20:20, dit :

Note : Pense à remettre "localdaysPassed" à 0 le 5ème jour.
D'ailleurs, tu n'a pas prévu de 5ème jour et tu as mis la deuxième MessageBox le même jour que la première.

Il faut que le 4ème jour le bateau arrive au port (1ère MessageBox) et que le 5ème jour il reparte (2ème MessageBox, suivie de SetAtStart et de remise à 0 de "LocalDaysPassed").


Voir le messageDallara, le 13.08.2009 à 18:33, dit :

Quand je refais le trajet du bateau il s'affiche plusieurs fois sur la carte (sur la carte j'ai trois fois le bateau en mod local).
Ne te préoccupe pas de la carte pour l'instant.


Voir le messageDallara, le 13.08.2009 à 18:33, dit :

Pour les messagebox j'ai trouver je n'ai pas mis de conditions de commencements ni de fin je devrai le mettre dans le groupe :          if ( timer < 75.597 )
                                                                                                                                                                                          Move y, -130
                                                                                                                                                                                   endif

Ainsi :          if ( timer < 75.597 )
                         Move y, -130
                        Messagebox "un bateau arrive au port"
                    endif
Tu as raison pour la cause mais pas pour la solution. En plaçant la messageBox là, elle s'affichera continuellement tant que "timer < 75.597" et qu'on est le 4ème jour. Il te faut une condition supplémentaire. Ça peut se faire de différentes manières suivant la structure de ton script mais tu peux commencer par faire une variable spécialement pour ça :

if ( mavariable == 0 )
	Messagebox "Je donne mon message"
	set mavariable to 1
endif

A la frame suivante, "mavariable" sera à 1 et il ne lancera donc plus la MessageBox. Mais il faudra que tu remettes "mavariable" à 0 plus tard, par exemple le 5ème jour, de telle sorte que la prochaine fois que "LocalDaysPassed" sera à 4 et qu'un nouveau bateau arrivera au port, il puisse relancer la MessageBox.


Voir le messageDallara, le 13.08.2009 à 18:33, dit :

sa marche à moiter du fait que le message box s'affiche trois fois.
Je pense plutôt qu'elle s'affiche continuellement. Le jeu ne peut afficher que 3 MessageBox à la fois. Donc, si tu n'as pas mis de condition pour qu'elle ne soit lancée qu'une seule fois, il s'en affiche une nouvelle à chaque frame. Comme les MessageBox restent affichées plusieurs secondes, tu en vois toujours 3 avec le même texte mais en réalité, ce ne sont pas les mêmes.


Voir le messageDallara, le 13.08.2009 à 18:33, dit :

(je devrais prendre se reflex de regarder le Msdf8 TOUT LE TEMPS)
Tu as compris !  :shocked:

#31 Dallara

Dallara

    Fortificateur fortiche


Posté 19 août 2009 - 21:14

Bonsoir elendell,

J'ai refait (modifier) mon script avec tes conseils et il y a des beaucoup mieux mais quelques problèmes.

-Pour la collision je n'ai pas très bien compris ta question (au sujet du type d'objet qu'est mon bateau) mais maintenant que le SetatStart marche j'ai remarqué qu'il retrouve sa collision et les NPCs se remettent   dessus si je dors.

-après la fin si je ré attend 4 jours le message box réapparait bien mais le bateau ne réfectue pas le mouvement.

Autrement tout marche nickel sleeping.gif

je remet mon script avec les modifications:

begin CDH_bateau_Mar_01
  
  float  timer
  Short localdaysPassed
  Short currentDay
  Short fin
  
  if ( MenuMode == 1 )
	  return
  endif
  
  if ( currentDay != Day )
	   set localdaysPassed to localdaysPassed + 1
	   set currentDay to Day
  endif
  
  if ( localdaysPassed == 4 )
  
		 if ( GameHour >= 13 )
  
		   set timer to ( timer + GetSecondsPassed )
  
		   if ( CDH_Message == 0 )
				 Messagebox "Un bateau arrive au port"
  
				 set CDH_Message to 1
  
		   endif
		   
		   if ( timer < 75.597 )
				Move y, -130			  
		   endif
  
	   endif
  
  endif
  
  if ( localdaysPassed == 5 )
  
		if ( GameHour >= 9 )
  
			 set timer to ( timer + GetSecondsPassed )
  
			  if ( CDH_Message == 1 )
				   Messagebox "Un bateau part du port"
  
				   set CDH_Message to 0
  
			  endif
  
			  if ( fin == 0 )
				   SetatStart
  
				   set fin to 1
  
			  endif
			
		 endif
  
  set localdaysPassed to 0
  
  endif
			 
  end CDH_bateau_Mar_01

Dallara

EDIT:

Il me semble que après lectures et relectures et ...
le problème vient du fait que je ne renvoie pas (fin) à 0 au début script.

Modifié par Dallara, 19 août 2009 - 22:02.

Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#32 elendell

elendell

    Mécano Dell'Arte


Posté 19 août 2009 - 22:29

Salut,

Voir le messageDallara, le 19.08.2009 à 22:13, dit :

-Pour la collision je n'ai pas très bien compris ta question (au sujet du type d'objet qu'est mon bateau)
Le type d'objet c'est : Misc, activateur, NPC, clothing, static, etc... Mais puisque tu précises maintenant qu'il y a des PNJs dessus, ça me dit que c'est un activateur.

Voir le messageDallara, le 19.08.2009 à 22:13, dit :

-après la fin si je ré attend 4 jours le message box réapparait bien mais le bateau ne réfectue pas le mouvement.
Il me semble que après lectures et relectures et ....
le problème vient du fait que je ne renvoie pas (fin) à 0 au début script.
C'est bien d'avoir vu que "fin" doit être remis à 0 car c'est effectivement nécessaire mais c'est nécessaire uniquement pour que la fois suivante le "SetAtStart" puisse de nouveau se faire.

Ta phrase qui décrit le problème contient tout ce qu'il faut de constatation pour que tu puisses en trouver la cause. Regarde la première partie de ta phrase : "-après la fin si je ré attend 4 jours le message box réapparait bien". Tu peux en déduire que toutes les conditions pour arriver jusqu'au lancement de la MessageBox sont vraies (le jour à 4 et l'heure >= 13 + la remise à 0 de CDH_Message), puisque le message est bien envoyé.

La deuxième partie de ta phrase dit ce qui ne fonctionne pas : "mais le bateau ne réfectue pas le mouvement".
Tu dois donc chercher l'instruction qui fait le mouvement (move) et regarder les conditions pour qu'il se fasse. Le jour doit être à 4 (c'est bon) et l'heure doit être >= 13 (c'est bon aussi puisque la MB est lancée). Il ne reste plus qu'une condition qui peut empêcher le "move" : Le "timer < 75.597".

A combien est le "timer" la deuxième fois qu'il y a un 4ème jour et qu'un deuxième bateau devrait arriver ?

Quand tu auras résolu cette énigme, essaye d'ajouter le mouvement inverse le 5ème jour, pour qu'on puisse voir le bateau repartir comme on le voit arriver. Ce mouvement doit se faire avant le "SetAtStart" qui ne sert qu'à replacer le bateau à sa position exacte d'origine mais ne crée pas un déplacement visible comme le fait "move".

#33 Dallara

Dallara

    Fortificateur fortiche


Posté 20 août 2009 - 21:27

Bonsoir,

J'ai trouver le problème (oublier de remettre timer a 0)

Du coup j'ai mis un mouvement lors du cinquième jour mais j'ai quelques problèmes.

-Les messages box s'affichent toujours en premier avant les mouvements se qui devrait être l'inverse (prévisions pour l'avenir) (les autres mouvements a venir).

-Le déplacement du cinquième jours n'as pas lieu il passe tout de suit au SetatStart

Si dessous le script avec les dernière modifications:

begin CDH_bateau_Mar_01

float   timer
Short localdaysPassed
Short currentDay
Short fin

if ( MenuMode == 1 )
	return
endif


if ( fin == 1 )

	  set fin to 0

endif

if ( currentDay != Day )
	 set localdaysPassed to localdaysPassed + 1
	 set currentDay to Day
endif

if ( localdaysPassed == 4 )

	   if ( GameHour >= 13 )

		 set timer to ( timer + GetSecondsPassed )
		 
		  if ( timer < 75.597 )
			   Move y, -130
		  endif

					
			  if ( CDH_Message == 0 )
				  Messagebox "Un bateau arrive au port"

				  set CDH_Message to 1 
			 
			 endif

	 endif

endif


if ( localdaysPassed == 5 )

	  if ( GameHour >= 9 )

			 if ( timer < 6 )
				  Rotate z, 5.5
				  Move y, -70
			 endif

			   if ( CDH_Message == 1 )
				   Messagebox "Un bateau part du port"

				   set CDH_Message to 0

			   endif

				 if ( fin == 0 )
					   SetatStart

					   set fin to 1

				endif
		  
	   endif

set localdaysPassed to 0

set timer to 0 

set fin to 0

endif
	   
end CDH_bateau_Mar_01

Dallara

Modifié par Dallara, 20 août 2009 - 21:27.

Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#34 elendell

elendell

    Mécano Dell'Arte


Posté 20 août 2009 - 23:07

Bonjour Dallara,

Il faut que tu étudies comment fonctionnent les conditionnelles "if" "elseif" et "else" : pages 28 et 29 du MSfD8. C'est une base indispensable et suivant le cas, il faut que tu utilises autre chose que "if".

Par exemple, le 4ème jour tu as ces 2 blocs avec "if" :

if ( timer < 75.597 )
	Move y, -130
endif

if ( CDH_Message == 0 )
	Messagebox "Un bateau arrive au port"
	set CDH_Message to 1
endif

Si dans la frame en cours de lecture les deux conditions sont vraies, il fera les deux instructions (le "move" et la MB).
Si à la place, tu écris ceci :

if ( CDH_Message == 0 )
	Messagebox "Un bateau arrive au port"
	set CDH_Message to 1
elseif ( timer < 75.597 )
	Move y, -130
endif
Dans la première frame, il lancera la MB et ne fera "move" que dans les frames suivantes.
Et si à la place, tu écris cela :

if ( timer < 75.597 )
	Move y, -130
elseif ( CDH_Message == 0 )
	Messagebox "Un bateau arrive au port"
	set CDH_Message to 1
endif
Il ne lancera la MB que lorsque le timer ne sera plus < 75.597, c'est à dire après que le bateau ait fini de se mouvoir.

Le 5ème jour, tu as trois instructions au lieu de 2 mais le principe est le même. Tu dois te débrouiller pour que le "SetAtStart" ne se fasse que lorsque le bateau aura fini sa rotation et tout son déplacement. Essaye...

Note : Remplacer deux blocs "if" séparés par un bloc "if/elseif" a aussi l'avantage d'économiser de la ressource. Par exemple, tu as fais ces 2 blocs séparés :

if ( localdaysPassed == 4 )
.....
endif

et

if ( localdaysPassed == 5 )
.....
endif

Le 4ème jour, le premier bloc est juste. Ça n'a donc aucun intérêt que le script vérifie ensuite dans la même frame si le 2ème bloc est lui aussi juste. Il ne peut pas l'être puisque on ne peut pas être à la fois le 4ème et le 5ème jour. Il fait donc une vérification supplémentaire pour rien. Il vaut donc mieux à la place faire ceci :

if ( localdaysPassed == 4 )
.....
elseif ( localdaysPassed == 5 )
.....
endif

A partir du moment où dans une suite de "if/elseif/else" le jeu trouve une condition qui est vraie, il ne s'occupe plus des autres et ne les vérifie pas.


PS : Le meshe de ton bateau est-il un meshe du jeu ou un meshe perso ? Quoi qu'il en soit, il est à l'envers car normalement un mouvement négatif sur l'axe y (Move y, -130) devrait le faire reculer et non pas avancer. Si c'est un meshe perso, il faut que tu le fasses pivoter de 180°, sinon tant pis, ça marche quand même en inversant la commande "move".

#35 Dallara

Dallara

    Fortificateur fortiche


Posté 21 août 2009 - 22:21

Bonsoir elendell,

J'ai corriger d'après tes conseils et il y a un mieux mais un moins ^^
Enfaite dès que je met deux elseif dans le même if sa ne fait pas le deuxième elseif voir même pas le if (se qui m'étonne pour le premier cas car le Mfsd8 dit que sa peut poser des problème à partir de 127 ligne je crois. En tout cas bien plus que 2)

- dans le premier jour les deuxième elseif ne fonctionne pas (il affiche le message box et c'est tout)
- dans le deuxième jour tout le bloc ne fonctionne pas

begin CDH_bateau_Mar_01

float   timer
Short localdaysPassed
Short currentDay
Short fin

if ( MenuMode == 1 )
	return
endif


if ( fin == 1 )

	  set fin to 0

endif

if ( currentDay != Day )
	 set localdaysPassed to localdaysPassed + 1
	 set currentDay to Day
endif

if ( localdaysPassed == 4 )

	   if ( GameHour >= 13 )

		 set timer to ( timer + GetSecondsPassed )
		 
		   if ( timer < 75.597 )
			   Move y, -130
		  

		   elseif ( timer < 3.23  ) 

			Rotate z, 7.43
			 Move y, -130

		  
		   elseif ( CDH_Message == 0 )
				  Messagebox "Un bateau arrive au port"

				  set CDH_Message to 1 

			 
		   endif

	 endif

endif


if ( localdaysPassed == 5 )

	  if ( GameHour >= 9 )

			 if ( timer < 6 )
				  Rotate z, 5.5
				  Move y, -70


			 elseif ( CDH_Message == 1 )
				   Messagebox "Un bateau part du port"

				   set CDH_Message to 0

			 elseif ( fin == 0 )
					   SetatStart

					   set fin to 1

			 endif
		  
	 endif

set localdaysPassed to 0

set timer to 0 

set fin to 0

endif
	   
end CDH_bateau_Mar_01

Dallara
Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#36 elendell

elendell

    Mécano Dell'Arte


Posté 22 août 2009 - 06:21

Bonjour Dallara,

Il faut que tu t'efforces de penser comme le jeu. A chaque frame, il lit les instructions et vérifie les conditions les unes après les autres en partant du haut vers le bas.

Quand les conditions "jour 4" et "heure >=13" sont vraies, il continue en vérifiant  le "if" de ton premier bloc "if/elseif/elseif". Tant que le timer est <75.597, cette condition est vraie. Il ne vérifie donc pas les "elseif" qui suivent puisqu'il en a trouvé une du bloc qui est vraie.
Quand cette condition ne sera plus vraie parce que le timer sera >=75.597, il vérifiera la suivante. Le problème est que lorsque le timer sera >=75.597, le "elseif" qui suit ne pourra pas être vrai non plus car 3.23, c'est plus petit que 75.597 et que tel que tu l'as écrit il ne vérifiera les "elseif" qui suivent le "if" que si le timer est plus grand ou égal à 75.597.

A partir de 75.597, le "if" n'est plus vrai, il passe donc au premier "elseif". Le premier "elseif" n'étant pas vrai non plus, il passe donc au deuxième "elseif". "CDH_Message" étant encore à 0, le deuxième "elseif" est vrai et il lance la MB. A la frame suivante, aucune des 3 conditions ne sera vraie puisque "CDH_Message" sera passée à 1, que le timer sera plus grand que 75.597 et à plus forte raison que 3.23. Il ne fera donc plus rien le 4ème jour.

Pour que ça fonctionne, il faut donc que tu intervertisses tes 2 conditions de timer en mettant la plus petite au dessus de la plus grande. Le "elseif" de la MB peut et doit rester en 3ème position pour n'être lancée que lorsque les conditions de timer seront toutes les deux fausses. Essaye-le.

Note au passage que si tu vérifies des conditions de valeurs différentes pour une même variable avec "<", il faut que tu places la condition la plus petite au-dessus mais si tu vérifiais ces mêmes conditions avec ">", il faudrait faire l'inverse.

Le 5ème jour, ton "if" vérifie si le timer est plus petit que 6. Ce n'est pas le cas car ton timer est toujours plus grand ou égal à 75.597.
Tu as donc deux solutions. Soit tu remets ton timer à 0 avant le 5ème jour (la meilleure), soit tu utilises un deuxième timer (avec un autre nom). Mais dans les deux cas, il faut aussi une instruction qui fasse avancer ton timer (ou ton timer2). L'instruction "set timer to ( timer + GetSecondsPassed )" ne peut plus fonctionner le 5ème jour puisqu'elle est dans le bloc du 4ème jour.

Le "elseif ( CDH_Message == 1 )" devrait fonctionner une fois le 5ème jour (sauf si l'heure n'est pas bonne). Par contre, le "elseif" du "SetAtStart" ne peut pas fonctionner.

Lors de la première frame du 5ème jour, il vérifie l'heure puis, si l'heure est bonne, les conditions "if/elseif/elseif". Dès qu'il en trouve une de juste (la MB), il passe à la suite de ce qui doit se passer le 5ème jour. Dans cette suite, tu marques ceci : "set localdaysPassed to 0".

Donc il finit cette première frame du 5ème jour en remettant les jours à 0. A la frame suivante, il ne pourra plus lancer le "SetAtStart" puisque cette instruction est prévue pour se faire le 5ème jour mais que tu as remis le compteur des jours à 0.

Ces 3 instructions doivent être dans une condition pour qu'elle ne se fassent pas dès la première frame du 5ème jour :

set localdaysPassed to 0
set timer to 0
set fin to 0

Elles ne doivent être lancées qu'à la fin du 5ème jour. Il suffit de les changer de place. Essaie de corriger tout ça.  ;)


PS : Profites-en pour faire aussi ça, dont tu as oublié de tenir compte :

if ( localdaysPassed == 4 )
.....
elseif ( localdaysPassed == 5 )
.....
endif

#37 Dallara

Dallara

    Fortificateur fortiche


Posté 22 août 2009 - 10:57

Bonjour elendell.

Tout les mouvements se font dans le bon ordre et pratiquement comme je veux (changer les données de timer)

Mais je pense que le fait que se soit un script local commence a se faire sentir parce que le trajet l'oblige a passer dans trois cell le premier jour et dans au moins 4 le deuxième jour.
Mais quand je suis le bateau, au moment de passer dans la troisième cell, il disparait.
je pense qu'il va falloir le mettre en script global...

Comment ?

Dallara
Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#38 elendell

elendell

    Mécano Dell'Arte


Posté 22 août 2009 - 13:15

Voir le messageDallara, le 22.08.2009 à 11:56, dit :

Mais je pense que le fait que se soit un script local commence a se faire sentir parce que le trajet l'oblige a passer dans trois cell le premier jour et dans au moins 4 le deuxième jour.
Mais quand je suis le bateau, au moment de passer dans la troisième cell, il disparait.
Heu... Tu n'avais jamais parlé de le faire voyager sur plusieurs cellules. C'est beaucoup plus compliqué car il n'est pas possible de faire bouger un objet sur de longues distances. Comme tu l'as constaté, il disparait et ce n'est pas de le passer en script global qui peut résoudre ce problème.

L'astuce est de de relever les coordonnées quand il change de cellule, d'en replacer un nouveau au même endroit et de supprimer l'ancien (même s'il est devenu invisible, il faut le supprimer). Si tu peux l'éviter, évite-le car ce n'est pas simple à faire pour un débutant en scripts. Sur 2 cellules (celle de départ et une de plus), ça va avec juste un script local. Au delà, il te faudrait effectivement un global mais quand même toujours un local en plus.

Ce sujet est traité pages 155 et 156 du MSfD8 mais personnellement, je n'ai pas pu utiliser leurs scripts d'exemple avec 100% de réussite et quand j'utilisais le tapis volant en tant que joueur, il disparaissait aussi quelquefois, alors qu'il utilise ce système. J'ai donc dû pour mon bateau trouver un système plus performant bien qu'il soit basé sur la même astuce de créer un nouveau bateau à chaque changement de cellule.

Dans le cas de ton bateau, ce serait sans doute plus facile car tu sais par avance à quel endroit il doit passer mais t'enseigner comment le faire dans le détail risquerait d'être assez long. Je te proposes pour l'instant de faire les déplacements sur 2 cellules avec ton script local et d'apprendre à résoudre tous les autres problèmes qui vont se poser. Quand tout fonctionnera, soit tu iras plus loin mais avec déjà plus d'expérience en scripts, soit je m'occuperai de faire le reste des déplacements.

Donc, ce que tu peux faire dans l'immédiat pour le déplacement du 5ème jour, c'est noter les coordonnées du dernier endroit avant le changement de cellule qui le fait passer dans la 3ème (et disparaitre). Pour ça, place-le à cet endroit dans le Tescs et regarde les coordonnées de l'objet placé. Ensuite, à la place du timer, il faut que mettes ces conditions de position (en utilisant "GetPos", voir MSfD). Tant que le bateau n'a pas atteint cette dernière position, le "move" et éventuellement le "rotate" continuent. Quand la position est atteinte, le bateau est "disable" et replacé avec SetAtStart dans sa position première, puis tu remets le jour à 0. Le bateau sera prêt pour le prochain 4ème jour mais invisible en attendant.

Pour le 4ème jour, tu dois d'abord noter la position xy que le bateau devra avoir au quai. tu commences par faire "enable" pour le rendre à nouveau visible et tu donnes les instructions qui l'amènent jusqu'au quai. A la place du timer, tu vérifies la position et quand il est dans la bonne position, tu arrêtes le "move" et le "rotate" mais tu ne fais pas "disable" ce coup-ci puisque au quai, il doit être visible.

Essaye déjà ça (remplacer les "timers" par des "GetPos x" + "GetPos y" et ajouter "disable" à la fin du trajet du 5ème jour + "enable" avant le trajet du 4ème jour).

Note : Pour savoir les positions exactes où le bateau doit s'arrêter dans les deux cas et les mettre en conditions dans le script, le plus simple sera sans doute de les relever en jeu avec la console parce que je présume que tu as établi tes valeurs de "move" et "rotate" par tâtonnements (clique sur le bateau et valide tour à tour : GetPos x et GetPos y).

Bon courage !  :)

#39 Dallara

Dallara

    Fortificateur fortiche


Posté 23 août 2009 - 21:40

Bonsoir,

j'ai trouver une sollution ou il ne passe que ceux cell et qui marche parfaitement.

enfaite il y aurait deux bateau un pour le premier jour ou il apparait tous les 4 jours, fais son trajet et dispariat au port directement remplacer par l'autre bateau qui ferait le reste du trajet.

les seuls problèmes que j'ai rencontrer c'est les NPc (équipage) qui déjà tombent pendant le trajet.

La collison disparait toujours a la fin.

les Enable/Disable ne fonctionne pas.

begin CDH_bateau_Mar_01

float   timer
Short localdaysPassed
Short currentDay
Short fin

if ( GetDisabled == 0 )
	 Disable
endif

if ( MenuMode == 1 )
	return
endif

if ( fin == 1 )

	  set fin to 0

endif

if ( currentDay != Day )
	 set localdaysPassed to localdaysPassed + 1
	 set currentDay to Day
endif

if ( localdaysPassed == 4 )


	   if ( GameHour >= 13 )

		 if ( GetDisabled == 1 )
			  Enable
		 endif

		 set timer to ( timer + GetSecondsPassed )
		 
		   if ( timer < 30 )
			   Move y, -155
		  

		   elseif ( timer < 32  ) 

			Rotate z, -0.098
			 Move y, -145

		   elseif ( timer < 35 )

			   Rotate z, -10
			   Move y, -140

		   elseif ( timer < 89 )

					Rotate z, -0.183
					Move y, -120

		   elseif ( CDH_Message == 0 )
				  Messagebox "Un bateau arrive au port"

				  set CDH_Message to 1 

		   elseif ( timer < 109 )

					   Rotate z, -2
					   Move y, -80
			
		   endif

	 endif
	  
			 elseif ( fin == 0 )
					   SetatStart

					   set fin to 1

			 elseif ( GetDisabled == 0 )
						 Disable

			 endif

	 endif

set localdaysPassed to 0
set timer to 0 
set fin to 0

endif
	   
end CDH_bateau_Mar_01

la je n'ai mis que le premier script (celui du premier jour)

Dallara
Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#40 elendell

elendell

    Mécano Dell'Arte


Posté 25 août 2009 - 19:27

Bonjour Dallara,

Ton script comporte des erreurs de structure. Pour les voir plus facilement, tu dois faire une meilleure mise en page. Utilise la tabulation pour que toutes les instructions d'un bloc soient bien alignées et ne mets des lignes vierges que pour séparer des blocs et mieux les distinguer. Là, j'ai du mal à le lire et à voir les erreurs mais après avoir refait sa mise en page dans le Tescs, elles m'ont de suite sauté aux yeux : Il y a 2 "endif" en trop. Il y a aussi un espace en trop dans la déclaration de la variable "timer".

Spoiler

Note : Tu peux essayer d'utiliser Le "Débugueur De Scripts" qui signale ce genre d'erreur mais je ne sais pas s'il fonctionne avec Windows 7.

A part ça, ce serait beaucoup plus facile pour moi de t'aider si j'avais ton "esp" car sinon, je dois te poser des tas de questions et risque de passer à côté d'un élément déterminant. Peux-tu le mettre quelque part et m'envoyer le lien par MP ? (Note : Nous continuerions quand même cet échange sur ce sujet pour que ça puisse profiter à d'éventuels lecteurs mais je saisirais plus facilement les bugs au fur et à mesure).

#41 Dallara

Dallara

    Fortificateur fortiche


Posté 27 août 2009 - 17:56

Bonjour elendell

J'ai un petit soucis c'est que maintenant le bateau ne réapparait pas.


j'ai enlever les deux endif en trop comme tu me le disait

Spoiler


Dallara
Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#42 elendell

elendell

    Mécano Dell'Arte


Posté 28 août 2009 - 02:34

Bonjour Dallara,

Tout d'abord, c'est très bien d'avoir mis ton script en "spoiler" car ça prend moins de place mais les "spoilers" ne conservent pas la mise en page et les tabulations. Il faut donc que tu le mettes d'abord entre balises de "code" et que tu mettes ensuite le tout dans un "spoiler". (Regarde le "spoiler" de mon précédent message).

Ensuite, pour les collisions :

Le problème est que Morrowind gère très mal les collisions des objets. Les seules qui fonctionnent correctement sont celles des PNJs et des créatures. Les données de collision de ton bateau disparaissent au changement de cellule ; c'est ce qui fait que les PNJs passent à travers en cours de route et qu'au final, le bateau n'a plus de collision. On pourrait en faire une créature mais dans ce cas, tu ne pourrais plus mettre de PNJs dessus.

Pour que je puisse te proposer une solution qui tienne la route et pas trop dure à mettre en œuvre, il faudra que tu patientes car je dois faire des essais. Mais si quelqu'un d'autre à une solution à proposer en attendant, qu'il ou elle n'hésite pas à la dire.

Le problème à résoudre est que le PJ n'est pas sur le bateau. Si c'était le cas, il suffirait de faire comme je fais avec mon voilier. C'est à dire, quand "CellChanged" renvoie 1 (à chaque changement de cellule), on remplace le bateau par un autre. Mais "CellChanged" indique uniquement si le PJ change de cellule et pas si c'est le bateau sans le PJ.

Je vois deux pistes à suivre :

La première serait de faire le changement de bateau à une position très précise, étant donné que tu connais la route que suit le bateau. Dans ce cas, on n'aurait plus besoin de détecter le changement de cellule. Mais il faudrait vérifier que la perte de collision se fait bien toujours exactement au même endroit. Si tu pouvais vérifier ça, ce sera déjà une bonne chose de faite.
Pour voir ça, tu peux ajouter une MB dans ton script, qui indique les positions x et y du bateau au fur et à mesure du trajet, pour voir si les PNJs tombent toujours exactement au même moment du déplacement :

Spoiler

La deuxième serait de "scripter" les PNjs pour qu'ils restent toujours à la même hauteur et bougent en même temps que le bateau. Dans ce cas, peu importe que le bateau n'ait plus de collision puisque les PNJs ne seraient plus portés par lui mais par script avec "SetPos". Une fois arrivé au port, le bateau serait remplacé et retrouverait sa collision. Les PNJs quand à eux retrouveraient leur liberté de mouvement sur un objet de nouveau solide.

Mais cette solution implique d'autres difficultés :

- Les fonctions de déplacement comme "move" et "rotate" ne fonctionnent pas avec les PNJs. Il ne sert donc à rien de leur donner le même script que celui du bateau (comme tu l'as fait). Les détecteurs de collision de mon voilier sont des créatures et elles suivent exactement le déplacement du bateau grâce à "SetPos" et une astuce pour les faire tourner. Mais ces créatures sont paralysées et invisibles, ce qui nous amène à une autre difficulté, ci-dessous.

- Même si tu fais un "SetPos z" à chaque frame dans le script d'un PNJ, il ne restera pas à la bonne hauteur et suivra le bateau à la nage.
Il faut soit le paralyser (mais je crois que ça se voit), soit lui donner la faculté de voler pour qu'il reste en l'air sans tomber dans l'eau.
Ou bien, il faut baisser la hauteur du bateau et donner aux PNJs la marche sur l'eau. Dans ce cas, plus besoin "SetPos z" car les PNJs resteraient toujours à la hauteur z-50 (celle de "marche sur l'eau").

Bref, comme tu le vois, faire naviguer un bateau en changeant de cellule et en plus avec des PNJs dessus est très compliqué. Si tu y tiens beaucoup (et que tu me laisses le temps), je ferai des recherches pour y parvenir mais je ne te cache pas que si tu peux te contenter de le faire naviguer dans une seule cellule (et de le faire ensuite disparaitre), ce serait beaucoup plus simple. C'est vrai que ce n'est pas génial de voir un bateau apparaitre ou disparaitre d'un coup mais après tout, c'est exactement ce que fait Bethesda (par exemple avec un bateau qui est dans une crique de Solstheim).

Dis-moi donc ce que tu penses de tout ça.


Voir le messageDallara, le 27.08.2009 à 18:55, dit :

J'ai un petit soucis c'est que maintenant le bateau ne réapparait pas.
Il ne peut pas apparaitre car tu as laissé "set localdaysPassed to 0" sans condition (en fin de script). A chaque frame, cette variable est remise à 0 et elle ne peut donc jamais être à 4, qui est la condition principale pour que le bateau apparaisse et fasse son trajet.

PS : Je n'ai pas installé ton mod (juste l'esp et le meshe du bateau) car il contient énormément de fichiers placés en vrac et dans des emplacements qui ne devraient pas être. C'est bien sûr une version de travail mais dans la mesure où tu as mis ton "mod" en test provisoire avec un lien pour le télécharger dans son sujet, il faudrait que tu commences avant tout par faire le ménage dans les fichiers qu'il installe n'importe comment (et beaucoup d'inutiles), dans le data file de ceux qui prennent la peine de le tester.  ;)

#43 Dallara

Dallara

    Fortificateur fortiche


Posté 01 septembre 2009 - 10:39

Bonjour elendell

Voir le messageelendell, le 28.08.2009 à 03:33, dit :

La première serait de faire le changement de bateau à une position très précise, étant donné que tu connais la route que suit le bateau. Dans ce cas, on n'aurait plus besoin de détecter le changement de cellule. Mais il faudrait vérifier que la perte de collision se fait bien toujours exactement au même endroit. Si tu pouvais vérifier ça, ce sera déjà une bonne chose de faite.
Pour voir ça, tu peux ajouter une MB dans ton script, qui indique les positions x et y du bateau au fur et à mesure du trajet, pour voir si les PNJs tombent toujours exactement au même moment du déplacement :

Alors effectivement a chaque changement de cellule les PNJs se font mettre en bas du bateau et la encore sa dépend:
des fois (si les PNJs sont encore sur le bateau ils se retrouvent au fond sous l'eau ou des fois (si ils sont "tombés" en cours de route ils ne bouge pas.
Enfaite quand le bateau navigue les PNJs tombent les uns après les autres mais tout en restant dans le bateau (dans sa collision) donc dans la coque.

Cela te répond surement à la question de savoir si ils tombent toujours au même endroit: non

Par contre il garde sa collision tout le long se n'est que dès qu'il s'arrête qu'il perde sa collision.

Du coup je pense que la meilleur solution est la deuxième.
Quand a savoir de quel manière ?

je pense que la meilleur est celle de marche sur l'eau.

PS: je t'avait tout envoyer pour t'éviter les chargements de meshs pas présent etc.

EDIT: j'avais mis le script sur les PNJs juste pour qu'ils apparaissent que quand il y a un bateau dessous.
    
Dallara

Modifié par Dallara, 01 septembre 2009 - 10:40.

Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#44 elendell

elendell

    Mécano Dell'Arte


Posté 01 septembre 2009 - 14:47

Bonjour Dallara,

Alors je te ferai les scripts des PNJs car ce sera plus rapide que d'expliquer comment les faire. Patiente un peu, je n'oublierai pas.

En attendant, tu peux déjà baisser la hauteur du bateau (si nécessaire) pour qu'il ne soit pas visible que les PNJs sont à "Z-0.5", qui est la hauteur de "marche sur l'eau". Note qu'il faudra peut-être remplacer le bateau/activateur par un bateau/Misc mais je n'en suis pas sûr. On verra donc si c'est nécessaire par la suite.

EDIT : Après réflexion, ce sera peut-être mieux de leur donner la lévitation plutôt que la marche sur l'eau. Ne touche pas au bateau pour l'instant, je te dirai ça après essais.

#45 abg

abg

    L'ABG pour les civilisés


Posté 01 septembre 2009 - 16:01

Voir le messageelendell, le 01.09.2009 à 15:46, dit :

EDIT : Après réflexion, ce sera peut-être mieux de leur donner la lévitation plutôt que la marche sur l'eau.

Et puis veiller à les fixer par script ou simplement par un lest dans l'inventaire... Parce que si un joueur "farceur" tire une flèche ou autre au milieu de cette belle équipe, ça va donner un spectacle intéressant sous la forme d'une gerbe de marins lévitants qui quittent leur navire pour aller corriger le malappris  :mosc:
En dépit d'une légende tenace les acteurs de Morrowind savent gérer la lévitation (déplacement dans l'axe Z), du moins quand ils sont en mode combat...
Antoninus Bibulus Glaber
Coaching de PNJs chez Morrowind Renaissance

#46 Dallara

Dallara

    Fortificateur fortiche


Posté 01 septembre 2009 - 16:32

Merci beaucoup elendell pour tout se que tu fais pour moi.
Je serai patient

Dallara

Modifié par Dallara, 01 septembre 2009 - 16:33.

Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#47 elendell

elendell

    Mécano Dell'Arte


Posté 23 septembre 2009 - 05:34

Bonjour Dallara,

J'ai travaillé plusieurs jours sur tes scripts et ce n'est pas une mince affaire. J'ai essayé des tas de solutions différentes dont certaines avec succès mais il y a toujours un point qui ne va pas. Je ne vais pas entrer dans les détails car j'ai trouvé des tas de particularités aux fonctions de Morrowind que je ne soupçonnais même pas. Je pense que je parviendrai à régler tous les points de détails en faisant un mixage des différentes solutions mais je suis sans arrêt confronté à un problème qu'il faudrait avant tout arranger : le meshe du bateau.

Il a plusieurs défauts et comme je ne suis que débutant avec Blender, je ne saurais pas les corriger moi-même facilement. Il faudrait donc que tu t'en occupes pour que je puisse finir les scripts. Les points à corriger sont les suivants :

- l'axe y est inversé. La proue est à la place de la poupe et pour le faire avancer, il faut lui dire de reculer. Mais le plus embêtant est pour faire en sorte que les PNJs soient tournés vers l'avant.

- Le pont n'est pas parfaitement horizontal. Le bateau est incliné sur l'axe x et il me semble l'être également sur l'axe y. Le système qui fonctionne le mieux est de placer un bateau-misc quand il navigue et un bateau-activateur à l'arrêt. Avec le misc, quand un marin a les pieds sur le pont, celui qui est à l'autre bout est enfoncé jusqu'en haut des chevilles.

- Les planches qui traversent le pont ne vont pas. Elles correspondent sans doute à ce que tu voulais esthétiquement mais elles surélèvent la collision du pont. Ça crée plusieurs problèmes. Soit les PNJs se retrouvent à l'intérieur du meshe (ce qui cause des difficultés pour gérer la collision), soit ils se retrouvent bien au dessus. Et comme l'espace entre les planches est étroit, ils ne peuvent pas non plus toucher le pont entre les planches. Ils donnent donc l'impression de léviter et pas d'être sur le pont. En dehors de ce problème technique, je dois dire que ces planches en travers me semblent totalement illogiques car il est impossible de circuler sur un pont (et de manœuvrer une voile) avec des planches en travers qu'il faudrait sans arrêt enjamber.

- Les faux conteneurs qui sont sur le pont ont des volumes non texturés qui les dépassent et dont certains sortent du bateau. Je ne sais pas si ces volumes sont là pour faire collision mais j'ai essayé de les supprimer avec Blender et sans eux, la collision des faux conteneurs fonctionne parfaitement. Ils me semblent donc inutiles.

- Dans la mesure où le meshe est à corriger, tu peux en profiter pour changer la hauteur z du bateau, de telle sorte que le pont soit juste au dessus de 0. De cette manière, il ne sera pas nécessaire de le placer à plus de z 60 comme c'est actuellement le cas.

Je conserve donc ce que j'ai fait pour m'en servir de base mais j'attends que tu m'envoies un nouveau meshe pour pouvoir finaliser ces scripts. Essaye si possible de le faire tant que j'ai tout ça en mémoire (en vieillissant, on oublie vite  :banderilles:).

PS : Ne t'inquiète pas pour mon temps passé sur tes scripts car j'ai appris plein de choses qui me serviront, notamment pour "Vie Maritime", et en les postant ici, il pourront également servir à d'autres.




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

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