JeuWeb - Crée ton jeu par navigateur
Timer qui saute des secondes voir minutes - 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 : Timer qui saute des secondes voir minutes (/showthread.php?tid=296)



Timer qui saute des secondes voir minutes - Kurogane - 05-01-2011

Bonjour, Alors un petit problème de javascript sur ce code :


function Timer(Element)
{

var TimeD = document.getElementById(Element).innerHTML;
var tmp = TimeD.split(":");
var time = parseInt(tmp[0])*3600+parseInt(tmp[1])*60+parseInt(tmp[2]);
time -= 1 ;
var H = 0;
var M = 0;
var S = 0;
var timer="";

H = Math.floor(time / 3600 ) ;
M = Math.floor( (time - (H * 3600 ) )/ 60 ) ;
S = time % 60 ;

if(H<10){timer += "0"+H+":"; } else { timer += H+":"; }
if(M<10){timer += "0"+M+":"; } else { timer += M+":"; }
if(S<10){timer += "0"+S+""; } else { timer += S+""; }


document.getElementById(Element).innerHTML = timer ;

if(H == 0)
{
if(M == 0)
{
if(S == 0)
{
location.reload();
}
}
}
}


Le contexte, ce timer intervient quand une construction est en cours, afin d'afficher le temps restant, ce script est rappelé chaque seconde.

Le problème vient qu'il passe en général les 09 à 59.

Je pense que cela vient des lignes :

H = Math.floor(time / 3600 ) ;
M = Math.floor( (time - (H * 3600 ) )/ 60 ) ;
S = time % 60 ;

Mais je ne vois pas l'erreur :triste3:

Merci d'avance.


RE: Timer qui saute des secondes voir minutes - Hideaki - 05-01-2011

Modifie :

if(H == 0){
if(M == 0){
if(S == 0){
location.reload();
}
}
}
par :


setTimeout("Timer('" + Element + "')",1000);

Cela devrait fonctionner sans problème.

Petit conseil en passant : attention au nom de tes variables Wink


RE: Timer qui saute des secondes voir minutes - Kurogane - 05-01-2011

Les If imbriquées n'influent pas le timer.
Il s'agit de recharger la page pour que le code php finalise la construction.

^^


RE: Timer qui saute des secondes voir minutes - Hideaki - 05-01-2011

Oui effectivement je n'avais pas prêté attention.

Ton code n'indique pas l'appel de ton timer, le problème peut aussi venir de là Wink

Même si cela n'a rien avoir, j'éviterais de réduire de 1 seconde à chaque appel préférant utiliser l'objet Date. Si le navigateur de la personne est un peu lente, il va y avoir une mauvaise synchronisation entre la date afficher et la fin de ta construction.


RE: Timer qui saute des secondes voir minutes - NicoMSEvent - 05-01-2011

et si il se déconnecte avant d'avoir terminé sa construction? Le fait de gérer ça coté client n'est pas une excellente idée...


RE: Timer qui saute des secondes voir minutes - Holy - 05-01-2011

Deux choses :
1. Tu devrais commenter ton code Wink
2. Utilise alert() ou windows.write() pour savoir ce que valent tes variables après chaque modification, ça permettra de savoir à quelle étape ça saute.
3. C'est plus que probablement un problème avec parseInt (bug javascript) que tu peux remplacer par parseFloat Wink


RE: Timer qui saute des secondes voir minutes - Kurogane - 05-01-2011

Merci à vous,
Et surtout à toi Holy, Ton numéro 3 est correct.

Le probléme venait de la fonction parseInt qui est buggé pour la chaine '08'.
La Solution consiste à forcer le parseInt en base 10 ==>
parseInt('Chaine',10);

@Hideaki : Le temps utiliser comme départ du timer est celui qu'il reste avant la fin de la construction. Il est calculer par le php à partir de l'enregistrement de construction et le temps actuel du serveur.

Ce script est appelé par une autre page où se trouve le "SetTimeout". Ayant Besoin de plusieurs timer à la fois ( un par construction en cours ) je charge ce script et règle mes SetTimeout Dynamiquement.

@NicoMSEvent : Le Javascript ne valide pas la fin de la construction , il fait recharger la page quand le temps restant est à 0. C'est une fonction php appelé dans le début de la page qui se charge de vérifier si des construction sur le compte sont à finaliser ou pas.

Voila, Merci de votre aide, car le bug du parseInt ne me serait jamais venu à l'esprit.

J'ai retravaillé le script en m'apercevant que je le compliquer inutilement :


//Timer
function Timer(Element)
{
//Récupération du temps dans la div Element
var TimeD = document.getElementById(Element).innerHTML;
var tmp = TimeD.split(":");
//Mise en place de l'heure,minute,seconde
var H = parseInt(tmp[0],10);
var M = parseInt(tmp[1],10);
var S = parseInt(tmp[2],10);
//Initialisation de la variable texte timer
var timer="";
//Controle de "format"
if(M == 0){ H = H - 1; M = 60; }
if(S == 0){ M = M - 1; S = 60;}
//Décompte d'une seconde. ( Script appeler toutes les 1 secondes )
S = S - 1 ;
//Mise en forme du temps
if(H<10){timer += "0"+H+":"; } else { timer += H+":"; }
if(M<10){timer += "0"+M+":"; } else { timer += M+":"; }
if(S<10){timer += "0"+S+""; } else { timer += S+""; }

//Affichage nouveau temps dans la div Element
document.getElementById(Element).innerHTML = timer ;

//Rechargement de la page, la construction est censé être a terme
if(H == 0)
{
if(M == 0)
{
if(S == 0)
{
location.reload();
}
}
}
}

Et cela fonctionne impec ^^