Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flash > AS1/AS2
AS1/AS2 Questions relatives à la programmation ActionScript 1 et 2 (Cours AS2)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/06/2007, 11h26   #1
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 65
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 65
Points : 26
Points : 26
Par défaut Chronomètre et convertion de temps

Hello, je vous demande un peu d'aide car j'essaie de faire un chronomètre pour un parcours de jeu... Je donne la possibilité à l'utilisateur de faire un parcours chronométré de 4 jeux successifs. A la fin, le lui donne son temps général. De plus, il peut voir le temps s'écouler sur l'ecran au niv. du swf principal.
J'ai un swf principal sur lequel j'ai placé ma fonction timer. Cette fonction est appellé au début de chacun des jeux chargés. Les 4 jeux sont chargés via "LoadClip" dans un Loader.

Mon code sur le swf principal est le suivant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function updateTimer():Void {
		tempsInitial = new Date();
		lancerChrono = setInterval(afficherTemps, 10);
};
 
afficherTemps = function () {
	nb_sec = ((new Date()-tempsInitial)/1000);
	heures = Math.floor((nb_sec+temps_parcours)/3600);
	minutes = Math.floor((nb_sec+temps_parcours)/60);
	secondes = Math.floor((nb_sec+temps_parcours)-Math.floor(minutes*60));
	milliSecondes = (nb_sec%Math.floor((nb_sec+temps_parcours)));
	traitementMilliSecondes = String(milliSecondes);
	milli = traitementMilliSecondes.substr(2, 2);
	// 
	minutes = minutes<=9 ? minutes="0"+minutes : minutes;
	secondes = secondes<=9 ? secondes="0"+secondes : secondes;
	montemps =  minutes+":"+secondes+":"+milli;
	temps.text=montemps;
};
Mon code pour lancer le chronomètre au début de chaque jeu est le suivant :
Code :
this._parent.updateTimer();
A la fin du jeu, je mets le temps en pause via ce code :
Code :
clearInterval(_parent.lancerChrono);
Et j'ajoute à la variable "temps_parcours" le nb de secondes passées durant le jeu via ce code :
Code :
_parent.temps_parcours+=_parent.nb_sec;
Mon pb est le suivant : Arrivé à un certain moment, les minutes ne s'affichent plus mais un point les remplace... Le temps s'affiche donc comme cela :
1min'.7sec'43 à la place de : 1min'27sec'43... J'ai remarqué que c'est toujours le chiffres des dizaines au niveau des minutes qui déconne... Et cette erreur intervient à partir du troisième jeu chargé dans mon loader.

Pouvez-vous me dire qu'est ce qui ne va pas dans mon code? Je suppose qu'il doit y avoir bien plus simple et plus propre non?
purple21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2007, 14h32   #2
Nouveau Membre du Club
 
Avatar de Tigrounette
 
Inscription : décembre 2005
Messages : 132
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 132
Points : 39
Points : 39
Alors, je sais pas d'où viens ton problème, mais en tout cas tu peux faire plus simple, c'est pas une bonne idée d'utilise la class Date et de te servir des intervals. Moi j'aurais fait comme ça :

En AS3 :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
var Temps:int;
 
function Chrono_Start():void {
	Temps = getTimer();
	stage.addEventListener(Event.ENTER_FRAME, Deroulement);
}
 
function Deroulement(E:Event):void {
	var TotalMilli:int = getTimer()-Temps;
	var MS:int = TotalMilli%1000;
	var S:int = (TotalMilli/1000)%60;
	var M:int = (TotalMilli/60000)%60;
	Texte.text = M+":"+S+":"+MS;
}
 
function Chrono_Stop():int {
	stage.removeEventListener(Event.ENTER_FRAME, Deroulement);
	var TempsEcoule:int = getTimer()-Temps;
	return TempsEcoule;
}
 
Chrono_Start();
En AS2 :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
function Chrono_Start() {
	Temps = getTimer();
	onEnterFrame = Deroulement;
}
 
function Deroulement() {
	var TotalMilli = getTimer()-Temps;
	var MS = TotalMilli%1000;
	var S = Math.floor(TotalMilli/1000)%60;
	var M = Math.floor(TotalMilli/60000)%60;
	Texte.text = M+":"+S+":"+MS;
}
 
function Chrono_Stop() {
	delete onEnterFrame;
	var TempsEcoule = getTimer()-Temps;
	return TempsEcoule;
}
 
Chrono_Start();
Tigrounette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2007, 15h18   #3
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 65
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 65
Points : 26
Points : 26
salut,

merci de t'être penché sur mon pb !

Alors j'ai regardé un peu ta solution et j'ai essayé de l'appliquer... Mais ya un truc qui ne va pas... Je n'arrive pas à faire une pause dans le temps.
J'ai donc mis ce code sur mon swf principal :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Chrono_Start() {
	Temps = getTimer();
	onEnterFrame = Deroulement;
}
 
function Deroulement() {
	var TotalMilli = getTimer()-Temps;
	var MS = TotalMilli%1000;
	var S = Math.floor(TotalMilli/1000)%60;
	var M = Math.floor(TotalMilli/60000)%60;
	temps.text = M+":"+S+":"+MS;
}
 
function Chrono_Stop() {
	delete onEnterFrame;
	var TempsEcoule = getTimer()-Temps;
	return TempsEcoule;
}
et j'ai mis ce bout de code dans mes jeux pour lancer le chrono (ou le faire repartir apres sa pause)
Code :
this._parent.Chrono_Start();
et ce bout de code pour arréter le chrono et le mettre en pause en attendant le démarage du jeu suivant :
Code :
this._parent.Chrono_Stop();
Mais ça ne marche pas. Le chrono ne s'arrète pas ou parfois il se remet carément à 0 lorsqu'un jeu démare...

Tu sais pourquoi?
purple21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2007, 15h44   #4
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 65
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 65
Points : 26
Points : 26
en fait c'est moi qu'à déconné sur le "this._parent.Chrono_Start" en fait c'est plutot "_parent.Chrono_Start" ... Donc là ça marche car le chrono se lance, l'affichage marche bien mais le temps reviens systématiquement à 0 lorsque le jeu suivant démarre.. En fait il faudrait trouver le moyen de faire une pause
purple21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2007, 16h58   #5
Nouveau Membre du Club
 
Avatar de Tigrounette
 
Inscription : décembre 2005
Messages : 132
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 132
Points : 39
Points : 39
Ok, j'avais pas compris comme ça. Mais c'est tout simple tu peux faire comme ça :

Lorsque tu arrête ton premier Chrono avec Chrono_Stop(), cette fonction te renvoie le temps écoulé. Tu met ce temps dans une variable et juste après avoir démarrer ton deuxieme chrono tu decale ton Chrono avec cette valeur. Comme ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Premier Chrono
Chrono_Start();
 
// Le joueur joue
 
 
 
// Arrêt du Chrono
var TempsEcoule = Chrono_Stop();
 
// Lancement du deuxième Chrono avec décalage 
// (bien lancer le Chrono avant le décalage)
Chrono_Start();
Temps = Temps-TempsEcoule
Tigrounette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2007, 18h00   #6
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 65
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 65
Points : 26
Points : 26
Re !

bon excuses moi j'dois etre un peu à la ramasse mais je n'y arrive pas

Alors, je récapitule, j'ai essayé deux choses.
La première c'était de mettre sur mon swf principal le code :
Temps = Temps-TempsEcoule;

La seconde était de mettre ça au niveau du code de mon second jeu. J'ai donc mis :
_parent.Chrono_Start();
Temps = Temps-TempsEcoule;

Et ça remet tjrs le chrono à zero...
J'avais également tenté de mettre une variable dans la fonction "Chrono_Start()" par exemple le nb de milisecondes écoulées durant les jeux précédents. L'idée était d'ajouter ce nb de miliseconde au temps lorsqu'il reprend (en fait, ça fait comme une pause finalement) mais je n'ai pas réussi non plu...
purple21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 01h02   #7
Nouveau Membre du Club
 
Avatar de Tigrounette
 
Inscription : décembre 2005
Messages : 132
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 132
Points : 39
Points : 39
Il faudrais que tu me donne le fla ou alors que tu affiche tout ton code pour que je puisse voir ce qui ne vas pas ^^
Tigrounette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 09h34   #8
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 65
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 65
Points : 26
Points : 26
salut,

malheureusement mon fla est assez enorme premièrement, deuxièmement il fait appelle à des swf (les jeux), donc il faudrait aussi que je te passe les jeux, enfin, le tout ne peut marcher qu'avec easyphp (le ctrl+entrée ne fonctionne pas) donc j'ai bien peur qu'on soit un peu bloqué!
En revanche, j'ai quelqu'un sur un autre forum qui m'a dit :

Citation:
définir les valeurs temps écoulé en global ?

Dans le start, tu déclares Temps comme départ, dans le stop, tu l'utilise pour le chrono.
Si tu lances un nouveau jeu, tu redéclare le temps comme départ, au lieu de le conserver et de stocker le nouveau getTimer

En fait, pour faire une pause, tu as un temps de départ TD, le début de la pause DP, la fin de la pause FP et la fin du temps FT

Ton temps écoulé est FT-FP+DP-TD.

A chaque pause, tu dois calculer DP-TD qui te donne le temps déjà écoulé, que tu ajoutes au total final.

Enfin, il me semble.
T'en penses quoi?
purple21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 09h40   #9
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 65
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 65
Points : 26
Points : 26
je me demande aussi un truc... Ou dois-je placer "TempsEcoule = Chrono_Stop();" ? Juste après le fonction Chrono_Start dans mon swf principal? ou bien juste après le Chrono_Stop dans mes jeux? Auquel cas je dois mettre "_parent.TempsEcoule = _parent.Chrono_Stop();"...
Et faut-il que je déclare un nouveau GetTimer?

purple21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 10h44   #10
Nouveau Membre du Club
 
Avatar de Tigrounette
 
Inscription : décembre 2005
Messages : 132
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 132
Points : 39
Points : 39
Je crois que j'ai fait une erreur, je te refait tout ça proprement :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
ListeTemps = new Array();
TempsTotal = 0;
DernierTemps = 0;
 
function Chrono_Start() {
	if (onEnterFrame == undefined) {
		if (Temps == undefined) {
			Temps = getTimer();
		} else {
			Temps = getTimer()-TempsTotal;
		}
		onEnterFrame = Deroulement;
	}
}
 
function Deroulement() {
	var TotalMilli = getTimer()-Temps;
	var MS = TotalMilli%1000;
	var S = Math.floor(TotalMilli/1000)%60;
	var M = Math.floor(TotalMilli/60000)%60;
	Texte.text = M+":"+S+":"+MS;
}
 
function Chrono_Pause() {
	if (onEnterFrame != undefined) {
		delete onEnterFrame;
		var TempsEcoule = getTimer()-Temps;
		DernierTemps = TempsEcoule-TempsTotal;
		ListeTemps.push(DernierTemps);
		TempsTotal = TempsEcoule;
	}
}
 
function Chrono_Reset() {
	Temps = undefined;
	ListeTemps = new Array();
	TempsTotal = 0;
	DernierTemps = 0;
}
Voila, là ça devrais aller :p

Pour lancer le Chrono, tu fait Chrono_Start()

Pour le mettre en pause tu fait Chrono_Pause() et une fois que c'est fait, tu peux récupérer le temps du dernier niveau avec la variable "DernierTemps" ou alors le temps total avec la variable "TempsTotal". Aussi, tu peux récupérer tout les temps des niveau précédent avec le tableau "ListeTemps".

Si tu veux remettre le Chrono à zero, utilise la fonction Chrono_Reset()

Exemple :

Code :
1
2
3
 
// Lancement de ton Chrono
Chrono_Start();
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
// Le joueur à fini le premier niveau
// Tu arrête le Chrono
Chrono_Pause();
 
// Puis tu récupère tes valeurs
// Le temps passé à ce niveau
trace(DernierTemps);
 
// Le temps total passé dans tout les niveau
trace(TempsTotal);
 
// La liste des temps de chaque niveau
trace(ListeTemps);
 
// Puis tu lance le Chrono du niveau suivant
Chrono_Start();
Voila, j'espère que ça te conviendra
Tigrounette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 11h27   #11
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 65
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 65
Points : 26
Points : 26
Vraiment super

Merci mille fois de t'être penché sur mon pb et d'avoir passé du temps à le résoudre !

C'est impecable, là, tu m'en a même donné plus que ce que j'espèrais ! Donc, à la phrase :
Citation:
Voila, j'espère que ça te conviendra
je te répondrais :

Ca me convient PARFAITEMENT !

Merci encore

ps : t'es balaise en AS c'est ton métier? Tu t'es déjà mise à l'AS3 à ce que je vois en plus...
purple21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 12h24   #12
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 65
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 65
Points : 26
Points : 26
heuuu....
Encore une dernière petite question
J'essaie de convertir "DernierTemps" qui est un chiffre en milliseconde sous la forme min/sec/millisec.

J'ai essayé de faire ce genre de chose :
Code :
1
2
3
4
5
//Affichage du dernier temps
	var MS_dernier = DernierTemps%1000;
	var S_dernier = Math.floor(DernierTemps/1000)%60;
	var M_dernier = Math.floor(DernierTemps/60000)%60;
	Affichage_dernier.text = M+":"+S+":"+MS;
Mais ça ne marche pas.. undefined.
T'aurais pas une idée?

Apres promi j't'embètte plus
purple21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 15h24   #13
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 65
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 65
Points : 26
Points : 26
c'est bon ! J'ai trouvé tout seul ! T'auras même pas besoin de me répondre
En fait je n'avais pas placé mes lignes de code au bon endroit. Il faut les mettre dans la fonction Deroulement. Ce que je n'avais pas fais.

Merci encore
cette fois tout est résolu .
purple21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h35.


 
 
 
 
Partenaires

Hébergement Web