[Resolu] Calcul de distance / temps bancal

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
ole
Messages : 68
Inscription : 31 Mai 2014 20:09

[Resolu] Calcul de distance / temps bancal

Message par ole » 01 Août 2015 15:52

Bonjour à tous :)

J'ai un petit soucis de math :oops: ...

Je fais un cycle jour/nuit , saison , météo,...

Pour cela, je compte les heures IG qui passent par rapport aux temps IRL.
J'ai donc dans mon Update()

Code : Tout sélectionner

time += Time.deltaTime;
		if (time >= refresh_heure) // refresh_heure est le temps qui doit s'écouler IRL pour qu'une heure soit passée dans le jeu
		{
		time = 0;
		heure++;;
			print(heure);
		}
		if (heure >= 24) 
		{
			heure = 0;
			jour++;
		}
Jusqu'ici tout va bien :p
Ensuite j'ai commencé le cycle jour nuit ( qui se modifie avec les saisons mais c'est loin de marcher car le calcul de base est déjà bancal...)
pour savoir si je suis de jour ou de nuit, je fais avancer un soleil et une lune entre deux points.
chacun démarre de la gauche pour terminer à droite changer un flag et revenir à gauche pour boucler la séquence.
il me faut donc un calcul qui fasse avancer les deux proportionnellement au temps qui passe en sachant que la durée dépendra de la saison.
j'ai donc ce calcul :
58(la distance entre le point d'arrivée et le point de départ -28 / 30 )
/
17 (le nombre d'heure ou il fait jour)*refresh_heure(le nombre de seconde pour faire une heure)

voyez plutôt :

Code : Tout sélectionner

if (day == true) 
		{
			switch(saison)
			{
			case "ete":
				soleil.transform.Translate(Vector2.right* Time.deltaTime*58/(17*refresh_heure));
				break;
			case "printemps":
				soleil.transform.Translate(Vector2.right* Time.deltaTime*58/(13*refresh_heure));
				break;
			case "automne":
				soleil.transform.Translate(Vector2.right* Time.deltaTime*58/(13*refresh_heure));
				break;
			case "hiver":
				soleil.transform.Translate(Vector2.right* Time.deltaTime*58/(7*refresh_heure));
				break;
			}

			posxsoleil = soleil.transform.localPosition.x;
		}
		if (day == false) 
		{
			switch(saison)
			{
			case "ete":
				lune.transform.Translate(Vector2.right* Time.deltaTime*58/(7*refresh_heure));
				break;
			case "printemps":
				lune.transform.Translate(Vector2.right* Time.deltaTime*58/(11*refresh_heure));
				break;
			case "automne":
				lune.transform.Translate(Vector2.right* Time.deltaTime*58/(11*refresh_heure));
				break;
			case "hiver":
				lune.transform.Translate(Vector2.right* Time.deltaTime*58/(17*refresh_heure));
				break;
			}
			
			posxlune = lune.transform.localPosition.x;
		}
		if (posxsoleil >= 28) {
			day = false;
			soleil.transform.localPosition = new Vector2(-30,soleil.transform.localPosition.y);
			posxsoleil = -30;
		}
		if (posxlune >= 28) {
			day = true;
			lune.transform.localPosition = new Vector2(-30,lune.transform.localPosition.y);
			posxlune = -30;
		}
Tout ça marche plus ou moins mais c'est bancal :p... Le soleil n'arrive jamais exactement à la même heure donc la lune ne démarre pas à la même heure et au bout de quelques dizaines de cycles on se retrouve avec des trucs complètement à coté :p.
Je suppose que mon erreur vient d'une erreur de segmentation ou du delta occasionné par la latence ?
Est-ce qu'il serait possible de corriger ma formule ou il faut que je rajoute des bornes - if ( ce qui serait emmerdant vu que ma journée change avec la saison :/ ) ?

En tout vas merci de m'avoir lu :) en espérant avoir une solution avant de perdre mes derniers cheveux ^^
Dernière édition par ole le 04 Août 2015 12:37, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Calcule de distance / temps bancal

Message par boubouk50 » 03 Août 2015 10:25

J'ai pas bien pigé le lien avec l'heure IRL :0 . Tu veux initialiser ton projet avec l'heure IRL et ensuite passer les heures/jours/mois à une vitesse différente ou bien toujours garder l'heure IRL?
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

ole
Messages : 68
Inscription : 31 Mai 2014 20:09

Re: Calcule de distance / temps bancal

Message par ole » 03 Août 2015 18:06

Merci pour ta réponse ;-)
juste que le temps s'écoule différemment en vrai et dans le jeu quoi.
12 sec en vrai = 1h dans le jeu avec écoulement des jours, mois, saisons, années,... et surtout un cycle jour/nuit qui change suivant la saison ( en été les journées sont plus longue qu'en hiver :p ).

Jusque là tout va bien :) !

Après j'aimerais que pendant la journée un soleil traverse l'écran de part en part et pendant la nuit, une lune. ( Montrant la progression de la journée/nuit).

C'est là que commence le drame ^^ ! Y a un décalage entre le défilement du soleil/lune et le déroulement de ma journée lié à ma formule de calcule de déplacement je suppose :/... ( pour rappel : Vector2.right* Time.deltaTime*LaDistance/(NbreHeureDeJour*NbreSecPourFaireUneHeure) )

ou alors un problème de segmentation dans mon calcule de "LaDistance" ou de "NbreHeureDeJour/nuit"

Pour corriger le problème je fais actuellement déplacer le soleil d'heure en heure mais c'est carrément moins fluide et donc joli ...

Avatar de l’utilisateur
Yazza
Messages : 31
Inscription : 21 Avr 2015 10:45
Localisation : Paris

Re: Calcule de distance / temps bancal

Message par Yazza » 04 Août 2015 09:10

Salut !

J'ai rapidement lu le problème, excuse moi d'avance si je suis à côté de la plaque.

Pourquoi ne créerais tu pas une classe static "InGameTime" par exemple, qui aurait des fonctions du genre GetHours, GetMinutes, GetDay toutes basées sur Time.timeSinceLevelLoad et une valeur constante.
Tu peux meme créer une variable "offset" qui te permettrais de regler l'heure InGame lorsque Time.timeSinceLevelLoad = 0, pour que par exemple le joueur puisse reprendre de nuit ou de jours sa sauvegarde.
Tu pourras aussi utilisé SetHours (etc.) pour créer des ellipses/saute de temps dans ton jeu !

J'espère t'avoir donné de bonne idée et qu'elles vont dans ton sens !

Bisous
Je me contredis toujours, voire jamais.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Calcule de distance / temps bancal

Message par boubouk50 » 04 Août 2015 09:41

Ouais l'idée c'est de tout caler sur le même timing donc un temps global récupérable de partout par tous. Le code devra donc utiliser ce temps pour tout. Et surtout pas faire l'heure d'un coté par rapport au deltaTime et le déplacement du soleil par rapport à un calcul indépendant.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

ole
Messages : 68
Inscription : 31 Mai 2014 20:09

Re: Calcule de distance / temps bancal

Message par ole » 04 Août 2015 12:37

ça colle parfaitement en fait :p !
J'étais parti sur une variable statique qui s'incrémente au fur et à mesure mais
si je recalcule chaque fois le temps depuis le départ il sera forcément juste et le même partout :p.

C'est parti pour une class qui centralisera tous les timers :).

Merci Yazza et Boukouk50 :)

Répondre

Revenir vers « Scripting »