JeuWeb - Crée ton jeu par navigateur
Accélération du temps - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Accélération du temps (/showthread.php?tid=7830)



Accélération du temps - xanthius - 08-07-2017

Bonjour,
j'ai dans l'optique d'offrir à mes joueurs une seconde variante d'Air Carrier, une version plus speed. J'entend par là un environnement de jeu où 1heure du jeu représenterait 1minute IRL.
Je suis assez perdu niveau de la réalisation. Comment faire, procéder pour réaliser une telle chose ?
Vous auriez des pistes ? Nous utilisons les heures php et parfois Mysql.
Merci.


RE: Accélération du temps - Xenos - 08-07-2017

Salut,
il te faut établir 2 lignes de temps dans ta conception: une qui est le temps de jeu, et sur laquelle tu base tous tes calculs de jeu, et une autre sur le temps réel. Tu n'auras alors plus qu'à établir la relation entre les deux échelles de temps, ici "TempsJeu = 60*(TempsRéel - TempsRéelInitial) + TempsJeuInitial".

Coté réalisation, cela signifie le remplacement de toutes les dates réelles par un "timestamp dans la timeline du jeu" (UNSIGNED INT), qui démarre à la même origine que le timestamp réel (plus simple dans le calcul car cela revient à dire TempsRéelInitial = TempsJeuInitial = 0) ou non (plus souple à l'usage). Ces dates seront donc dans le "calendrier du jeu", que tu pourras convertir en temps réel si besoin.

Pour l'avancement du temps, même principe: connaissant NOW (le temps réel actuel), tu appliques la relation de calcul inverse pour trouver le temps de jeu correspondant, et tu l'utilises dans tes formules de jeu.


Toutefois, pour un moindre impact sur l'existant (vu que tu as déjà de l'existant), il peut être plus rentable de faire le contraire: tu conserves ta façon actuelle de stocker les dates et timestamp (donc, tu continues à stocker du timestamp réel et des dates réelles), mais avant leur utilisation dans tes formules de jeu (ou avant leur affichage à l'écran), tu les convertis en "dates de jeu", via la simple formule "DateDeJeu = 60*(DateStockéeRéelle - DateRéelleInitiale) + DateDeJeuInitiale".
>> A y réfléchir, cela me semble en fait le plus simple et efficace, et c'est d'ailleurs ce que j'avais fait sur Isometry


RE: Accélération du temps - xanthius - 09-07-2017

Bonjour,
dans le cas de la deuxième méthode.
Comment faire pour accélérer le temps * 7, 8 etc ?
C'est assez flou pour moi. La variable : DateDeJeuInitiale est la variable créée initialement, c'est à dire une date formaté selon ce qu'on désire genre : 2017-10-23 ? Mais après on part de cette date mais l'accélération se trouve où ?
Je ne vois pas vraiment comment bien formuler ma question à vrai dire ..


RE: Accélération du temps - Ter Rowan - 09-07-2017

sans les vrais instructions de programmation :

les productions (consommation, tmps de production, etc...) tu fais comme avant * x (x ton facteur d'accélération)

l'affichage du temps (que l'affichage, le mieux est de garder dans les systèmes les vraies dates)

date affichée (maintenant) = date_debut_qui_bouge_pas + (date_maintenant_en_vrai - date_debut_qui_bouge_pas) * x (x ton facteur d'accélération)

évidemment si tu modifies x a un moment donné, il va te falloir faire un effet "pause" ou turéinitialises tout :

date_debut_qui_bouge_pas devient la date ou tu décides de modifier x, et avec les productions sauvegardées juste avant le changement du x


RE: Accélération du temps - Xenos - 09-07-2017

Tu ne touches pas aux formules du jeu, mais uniquement à l'unité de temps: partout où le temps réel apparait, tu le convertis en temps de jeu. Dans cette conversion, tu placeras ton accélération (*7 ou *8).

Par exemple, supposons que ta formule actuelle soit:
RessourcesMaintenant = RessourcesAvant + ProductionHoraire * (DateRéelle - DatePrécédenteProduction)

Tu remplaces toutes les dates réelles par la date de jeu:
RessourcesMaintenant = RessourcesAvant + ProductionParHeureDeJeu * (DateRéelle_ConvertieEnDateJeu - DatePrécédenteProduction_ConvertieEnDateJeu)

Ta ProductionParHeureDeJeu est égale à la ProductionHoraire, autrement dit, tu ne touches pas aux données du jeu actuel. Tout ce qu'il te faut maintenant c'est poser la fonction F convertissant la date réelle en date de jeu:
RessourcesMaintenant = RessourcesAvant + ProductionParHeureDeJeu * (F(DateRéelle) - F(DatePrécédenteProduction))
Avec, par exemple, F(Tréel) = 60*(Tréel - Tréel0) + Tjeu0 pour avoir "1 minute réelle = 1 heure dans le jeu", et la correspondance "2017-07-09 (date réelle) → 2000-01-01 (date de jeu de départ)". En d'autres mots, la date du 1er Janvier 2000 dans le jeu correspondra à la date d'aujourd'hui.

D'où
F(Tréel) = 60*(Tréel - 2017-07-09) + 2000-01-01
RessourcesMaintenant = RessourcesAvant + ProductionParHeureDeJeu * (F(DateRéelle) - F(DatePrécédenteProduction))
On pourrait simplifier, mais franchement, c'est mal venu: la fonction de calcul matchant la date in game et la date réelle ne pourrait alors pas être complexifée. Par exemple, si tu veux un jour accélérer ou ralentir le temps, alors il faudra altérer cette fonction F(), tout en t'assurant de ne pas créer des "sautes de temps" ou des "retours vers le passé".

Note enfin que les calculs avec des dates littérales comme cela peuvent être chiant à mener: tu peux faire exactement pareil avec des timestamp, qui auront l'avantage d'être juste de bêtes entiers (ou réels), plus simples à manipuler.


RE: Accélération du temps - Ter Rowan - 10-07-2017

ah tiens je l avais pas vu comme ca


RE: Accélération du temps - Xenos - 10-07-2017

Ouep: modifier les valeurs de production et tout, c'est une autre idée, mais cela a beaucoup d'impact partout (production, consommation, stocks, dates, temps de transport, d'embarquement, de débarquement, de recherche, etc). C'est facile d'en oublier ou d'en faire en trop (commerce, combats, diplomaties etc peuvent ne pas être impactés).

J'ai eu ce genre de question sur la v0 d'Eclerd (qui a été passée de x100 à x500 je crois... ou l'inverse... bref, j'ai tatônné sur la vitesse de jeu) et modifier fonction de la ligne de temps est la solution la plus simple et efficace. Je me suis aussi mangé les décalages temporels, donc, je peux prévenir d'y faire gaffe Smile

Exemple:
Eclerd démarre en 2000-01-01 dans le jeu, pour une date IRL de 2015-01-01. Le jeu est en x365 (pour calculer facilement l'exemple).
→ Ma fonction est donc: DateJeu = F(DateRéelle) avec F(X) = 365 * (X - "2015-01-01") + "2000-01-01"
→ On vérifie la valeur de F("2015-01-01"): 365 * ("2015-01-01" - "2015-01-01") + "2000-01-01", donc on a bien F("2015-01-01") = "2000-01-01"

10 jours IRL plus tard, ECLERD est donc le 2010-01-01 (et on est IRL le 2015-01-11).
F("2015-01-11"): 365 * ("2015-01-11" - "2015-01-01") + "2000-01-01" = "2010-01-01"

Je décide d'accélérer le jeu. Je passe en x730 (1 jour IRL = 2 ans de jeu). Si je n'y prends pas garde, et que je change juste le "365" par "730", alors on aura:
F("2015-01-11"): 730 * ("2015-01-11" - "2015-01-01") + "2000-01-01" = "2020-01-01"

On a fait un bond en avant de 10 ans ! Logique en fait: on a modifié la vitesse du temps "dans le passé": les 10 jours IRL passés valaient 10 ans IG, et en valent maintenant 20.
Sur ECLERD, cela s'est traduit par un énorme "trou" dans les pyramides des ages (vu qu'il y a eu un bond de 10 ans dans le temps, aucune naissance n'a eu lieue sur cette décennie).

Pour éviter cela, il suffit de "ré-ancrer" sa fonction F à la date de changement de vitesse:
→ Ma fonction devient donc: DateJeu = G(DateRéelle) avec G(X) = 730 * (X - "2015-01-11") + "2010-01-01" (plus généralement, G(X) = 730 * (X - DateRéelleChangementVitesse) + F(DateRéelleChangementVitesse)
→ On vérifie alors G("2015-01-11"): 730 * ("2015-01-11" - "2015-01-11") + "2010-01-01" = "2010-01-01" On n'a pas bondit dans le temps.


Les mêmes formules s'appliquent si tu ralentis le jeu.

Note que rien n'oblige le temps à être linéaire! Je serai franchement intéressé de voir comment un jeu à temps quadratique évolue (ie: où F(X) = 10 * (X - "2017-07-10")² + 2000-01-01).