[javaxcript / PHP] Temps

Fermé
kript - 8 mai 2006 à 17:08
 Makari - 14 juin 2008 à 15:26
Bonjours à tous, j'ai un gros problème pour finir mon site web, je souhaite réaliser un décompte comme dans le jeux "ogame" lors de la construction des batiments et recherches.
A savoir :
lors du clique sur "construction", mise dans la base de doné du temps en seconde ... plus aucun lien n'est actif pr les autre structure, le lien construction est remplacé par le temps récupéré de la bd rafraichi a la seconde au format ( x jours, 00:00:00 ) et le lien annuler qui supprime le temps de la base de donné sql ce qui raffiche les lien initial a savoir construction, sa va bientot faire plus d'un moi que je me prend la tete alors si quelqu'un a une idée sa serai vraiment sympa. Je suis ouvert à toute proposition et toute variante convenant.

Merci d'avance sa me soulagerait d'un poid !!
@ +

25 réponses

PhP Messages postés 1770 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
13 mai 2006 à 13:47
Bjr

Ha là tu exagères qd même un petit peu non ?
C'est de l'arithmétique élémentaire ! LOL

Bon alors voici quelques explications sur le fct toHMS()

Elle convertit une durée exprimée en secondes en Heures - Minutes -Secondes (format HH:MM:SS) et stocke le resultat dans un tableau "temps" quelle retourne à la fin.

duree : contient un nombre en secondes représentant une durée
pour 2 heures alors duree vaut 7200 (3600 sec x 2)

temps[0] = Chiffre des dizaines pour les heures (entre 0 et 9)
temps[1] = Chiffre des unités pour les heures (entre 0 et 9)
temps[2] = Chiffre des dizaines pour les minutes (entre 0 et 5)
temps[3] = Chiffre des unités pour les minutes (entre 0 et 9)
temps[4] = Chiffre des dizaines pour les secondes (entre 0 et 5)
temps[5] = Chiffre des unités pour les secondes (entre 0 et 9)


Math.floor(x) : retourne la partie entière de la variable x
Si x vaut 1.6 alors Math.floor(x) = 1
Si x vaut 0.1 alors Math.floor(x) = 0


Et voici la version qui intègre les jours :

function toHMS(duree)
{
var temps = new Array();


var jj = Math.floor(duree/(3600*24)); // 24h par jour
var hh = Math.floor((duree/3600); // 3600 sec /heure
var mm = Math.floor((duree-hh*3600)/60); // 60 sec /min
var ss = duree-hh*3600-mm*60;


temps[0]=Math.floor(hh/10);
temps[1]=hh-temps[0]*10;
temps[2]=Math.floor(mm/10);
temps[3]=mm-temps[2]*10;
temps[4]=Math.floor(ss/10);
temps[5]=ss-temps[4]*10;

return temps;
}
3
PhP Messages postés 1770 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
9 mai 2006 à 21:10
Bsr

j'ai pas vraiment suivi ....

tu veux faire quoi exactement ?
1
Tout d'abord, merci de ta réponse et deuxièment désolé de ne pas avoir été claire. Je ne sais pas si vous connaissez ogame. Un jeu de stratégie en ligne. Le but est de contruire des batiment, de colonisert de nouvelle planète et d'attaquer les autres joueurs, à l'intérieur de ce jeu il y a un décompte pour la fabrication des batiment ... C'est ce décomtpe que je souhaite réaliser alors voilà le décompte plus en détaille :
- si les ressources X et Y sont suffisante alors, on affiche un liens permettant de mettre a jour la base de donné SQL (on met le temps de décompte dans la base de donnée a savoir dans la colone "constrution en cour"), après le clique effectuer on efface le lien et les autre lien de contruction, et on fait apparaitre le décomtpe pour le batiment(ou lon a cliquer auparavant) le décompte est rafraichi à la seconde ( le changement de page et la déconexion ne doit pas intérompre le décomtpe) en dessous du décomtpe il y a aussi un test "anuler" lors du clique cela efface le temps dans la base de donné er réafiche les liens du début a savoir construction si les reouurce X et Y sont suffisante. LOrsque le décomtpe arrive à "00:00:00" on met a jour la base de donnée on rajoute 1 au niveau du batiment que lon a contruit (par exemple si le batiment était level 9, a la fin du décompte il sera de 10) et on réafiche les lien initiau pour la construction.
Alors voilà le principe de fonctionnement que j'ai suposer ....
Sinon vous pouvez allez sur www.ogame.fr pr voir le fonctionement (il faut sinscrire et c'est gratuit).
Voilà si il y a encore des chose que vous ne comprenez pas n'hésitez car j'ai vraiment besoin de ce "script"

voilà merci
1
PhP Messages postés 1770 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
9 mai 2006 à 21:48
re

Bref en gros tu veux simplement faire un compte-à-rebour

1 - ta base MySQL initialise le temps
2 - ta pages l'affiche et le rafraîchi toutes les secondes jusqu'à zéro

c'est cà ?



1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Oui c'est sa !!
et ce que je ne sait pas faire aussi c'est afficher le lien si c'est bon et lors du clique afficher autre chose ...
Merci sinon c'est bien sa que je souhaite faire
1
PhP Messages postés 1770 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
9 mai 2006 à 22:28
un truc tout bête comme ca uniquement en JavaScript ca pourrait aller ?


http://www.nobodysperfect.freesurf.fr/countdown/countdown.php

1
Oui cela me conviendrai en plus l'aspect est jolie seul problème quand on actualise la page le compteur se remet a 0 !! :(
Mais sinon l'aspect et le principe me convient.
1
Avec javascript ce qu'on pourrait faire, c'est utiliser 2 frames (cadres). Sur l'une le countdown qui continuerait jusqu'à ce qu'on lui demande de s'arrêter, sur l'autre tout le reste pourrait être actualisé sans affecter le décompte du temps. J'ai déjà fait cela en javascript ( parent.xxx pour communiquer entre frames) mais je ne sais pas comment on fait cette communication en PHP.
1
PhP Messages postés 1770 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
10 mai 2006 à 21:08
Bsr

un truc moin bête qu'il n'y parait en utilisant Javascript + PHP et les sessions

http://www.nobodysperfect.freesurf.fr/countdown/countdown.php


Tu peux remplacer les sessions par un appel à la base MySQL : à toi d'adapter ...
1
Salut :)

Est ce possible de recevoir le script de ton décompte de temps?

voici mon adresse msn : thesplit44@msn.com

Merci d'avance
0
Ton dernier sscript ce rapproche de ce que je veu si tu pouvai m'envoyer les image du compteur et le script sa serait cool, mon MSN est geotinc@hotmail.com.
Encore merci
1
Il y a des countdowns gratuits sur le web. Celui dont on parle (avec images) semble être à :

http://www.javascriptkit.com/script/countdownimage.shtml
_____________________________________________________
http://www.javascriptkit.com/script/cutindex1b.shtml

https://www.webdeveloper.com/

https://www.webdeveloper.com/
1
Bonjours, alors merci pour le compteur, il marche très bien !!, j'aimerai cependant rajouter des digite pour le nombre de jours et je ne comprend pas ce code donc si quelqu'un pouvait m'aider sa serait cool merci d'avance


<script type="text/javascript">
<!--

function toHMS(duree)
{
	var temps = new Array();
	
	var hh = Math.floor(duree/3600);
	var mm = Math.floor((duree-hh*3600)/60);
	var ss = duree-hh*3600-mm*60;

	
	temps[0]=Math.floor(hh/10);
	temps[1]=hh-temps[0]*10;
	temps[2]=Math.floor(mm/10);
	temps[3]=mm-temps[2]*10;
	temps[4]=Math.floor(ss/10);
	temps[5]=ss-temps[4]*10;
	
	return temps;
}
function decompte()
{
	var seq = toHMS(restant);
	for (var i=0; i < 6; i++)
	{
		document.getElementById("seq_"+i).src="c"+seq[i]+".gif";
	}

	if (restant)
	{
		restant--;
		window.setTimeout("decompte()",1000);
	}
	else
	{
		document.print('<META http-equiv="refresh" content="1; URL=infrastruture.php">')
	}	
}
</script>
1
Merci beaucoup, et désolé mais moi mon truc c'est le php, le javascript je vien de m'y mettre donc j'ai un peu du mal. Merci
0
PhP Messages postés 1770 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
13 mai 2006 à 14:23
Ops j'ai validé trop vite !

Tu oublies ma réponse précédente !

A la place il fallait lire :


Et voici la version qui intègre les jours :

function toHMS(duree)
{
   	var temps = new Array();
	var jour = 3600*24; // Durée d'un jour en secondes 

	var jj = Math.floor(duree/jour);  	
        var hh = Math.floor((duree-jj*jour)/3600);	
	var mm = Math.floor((duree-jj*jour-hh*3600)/60);
	var ss = duree-jj*jour-hh*3600-mm*60;

	
	temps.push(Math.floor(jj/10));
	temps.push(jj-Math.floor(jj/10)*10);
	temps.push(Math.floor(hh/10));
	temps.push(hh-Math.floor(hh/10)*10);
	temps.push(Math.floor(mm/10));
	temps.push(mm-Math.floor(mm/10)*10);
	temps.push(Math.floor(ss/10));
	temps.push(ss-Math.floor(ss/10)*10);

	temps.reverse();
	return temps;
}



Il faut remplacer le code pour les images ainsi :
<div>
<img id="seq_7" src="c0.gif"><img id="seq_6" src="c0.gif">
<img id="seq_5" src="c0.gif"><img id="seq_4" src="c0.gif"><img src="colon.gif"><img id="seq_3" src="c0.gif"><img id="seq_2" src="c0.gif"><img src="colon.gif"><img id="seq_1" src="c0.gif"><img id="seq_0" src="c0.gif">
</div>



temps.push(elt) : ajoute elt à la fin du tableau

temps.reverse() : inverse tous les éléments du tableau

si array = new Array("A","B","C") alors après array.reverse() array contient ("C","B","A")


Donc maintenant :

temps[0] = Chiffre des unités pour les secondes (entre 0 et 9)
temps[1] = Chiffre des dizainespour les secondes (entre 0 et 5)
temps[2] = Chiffre des unités pour les minutes (entre 0 et 9)
temps[3] = Chiffre des dizaines pour les minutes (entre 0 et 5)
temps[4] = Chiffre des unités pour les heures (entre 0 et 9)
temps[5] = Chiffre des dizaines pour les heures (entre 0 et 2)
temps[6] = Chiffre des unités pour les jours (entre 0 et 9)
temps[7] = Chiffre des dizaines pour les jours (entre 0 et 9)


Pourquoi un tel changement ?
Tout simplement pour simplifier les évolutions : si par ex tu souhaites afficher les jours non plus sur 2 chiffres mais sur trois à l'avenir


Test avec 86410 comme durée initiale ...
0
bonjour,

je cherchais également ce genre de compteur, et ca marche ;)
mais j'aurai voulu savoir comment faire pour l'utiliser plusieurs fois dans la meme page

en fait, je l'utilise pour un jeu, ou il montre le temps qu'il reste pour qu'une unité soit produite, mais je voudrai que toutes les unités en production aient leur compteur, or, la ca marche pas, le dernier compteur prenant la valeur des variables precedentes, au final je me retrouve avec que des compteur affaichant 0 et un seul affichant un temps normal.
0
PhP Messages postés 1770 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
13 juin 2008 à 22:47
Bsr

C'est possible de gèrer plusieurs compteurs indépendants mais dans ce cas l'utilisateur ne doit surtout pas recharger la page où alors tu dois utiliser AJAX pour sauvegarder le contexte en PHP dans une session ou une base de données
0
bin le temps affiché au compteur vient d'une base de donnée, mais je sais pas si ca suffit .. (suis quelque peu débutant ^^)
0
pour precisermon probleme, je fais une boucle qui sort des enregistrement, a chaque tour je voudrais que ca m'affiche un compteur correspondant, j'ai essayé de mettre la variable "restant" (qui contient le nombre de secondes a afficher en H/MS) en tableau, mais quand ca passe dans la parite JS, ca plante (peut etre que ma syntaxe etait mauvaise) j'avais essayé un truc de ce type :

$restant[$boucle]=$tpsTMP;
include("countdown.php)

et en remplacant toute les anciennes variables $restant par $restant[$boucle]
et les variables 'restant' JS par 'restant[<?php echo $boucle; ?>]'

je ne connais pas les tableau en JS, donc ptetre que je me suis planté la, mais ptetre que ca peut pas fonctionner tout court de cette maniere :/

j'ai besoin d'aide :p
0
PhP Messages postés 1770 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
14 juin 2008 à 10:30
Bjr

un ex de compteur multiple mais sans gestion de reprise en cas de rafraîchissement de la page (pas de sauvegarde du contexte T'Oh ! )

Comme tu peux le constater le code a sérieusement été revu pour intégrer des objets Javascript le seul moyen de faire les choses proprement :

countdown2.htm (à copier dans le répertoire où se trouvent déjà les images)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr" lang="en">
<head>
<title>Game</title>
<style>

body
{
font-size:10pt;
font-family:Arial;
}

div img
{
padding:0px;
margin:0px;
display:inline;
border-width:0px;
}

</style>
<script type="text/javascript">
<!--
function toHMS(duree)
{
	var temps = new Array();
	
	var hh = Math.floor(duree/3600);
	var mm = Math.floor((duree-hh*3600)/60);
	var ss = duree-hh*3600-mm*60;

	temps[0]=Math.floor(hh/10);
	temps[1]=hh-temps[0]*10;
	temps[2]=Math.floor(mm/10);
	temps[3]=mm-temps[2]*10;
	temps[4]=Math.floor(ss/10);
	temps[5]=ss-temps[4]*10;
	return temps;
}

function CountDown(id,duration)
{
	this.duration = duration;
	this.startTime = 0;
	this.id = id;
	this.timeLeft = this.duration;
	this.state = CountDown.States.READY;
}

CountDown.States = {
	STARTED : 1,
	PAUSED : 2,
	READY : 3,
	TERMINATED : 4
}	

CountDown.prototype.build=function()
{
	var html = "";
	html +="<img id=\""+this.id+"_0\" src=\"c0.gif\">";
	html +="<img id=\""+this.id+"_1\" src=\"c0.gif\">";
	html +="<img src=\"colon.gif\">";
	html +="<img id=\""+this.id+"_2\" src=\"c0.gif\">";
	html +="<img id=\""+this.id+"_3\" src=\"c0.gif\">";	
	html +="<img src=\"colon.gif\">";
	html +="<img id=\""+this.id+"_4\" src=\"c0.gif\">";
	html +="<img id=\""+this.id+"_5\" src=\"c0.gif\">";	
	var elt=document.getElementById(this.id).innerHTML = html;
}

CountDown.prototype.display=function()
{
	var seq = toHMS(this.timeLeft);
	for (var i=0; i < 6; i++)
	{
		document.getElementById(this.id+"_"+i).src="c"+seq[i]+".gif";
	}
}

CountDown.prototype.refresh=function()
{
	if (this.state != CountDown.States.STARTED) return;
	
	if (this.timeLeft)
	{
		this.timeLeft--;	
	}
	this.display();
	if (!this.timeLeft)
	{
		this.state = CountDown.States.TERMINATED;
		this.parent.doTimeOut(this.id);
	}	
}

CountDown.prototype.start=function()
{
	if ((this.state != CountDown.States.PAUSED) && (this.state != CountDown.States.STARTED))
	{
		this.timeLeft=this.duration;
	}	
	this.state = CountDown.States.STARTED;
	this.display();
}

CountDown.prototype.reset=function()
{
	this.timeLeft = this.duration;
	this.state = CountDown.States.READY;
	this.display();	
}

CountDown.prototype.pause=function()
{
	this.state = CountDown.States.PAUSED;
}

function CountDownManager()
{
	this.items = new Array();
}

CountDownManager.prototype.add=function(id,duration)
{
	var item = new CountDown(id,duration);
	item.index = this.items.length;
	item.parent = this;
	this.items[this.items.length]=item;
	return item;
}

CountDownManager.prototype.doTimeOut=function(id)
{
	if (typeof(this.onTimeOut)=="function") this.onTimeOut(id);
}

CountDownManager.prototype.init=function()
{
	for (var i=0; i < this.items.length; i++)
	{
		this.items[i].build();
		this.items[i].display();
	}
}

CountDownManager.prototype.refresh=function()
{
	for (var i=0; i < this.items.length; i++)
	{
		this.items[i].refresh();
	}
}

CountDownManager.prototype.start=function()
{
	for (var i=0; i < this.items.length; i++)
	{
		this.items[i].start();
	}
}

CountDownManager.prototype.pause=function()
{
	for (var i=0; i < this.items.length; i++)
	{
		this.items[i].pause();
	}
}

CountDownManager.prototype.reset=function()
{
	for (var i=0; i < this.items.length; i++)
	{
		this.items[i].reset();
	}
}

function decompte()
{
	compteurs.refresh();
}

var compteurs = new CountDownManager();

// Fonction appelée lorsqu'un compteur arrive à zéro
compteurs.onTimeOut = function(id)
{
	var elt=document.getElementById("resultat");
	elt.innerHTML+="<p>Le compteur "+id+" est arrivé à zéro !</p>";
}

function load()
{

	for (var i=0; i<4; i++)
	{
		compteurs.add("compteur_"+i,(i+1)*3);
	}	
	compteurs.init();
    window.setInterval("decompte()",1000);
}

// -->
</script>
</head>
<body onload="load()">
Exemple de comptes à rebours multiples<br /><br />
<table border="1">
<tr>
	<td>Compteur 0</td><td><div id="compteur_0"></div></td>
	<td><input type="button" onclick="compteurs.items[0].start()" value="Start"></td>
	<td><input type="button" onclick="compteurs.items[0].pause()" value="Pause"></td>
	<td><input type="button" onclick="compteurs.items[0].reset()" value="Reset"></td>
</tr>
<tr>
	<td>Compteur 1</td><td><div id="compteur_1"></div></td>
	<td><input type="button" onclick="compteurs.items[1].start()" value="Start"></td>
	<td><input type="button" onclick="compteurs.items[1].pause()" value="Pause"></td>
	<td><input type="button" onclick="compteurs.items[1].reset()" value="Reset"></td>
</tr>
<tr>
	<td>Compteur 2</td><td><div id="compteur_2"></div></td>
	<td><input type="button" onclick="compteurs.items[2].start()" value="Start"></td>
	<td><input type="button" onclick="compteurs.items[2].pause()" value="Pause"></td>
	<td><input type="button" onclick="compteurs.items[2].reset()" value="Reset"></td>
</tr>
<tr>
	<td>Compteur 3</td><td><div id="compteur_3"></div></td>
	<td><input type="button" onclick="compteurs.items[3].start()" value="Start"></td>
	<td><input type="button" onclick="compteurs.items[3].pause()" value="Pause"></td>
	<td><input type="button" onclick="compteurs.items[3].reset()" value="Reset"></td>
</tr>
<tr>
	<td colspan="2">Tous les compteurs</td>
	<td><input type="button" onclick="compteurs.start()" value="Start"></td>
	<td><input type="button" onclick="compteurs.pause()" value="Pause"></td>
	<td><input type="button" onclick="compteurs.reset()" value="Reset"></td>
</tr>
</table>
<div id="resultat"></div>
</html>
--

PhP  
Il y a 10 types de personnes dans le monde : ceux qui comprennent le binaire et les autres ...
0
j'avoue avoir un peu de mal a tout comprendre :p
j'ai copié le code et essayé de le faire marcher/comprendre mais c'est pas encore ca ^^

deja je pense qu'il y'a moyen de l'alleger pas mal, et je suis pas sur qu'il remplisse une certaine fonction (peut etre ma faute si je me suis mal expliqué :( )

en fait. euh.. j'ai une base de donnée. il y'a X enregistrement de temps.
je faire une requete sql pour les sortir et les traiter ds ma page php.
donc, en boucle de type

while ($ligne = mysql_fetch_array($Tps))
{
$TPScompteur=$ligne['Tps'];
include("compteur1/2.php");
}

le compteur doit juste affiché le temps restant dynamiquement, je n'ai pas besoin de bouton start, pause ou reset.
et je ne sais pas combien de tableau je devrai afficher (ca peut etre un seul et ca peut etre trente cinq ^^)

voila, si quelqu'un se dit " trop facile, quel noob ce noob" bin je veux bien qu'il me dise quoi faire :p
en attendant je vais essayer de fouiller un peu la dedans pour voir si je peux bidouiller un peu ;)
0