Accueil > Forum > > > > compte à rebours en c++ et +
compte à rebours en c++ et +
dimanche 26 décembre 2010 à 18:32:27 |
compte à rebours en c++ et +

tiouil
|
Bonjour, je programme en c++ sur linux (debian / ubuntu) et je creer le jeu diamant, (il faut aligner trois formes). Je souhaite ajouter un "bonus" comme le temps, donc avec un compte à rebours que j'ai deja codé (tres simple) mais il me manque la fonction qui fait patientez juste le temps mais pas le jeu :
Je m'explique je souhaite enlever une seconde toutes les 1000 ms (car c'est souvent en ms) mais je souhaite pouvoir jouer en attendant vous voyez ?
Merci a tous de m'expliquez un peu le "fonctionnement de la fonction" avec le lib a inclure et tout et tout.
CLDT
|
|
mardi 28 décembre 2010 à 20:27:31 |
Re : compte à rebours en c++ et +

pop70
|
Si j'ai bien compris, le problème est de ne pas bloquer le jeu pendant le délai.
Pour ça si le jeu contient une boucle principale, ce qui est souvent le cas, il faut juste un compteur dans la boucle :
genre :
Code C/C++ : #include <iostream>
#include <time.h>
int main()
{
clock_t chrono;
double temps = 0;
int secondes_restantes;
int TEMPS_BONUS = 10;
while (secondes_restantes > 0)
{
secondes_restantes = TEMPS_BONUS - temps;
//...Jeu
temps = (int(clock() - temps) / 1000);
system("cls");
std::cout << "Temps restant : " << secondes_restantes << "\n";
}
}
Pop70
|
|
mardi 28 décembre 2010 à 20:47:25 |
Re : compte à rebours en c++ et +

tiouil
|
Bonjour,
Je vous remercie pour votre grande aide,
Par contre je suis en train de chercher pour faire une pause (pipi par exemple ^^) pendant le jeu en appuyant sur la barre espace.
j'ai fait cela :
void pause(SDL_Surface* &menuFond, SDL_Event &event)
{
SDL_PollEvent(&event);
if (event.type==SDL_KEYDOWN)
{
if (envent.key==SDLK_SPACE)
{
if (deja_pause==faux)
{
apply_surface( NULL, NULL, menuFond, SCREEN, NULL); // menufond (image de fond)
"timer_STOP";
"sauvegarde matrice des diamants"
"sauvegarde des points"
}
else
{
"timer_start";
"genere_grille = matrice sauvegardée"
"points= points sauvegardés"
}
}
}
}
donc comme vous pouvez le voir j'ai fait une detection SDLK_SPACE, mais le probleme se trouve a la sortie de la pause car il va me regenerer une nouvelle grille et remettre le compte à rebours au debut (disons 100 secondes), comment concerver ma matrice de diamants (creer une nouvelle matrice temporelle ?), et comment faire repartir le temps avec le temps sauvegardé (temps=temps_sauvegarde ? dans le else ?).
merci de me confirmer (ou m'infirmer) mes pistes et de me debloquer au niveau de la matrice.
Cordialement.
Je vous souhaite d'excellentes fêtes.
Cyril Z.
|
|
mercredi 29 décembre 2010 à 19:12:58 |
Re : compte à rebours en c++ et +

pop70
|
Voila un petit code que j'ai testé et qui fonctionne :
Code C/C++ : #include <iostream>
#include <time.h>
bool Pause (int);
int main (int argc, char **argv)
{
bool continuer = true;
bool pause = false;
int temps_bonus = 15;
int temps_restant = temps_bonus;
int temps_compte = 0;
double temps_ecoule = 0;
int temps_total = 0;
double t1 = 0;
double t2 = 0;
while (continuer)
{
t1 = t2;
t2 = clock();
temps_ecoule += t2 - t1;
if (temps_ecoule >= 1000)
{
temps_ecoule = 0;
temps_total ++;
if (!pause)
{
temps_compte ++;
temps_restant = temps_bonus - temps_compte;
if (temps_restant <= 0)
{
continuer = false;
}
}
}
pause = Pause (temps_total);
system ("cls");
std::cout << "temps total : " << temps_total
<< "\n temps compte : " << temps_compte
<< "\n temps restant : " << temps_restant;
}
system ("cls");
std::cout << "temps total : " << temps_total
<< "\n temps compte : " << temps_compte
<< "\n temps restant : " << temps_restant;
std::cout << "\n\n";
system ("PAUSE");
return 0;
}
bool Pause (int t)
{
bool retour = false;
// simule une Pause de 3 secondes: t = 5, t = 6 , t = 7
if (t > 4 && t < 8)
{
retour = true;
}
return retour;
}
temps_ecoule compte les millisecondes et revient en zéro dès qu'il passe la secondes. A ce moment il incrément temps_total, qui est le temps global que dure la boucle. S'il n'y a pas de pause, le temps_compte s'incrémente aussi, mais si la pause est activé, alors il ne change pas.
temps_restant est le temps qu'il reste au joueur, c'est le temps_bonus - le temps passé sans la pause (donc temps_compte).
Si le temps_restant est inférieur ou égal à 0, le jeu s'arrête.
Pour simuler la pause, je passe temps_total en argument d'une fonction "Pause", celle-là renvoie vrai si le temps_total est entre 4 et 8 secondes exclus, et faux dans le cas contraire. ça a pour conséquence de 3 secondes.
A la place de cette fonction "Pause", en SDL tu active le booléen "pause" si le nombre de fois de la touche du clavier modulo 2 = 1 et le désactive si ça vaut 0.
exemple en gros (donc pas testé) :
Code C/C++ : if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_SPACE)
{
(pause % 2) ? pause == false : pause = true;
}
Mais je pense qu'il faudrait 2 touches et pas une :
une pour activer la pause, l'autre pour la désactiver.
Car si dans le code il y a le SDL_EnableKeyRepeat() activé, on ne peut plus compter le nombre de fois que le joueur à appuyé sur la touche Espace.
En tout cas, de cette manière, il n'y a plus besoin de réinitialiser les autres variables, car elle ne disparaissent pas.
Voilà, Bon courage :)
Pop70
|
|
mercredi 29 décembre 2010 à 19:14:39 |
Re : compte à rebours en c++ et +

pop70
|
Petite rectification :
Code C/C++ :
if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_SPACE)
{
(pause % 2) ? pause = false : pause = true; // J'avais mis == à la place de =
}
Pop70
|
|
mercredi 29 décembre 2010 à 21:42:46 |
Re : compte à rebours en c++ et +

tiouil
|
Bonjour, je vous remercie encore énormément.
Par contre je ne voit pas comment on peut être sûr que 1000 tour dans la boucle while correspond a une seconde réellement (et non par rapport a temps_ecoule).
Sinon ne pensant pas a faire une pause controlée par le systeme (3sec) je pensais refaire une detection mais de la meme touche (espace) car je ne souhaitais pas mettre de SDL_EnableKeyRepeat() mais bien mon if (event.key==SDLK_SPACE). Esc-ce bien ?
De plus, pourquoi envoyer temps_total a Pause car t ne sera presque jamais (voir nullement) compris entre 4 et 8. Et
|
|
mercredi 29 décembre 2010 à 22:51:09 |
Re : compte à rebours en c++ et +

pop70
|
t1, t2 et temps_ecoule sont en millisecondes, dans
if (temps_ecoule >= 1000), temps_ecoule est la sommes des millisecondes comprisent entre t1 et t2 :
Code : (T2 = clock())
T1 .......T2
(T2 devient T1) (T2 = clock())
....................T2
(T2 devient T1) (T2 = clock())
.......................T2
(T2 devient T1)
et ainsi de suite.
Chaque ligne de points est une durée en millisecondes qu'on ajoute à temps_ecoule (temps_ecoule += t2 - t1).
Si il y a 1000 points (donc 1000 millisecondes = 1s), on remet temps_ecoule a 0, on ajoute 1 au temps_total et on recommence jusqu'a avoir une seconde supplémentaire, et encore, et encore...
Je met temps_total à Pause, car temps_ecoule se réinitialise tout le temps, il ne dépasse pas 1, et si temps_compte était passé à pause, la boucle ne s'arrêterait jamais, car temps_compte ne s'incrémente plus justement quand il y a la Pause.
temps_total est le temps qui permet de faire une mesure sans interruption du programme.
Code :
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)(11)(12)(13)(14)
___________________________| PAUSE |_______________________________|FIN
temps_total : +++.+++.+++.|+++.+++.+++|.+++.+++.+++.+++.+++.+++.+++.+++.
temps_compte : +++.+++.+++.| |.+++.+++.+++.+++.+++.+++.+++.+++.
(pour l'exemple : 3+ représentent 1 s.)
Ici on dit que la pause est définie dès que temps_total > 3 et s'arrête quand elle est temps_total > 6. Durant ce temps, on cesse d'augmenter temps_compte.
Du coup on peut obtenir un temps de jeu = à temps compté de 11s alors que temps_total de l'exécution est de 14s.
si on dit que 3+ = 1s, dans le premier tour de boucle il ne peut très bien se passer que 1/3s et dans le deuxième 2/3s, temps écoulé sert à les additionner et à compter les secondes :
Code : Tours: Temps:
1 0.33s (temps_ecoule = 0 + 0.33)
2 0.77s (temps_ecoule = 0.33 + 0.77 = 1s, donc temps_total++,
et temps_ecoule remis à 0)
3 0.25s (temps_ecoule = 0 + 0.25)
4 0.60s (temps_ecoule = 0.25 + 0.60 = 0.85)
5 0.15s (temps_ecoule = 0.85 + 0.15 = 1s, donc temps_total++,
et temps_ecoule remis à 0)
...
et ainsi de suite
Pour la SDL, si SDL_EnableKeyRepeat()n'est pas mis, il n'y a pas de problème :
Code C/C++ : if (event.key==SDLK_SPACE)
{
(pause % 2) ? pause = false : pause = true;
/* pause % 2 = 1 donc vrai si l'utilisateur appui pour pause
pause % 2 = 0 donc faux si il appui un nombre pair de fois,
donc pour enlever la pause, en fonction du résultat,
on enlève ou met la pause avec pause = false ou pause = true */
}
Voila, voila...
Pop70
|
|
mercredi 29 décembre 2010 à 23:56:13 |
Re : compte à rebours en c++ et +

tiouil
|
Magnifique, avec vos superbes explications j'ai tout compris. Vu l'heure tardive je me pencherai plus en détails demain sur ce sujet.
Si je ne laisse plus de messages, c'est que tout s'est bien passé (et je l'espère !!!.
Je vous remercie infiniement pour votre aide.
cldt

|
|
jeudi 30 décembre 2010 à 19:09:26 |
Re : compte à rebours en c++ et +

pop70
|
Tant mieux, mais au cas où il y a encore un problème , j'ai retrouvé un projet SDL que j'avais fait, j'ai remis un code presque similaire, la fenêtre affiche le compte à rebours.  Par contre une seul touche ne marche pas bien (même sans SDL_EnableKeyRepeat()), ça viens peut-être de mon ordi, mais en tout cas pour l'exemple il y a 2 touches.
(Pour compiler le code, il faut arial.ttf dans le même dossier que l'exécutable (on peut la trouver dans ("C:\Windows\Fonts") et la dll SDL_ttf.dll.
Aussi, vu que c'est des touches qui vont gérer la pause, temps_total et Pause() peuvent partir :
Code C/C++ :
#include <SDL.h>
#include <time.h>
#include <iostream>
#include <SDL_ttf.h>
int main(int argc, char *argv[])
{
//***********SDL**************//
SDL_Surface *ecran = NULL, *texte = NULL;
SDL_Init(SDL_INIT_VIDEO);
ecran = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_Flip(ecran);
SDL_Event event;
SDL_Rect posText;
char ch_compt[20] = "";
bool continuer = true;
//***********Variable pour pause *************//
bool pause = false;
int temps_bonus = 15;
int temps_restant = temps_bonus;
int temps_compte = 0;
double temps_ecoule = 0;
double t1 = 0;
double t2 = 0;
//*************Variable Texte ********//
if (TTF_Init() == -1)
{
fprintf(stderr, "Erreur d'initialisation de Arial.ttf : %s\n", TTF_GetError());
exit(EXIT_FAILURE);
}
TTF_Font *police = NULL;
police = TTF_OpenFont("arial.ttf", 25);
SDL_Color couleurRouge = {255, 0, 0};
posText.x = 150;
posText.y = 150;
SDL_BlitSurface(texte, NULL, ecran, &posText);
//************Boucle******************//
while (continuer)
{
SDL_PollEvent(&event);
t1 = t2;
t2 = clock();
temps_ecoule += t2 - t1;
if (temps_ecoule >= 1000) // Si on passe une seconde,
{
temps_ecoule = 0; // On remet temps_ecoule a 0.
if (!pause) // Et si on n'est pas sur pause :
{
temps_compte ++;
temps_restant = temps_bonus - temps_compte; // On descend le temps restant.
sprintf(ch_compt, "Temps restant : %d", temps_restant);
texte = TTF_RenderText_Blended(police, ch_compt, couleurRouge);
if (temps_restant <= 0)
{
continuer = false; // Si le temps restant est inferieur à 0, on stoppe le jeu
}
}
}
if (event.type == SDL_KEYDOWN)
{
if (event.key.keysym.sym == SDLK_UP) // Flèche du haut pour stopper la pause
{
pause = false;
}
if (event.key.keysym.sym == SDLK_DOWN) // Flèche du bas pour l'activer
{
pause = true;
}
if (event.key.keysym.sym == SDLK_ESCAPE) // Echap pour fermer la fenetre
{
continuer = false;
}
}
if (!pause) // Si il n'y a pas la pause :
{
// Les variables de la matrice peuvent-être modifiées ici
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
SDL_BlitSurface(texte, NULL, ecran, &posText);
SDL_Flip(ecran);
}
SDL_FreeSurface(ecran);
SDL_Quit();
return EXIT_SUCCESS;
}
Bon, avec ça devrait aller avec ça
Bon code !
Pop70
|
|
jeudi 30 décembre 2010 à 20:02:35 |
Re : compte à rebours en c++ et +
|
Cette discussion est classée dans : temps, jeu, souhaite, compte, rebours
Répondre à ce message
Sujets en rapport avec ce message
jeux temps reel en ligne [ par cid7777777 ]
Bonjour, j'ai programmer un fps (first person shooter) en c++ opengl , qui se jou en reso local, et par reseau inernet grace aux sockets (que jai mi
Affichage durant un temps donné [ par TeamSo6 ]
Voilà je suis en train de réaliser un jeu memory (le jeu avec les paires qu'il faut retourner), et j'aimerais savoir comment faire pour afficher un ta
Creation d'un jeu de strategie temps reel via le web [ par Thirael ]
Bonjour tout le monde !!! Je souhaiterais creer un jeu de gestion genre oGame. Vous allez me dire encore un autre ... et ben oui !!! lol. J epense qu
menu de jeu [ par crousti42 ]
Bonour tout le monde !!!Je souhaiterais pouvoir créer un menu semblable à ceux que l'on trouve dans les jeux d'aujourd'hui (nouvelle partie, charger p
programmation de jeu de domino... [ par sabrine85 ]
Bonjour,nous avons un nouveau projet à réaliser. Le but est de concevoir un jeu de domino en langage C. En fait, on souhaite écrir
Création du jeu DirectX ou/et OpenGL [ par nico1610 ]
Bonjour à tous, je me présente, Je m'appel Nicolas alias "=SG-Pro= ergo" je fais (à ce titre) parti de l'exélente teams Stargate-Pro et nous sommes à
Înterface graphique [ par Alexkiki ]
Salut à tous Bon, j'ai un gros souci et j'ai besoin d'une grande aide. Je suis programmeur amateur, je programme en C++ ou en Visual Basic (désolé) J'
Activation et désactivation de controle en "masse" [ par Nixeus ]
Bonjour,Je code un petit logiciel en MFC avec visual studio 6.Je voudrais en fait, pouvoir activer ou désactiver des controles en masse si possible (
Détourner un flux de données vers MatLab/SciLab [ par Galmiza ]
Salut,J'ai un flux de données provenant d'une carte d'acquisition. Je souhaite lier ce flux de données à une entrée MatLab (ou SciLab) pour l'utiliser
créé un Os ultra basic [ par smasher81 ]
Bonjour, bonsoir,Dans le but de faire un répondeur téléphonique(terminé.. en c++) avec un modem.. j'aimerai continuer mon aventure en créant un OS qui
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|