JeuWeb - Crée ton jeu par navigateur
Gestion d'un système temporel différent dans le jeu - 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 : Gestion d'un système temporel différent dans le jeu (/showthread.php?tid=2138)

Pages : 1 2


RE: Gestion d'un système temporel différent dans le jeu - Roworll - 13-12-2007

Pour les dates extrêmes, tu peux encapsuler la fonction strftime dans une fonction qui va te permettre de mapper les années hors limites vers celles supportées par la fonction.

Petit exemple de fonction
Code PHP :
<?php 
function strftime_ext($format = "", $timestamp = false){
if (
$timestamp >= 0 && $timestamp <= 2147480047){
// between 1 Jan 1970 00:00:00 and 19 Jan 2038 03:14:07 GMT
return strftime ($format, $timestamp);
}

$mappings = Array (
Array (
"start" => 1902, "end" => 1951, "map" => 1986), // 1902-1951 = 1986-2035
Array ("start" => 1952, "end" => 1969, "map" => 1980), // 1952-1969 = 1980-1997
Array ("start" => 2038, "end" => 2091, "map" => 1982), // 2038-2091 = 1982-2035
//add additional mapping here
);

if (
$timestamp < 0) {
$year = 1969;
while (
$timestamp < 0){
$days = ($year % 4 == 0 && ($year % 100 > 0 || $year % 400 == 0)) ? 366 : 365;
$timestamp += $days * 86400;
$year--;
}
} else {
// if ($timestamp > 2147480047)
$year = 2038;
while (
$timestamp > 0){
$days = ($year % 4 == 0 && ($year % 100 > 0 || $year % 400 == 0)) ? 366 : 365;
$timestamp -= $days * 86400;
$year++;
}
}

foreach (
$mappings as $mapping) {
if (
$year >= $mapping["start"] && $year <= $mapping["end"]) {
$find = Array ("%y", "%Y", "%D");
$replace = Array (substr ($year, -2), $year, "%m/%d/" . substr ($year, -2));
$format =& str_replace ($find, $replace, $format);
$map_from_1970 = mktime (0, 0, 0, 1, 1, $mapping["map"]);
return
strftime ($format, $timestamp + $map_from_1970);
}
}

return
"strftime (): Year not mapped yet: " . $year;
}

Et voila comment revenir à la prog...


RE: Gestion d'un système temporel différent dans le jeu - Plume - 13-12-2007

J'ai compris le gros. J'voudrais quand même que tu m'expliques le mapping. Pour ce qui est du foreach, j'réfléchit encore Smile

Lex.


RE: Gestion d'un système temporel différent dans le jeu - Roworll - 13-12-2007

Le mapping permet simplement de repérer les plages de dates non supportés par la fonction et de leur donner un offset utilisé pour le calcul.

Par exemple,
Array ("start" => 2038, "end" => 2091, "map" => 1982)
Signifie que les années allant de 2038 a 2091 (habituellement non supportées par la fonction) peuvent être mappées sur 1982.

L'organisation des jours de 1982 est la même que ceux de 2038
L'organisation des jours de 1983 est la même que ceux de 2039
L'organisation des jours de 1984 est la même que ceux de 2040
etc

Après, tu appliques juste des offsets pour les calculs.

En rajoutant des plages de date dans $mapping, tu peux continuer à utiliser strftime même pour des dates bien au delà de 2038


RE: Gestion d'un système temporel différent dans le jeu - NicoMSEvent - 13-12-2007

et pourquoi pas, point de vue concept, initialiser un timestamp a zero par personnage (ce qui serait le nombre de seconde depuis sa "naissance"). Tu aurais rapidement son age. Pour le temps qui passe, garde le timestamp actuel, avec comme précisé auparavant, une regle de trois pour que le temps passe en accéléré.

Ce ne sont que de simple suggestion, et quelques pistes. Loin de moi l'envie d'imposer quoique ce soit Wink


RE: Gestion d'un système temporel différent dans le jeu - Byleth - 13-12-2007

Tu prends le système Sims 2 tout simplement : les personnages ont une vie plus condensée tel un épémère pour qui une vie entière dure 1 journée ^^

Non mais ce que tu peux faire c'est juste virer l'année de la date que tu affiches, de cette manière tes mois tournent à blanc pour les joueurs mais les années s'empileront et donneront une impression d'ancrage dans le temps forte tout en éliminant le problème des années en 2098...
ça fera un an de plus point barre.

Tu peux éventuellement créer un système d'année propre au jeu et un an 0 de ton ère qui ne veut finalement rien dire par rapport à la notre mais qui symbolise juste le temps depuis lequel le jeu tourne et permettra tout de même de calculer des âges par rapoort à la date actuelle.


RE: Gestion d'un système temporel différent dans le jeu - shlikah - 13-12-2007

Merci pour tous ces conseils et toutes ces idées ! Smile
Je vais bosser dessus plus sérieusement demain... tempete de cervelet prévue ! Wink

J'avais pas pensé à déconnecter totalement le défilement du temps de notre propre appréhension humaine de celui ci ! J'pense que j'vais plutôt me diriger vers cette éventualité, ça résoud pas mal de probleme tout en n'en créant pas (enfin, à mes yeux, pour l'instant !)

Encore merci Smile

J'viendrais éditer mon titre dès que ce sera vraiment réglé, et j'vais regarder de plus près ta proposition de mapping des dates, Roworll, paske ça me semble plutôt pratique aussi...


RE: Gestion d'un système temporel différent dans le jeu - Woyard - 18-12-2007

Roworll a écrit :Accessoirement, tu peux inventer ton propre système pour le décompte du temps.
Des semaines de 6 jours, 5 semaines par mois et 10 mois par année par exemple.
Un poil plus compliqué mais ça règle ton soucis de timestamp.

C'est justement ce système temporel que je cherche à installer. Compliqué mais intéressant. Ça n'as pas de rapport avec timestamp je suppose ? Car je ne vois pas du tout comment on peut faire ça.


RE: Gestion d'un système temporel différent dans le jeu - Roworll - 19-12-2007

Ca dépends comment fonctionne ton système.
Si c'est du tour par tour, c'est ultra simple.
A chaque tour, ton compteur de temps dans ton système personnel s'incrémente d'une valeur fixe.

Si c'est du temps réel, ça devient un poil plus compliqué.
Tu dois définir deux valeurs.
La première est la date de référence à partir de laquelle le décompte du temps dans ton système va se faire. Il suffit de la choisir arbitrairement en disant par exemple que le 01/01/2007 de notre temps correspond au 01/01/1300 de ton jeu.
Ensuite, tu dois choisir à quelle vitesse le temps s'écoule dans ton système. Est-ce qu'1 heure correspond à 1 jour, 1 mois, 1 an ? A toi de voir.
Le reste est un simple calcul à appliquer sur les timestamp

Je repars de mon exemple
6 jours, 5 semaines par mois et 10 mois par an.
Je décide que le temps dans mon jeu commence à s'écouler à partir du 01/06/2007
Cela correspond à la date du 01/01/2500 chez moi.
L'écoulement du temps se fait à raison de 1 heure IRL = 1 jour IG

le 01/06/2007 correspond au timestamp de 1180648800
Supposons que nous soyons le 02/12/2007 à 09:00 du matin.
Le timestamp correspondant est 1196582400
La différence (temps écoulé totale IG) est de 15933600 secondes IRL
Cela correspond à 15933600 /3600 = 4426 heures = 4426 jours IG

Avec une petite fonction appropriée pour découper cette information correctement, je sais qu'il s'est donc écoulé dans mon jeu 14 ans, 7 mois et 16 jours

Nous sommes le 16e jours du 7e mois 2514 dans le jeu


RE: Gestion d'un système temporel différent dans le jeu - Woyard - 19-12-2007

Je te remercie d'avoir éclairé ma lanterne Roworll. Wink