Partage
  • Partager sur Facebook
  • Partager sur Twitter

{TUTO} Gestion

Compteur de temps et pause sans la SDL

    25 novembre 2007 à 16:03:21

    Image utilisateur

    Gestion du temps



    Dans ce tuto on va apprendre à connaitre le temps entre 2 points et à faire des pauses sans la SDL.

    Trés utile pour compter le temps (sans blague :p ).

    ___________________________________________________________________________________________________________________

    Tous d'abord pensez à inclure :

    #include <unistd.h>
    #include <time.h>
    


    (Cette header n'est pas dans Visual-C++ mais dans dev-C++.)


    Puis il faut faire une petite fonction à mettre à la fin (une fonction quoi):

    void sleep(int nbr_seconds)
    {
        clock_t goal;
     
        goal = (nbr_seconds * CLOCKS_PER_SEC) + clock();
     
        while(goal > clock())
        {
            ;
        }
    }
    


    Mais n'oublier pas de mettre aprés les include :

    void sleep(int nbr_seconds);
    


    puis pour faire des pauses mettez cette fonction :

    sleep();
    

    Et entre les parenthèses mettez le temps à attendre en seconde.

    exemple :
    sleep(2);//Permet d'attendre 2 secondes.
    

    ___________________________________________________________________________________________________________________

    Le compteur



    Pour faire un compteur il faut inclure :

    #include <time.h> //Comme avant
    


    Le prototype de la fonction est :

    double difftime(time_t time2, time_t time1);
    


    Et faire au minimun deux variables de type :

    time_t
    


    exemple :

    time_t t1, t2 ;
    


    Puis faire le debut du compteur avec :

    t1 = time(NULL); //Demarage de du compteur t1
    /*blablabla*/
        t2 = time(NULL); //Demarrage du compteur t2
     
    printf ("t1 et t2 sont séparés de %.0lf secondes.", difftime(t2, t1) ); //différence entre les 2 compteurs
    


    Si vous mettez un
    sleep(2);
    
    Entre t1 = time(NULL); et t2 = time(NULL);

    Le code seras :

    t1 = time(NULL); //Demarage de du compteur t1
    sleep(2);
        t2 = time(NULL); //Demarrage du compteur t2
     
    printf ("t1 et t2 sont séparés de %.0lf secondes.", difftime(t2, t1) );//différence entre les 2 compteurs.
    


    Mais pensez à include :

    #include <unistd.h>//Pour faire les sleep();
    #include <time.h>
    


    Et on aura :

    t1 et t2 sont séparés de 2 secondes.


    ___________________________________________________________________________________________________________________

    La pratique



    Pour voir si vous avais bien apris ce tuto fait un compteur de temps dans le jeux + ou - .

    Tenez la reponce bande de Zéro :lol: :
    Secret (cliquez pour afficher)
    /*
     
    Plus ou Moins
    -------------
     
    Réalisé par M@teo21, pour les cours du Site du Zér0
    <lien url="www.siteduzero.com">www.siteduzero.com</lien> (cours de programmation en C / C++ pour débutants)
     
    Création le : 20/12/2005
     
    Ameliorer par Gregoiregrim avec la gestion du temps.
     
    */
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h> //Pour srand et difftime
     
     
    int main ( int argc, char** argv )
    {
        long nombreMystere = 0, nombreEntre = 0;
        const long MAX = 100, MIN = 1;
            time_t t1, t2;
     
        // Génération du nombre aléatoire
     
        srand(time(NULL));
        nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
     
        /* La boucle du programme. Elle se répète tant que l'utilisateur
        n'a pas trouvé le nombre mystère */
                    t1 = time(NULL); //inisialisation du compteur 1
        do
        {
            // On demande le nombre
            printf("Quel est le nombre ? ");
            scanf("%ld", &nombreEntre);
     
            // On compare le nombre entré avec le nombre mystère
     
            if (nombreMystere > nombreEntre)
                printf("C'est plus !\n\n");
            else
                printf("C'est moins !\n\n");
        } while (nombreEntre != nombreMystere);
     
                                    t2 = time(NULL); //inisialisation du compteur 2
                printf ("Bravo, vous avez trouve le nombre mystere en %.0lf secondes.!!!\n\n", difftime(t2, t1) ); //différence entre les 2 compteurs.
     
        system("PAUSE");
        return 0;
    }
    


    J'ai eu une grosse flême donc j'ai jusque fais un copier collé du code de M@teo :D .

    ___________________________________________________________________________________________________________________
    J'èspère que ce tuto vous à plus.

    Voici un exemple de programme fais avec time.h (pas unistd.h parce que j'ai Visual C++ ^^) Lien

    Image utilisateur

    Nésiter pas à mettre vos commantaire ;) .
    • Partager sur Facebook
    • Partager sur Twitter
      25 novembre 2007 à 16:49:52

      Euhh....
      C pas ds forum que l'on met les tutos.
      Regarde dans : Mon compte : mes tutoriels, à gauche de la page web du sdz.
      • Partager sur Facebook
      • Partager sur Twitter
        25 novembre 2007 à 16:54:02

        Slt,
        C'est cool ton truc. Je ne conaissai pas, je vais essayer de suite... :D
        • Partager sur Facebook
        • Partager sur Twitter
          25 novembre 2007 à 17:25:02

          Citation : gogohan

          Euhh....
          C pas ds forum que l'on met les tutos.
          Regarde dans : Mon compte : mes tutoriels, à gauche de la page web du sdz.



          Je sait mais on me l'as pas accepter c'étais trop court et sa expliquer une partie infime du langage alors pas accepter ^^

          (Surveille ton langage : C pas ds forum que l'on met les tutos. --> C'est pas dans le forum que l'on met les tutos.
          • Partager sur Facebook
          • Partager sur Twitter
            25 novembre 2007 à 21:11:27

            Manque un return 0;. Pour l'affichage tu temps à la fin, je pense qu'il est plus esthétique de virer les zéros en trop après la virgule. Donc pour le format : %.xlf (x est à remplacer par le nombre de chiffres à écrire après la virgule).
            • Partager sur Facebook
            • Partager sur Twitter
              25 novembre 2007 à 22:57:15

              ok
              Merci
              Je corrige

              PS les pause ne marcher pas avant maintenant elle marche !!!
              • Partager sur Facebook
              • Partager sur Twitter
                30 novembre 2007 à 22:53:27

                Citation : Gregoiregrim

                Citation : gogohan

                Euhh....
                C pas ds forum que l'on met les tutos.
                Regarde dans : Mon compte : mes tutoriels, à gauche de la page web du sdz.



                Je sait mais on me l'as pas accepter c'étais trop court et sa expliquer une partie infime du langage alors pas accepter ^^

                (Surveille ton langage : C pas ds forum que l'on met les tutos. --> C'est pas dans le forum que l'on met les tutos.


                Je dirais la même chose pour ton orthographe, avant de rappeler les règles, il est bon de les respecter. :-°
                • Partager sur Facebook
                • Partager sur Twitter
                  1 décembre 2007 à 10:49:08

                  Je passais juste par là (je programme pas souvent en C), mais il me semble que faire une pause à l'aide d'une boucle est une très mauvaise, tout langage de programmation confondu ;)

                  Il doit y avoir des solutions plus propres qui ne bouffent pas le cpu à 100% pour bosser dans le vide.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 décembre 2007 à 0:39:38

                    Citation : Tortue facile

                    Citation : Gregoiregrim

                    Citation : gogohan

                    Euhh....
                    C pas ds forum que l'on met les tutos.
                    Regarde dans : Mon compte : mes tutoriels, à gauche de la page web du sdz.



                    Je sait mais on me l'as pas accepter c'étais trop court et sa expliquer une partie infime du langage alors pas accepter ^^

                    (Surveille ton langage : C pas ds forum que l'on met les tutos. --> C'est pas dans le forum que l'on met les tutos.


                    Je dirais la même chose pour ton orthographe, avant de rappeler les règles, il est bon de les respecter. :-°



                    Oui mais moi je fais pas du SMS et je suis présque nul en francais
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 janvier 2008 à 18:30:33

                      salut , sympa ton tuto , je veut faire un conteur pour un jeux , j'ai une fonction jouer .c

                      :
                      1. #include <stdlib.h>
                      2. #include <stdio.h>
                      3. #include <SDL/SDL.h>
                      4. #include <SDL/SDL_image.h>
                      5. #include <SDL/SDL_ttf.h>
                      6. <souligne>#include <time.h></souligne>
                      7. #include "constantes.h"
                      8. #include "jeu.h"
                      9. Uint32 compterScore(Uint32 intervalle, void *tempsActuel);
                      10. void jouer(SDL_Surface* ecran)
                      11. {
                      12.     SDL_Surface *mario[4] = {NULL}; // 4 surfaces pour chacune des directions de mario
                      13.     SDL_Surface *mur = NULL, *acceleration = NULL, *arme = NULL, *objectif = NULL, *objectif_ok = NULL, *marioActuel = NULL, *cloison = NULL;
                      14.     SDL_Surface *texte = NULL , *bravo = NULL;
                      15.     SDL_Rect position, positionJoueur, positionBravo;
                      16.     SDL_Event event;
                      17.     int continuer = 1, objectifsRestants = 0, i = 0, j = 0;
                      18.     int tempsActuel = 0, tempsPrecedent = 0;
                      19.     int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
                      20.     <souligne>time_t t1, t2;</souligne>
                      21. <citation nom="code">blblabla</citation>
                      22.  t1 = time(NULL);
                      23. <citation nom="code">blablabla</citation>
                      24.  if (!objectifsRestants)
                      25.         {
                      26.             continuer = 0;
                      27.             t2 = time(NULL);
                      28.             tempsActuel = difftime(t2, t1);
                      29.             sauvegarderScore(tempsActuel);
                      30.             SDL_BlitSurface(bravo , NULL, ecran , &positionBravo);
                      31.             SDL_Flip(ecran);
                      32.             SDL_Delay(1000);
                      33.         }


                      et une fonction sauvegarderScore :
                      1. #include <stdlib.h>
                      2. #include <stdio.h>
                      3. #include <SDL/SDL.h>
                      4. #include <SDL/SDL_image.h>
                      5. #include <SDL/SDL_ttf.h>
                      6. #include <time.h>
                      7. #include "constantes.h"
                      8. #include "score.h"
                      9.  void sauvegarderScore(int tempsActuel)
                      10.  {
                      11.    FILE *fichier = NULL;
                      12.    int tempsSecondes = 0;
                      13.    tempsSecondes = tempsActuel;
                      14.    fichier = fopen("score.txt", "a+");
                      15.    fprintf(fichier, "%.0lf", tempsSecondes);
                      16.    tempsActuel = 0;
                      17.    tempsSecondes = 0;
                      18.    fclose(fichier);
                      19.  }


                      Quabnd je regarde ce qu'il y a d'ecris dans mon fichier apresla partie , il y a marqué 0 alors que cela fait plusieurs secondes que je joue !... voila si tu peut m'aider!
                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 janvier 2008 à 22:13:48

                        A euh peut être que ca va changer utilise les pointeur sur :
                        1. void sauvegarderScore(int tempsActuel)

                        en faisant :
                        1. #include <SDL/SDL.h>
                        2. #include <SDL/SDL_image.h>
                        3. #include <SDL/SDL_ttf.h>
                        4. #include <time.h>
                        5. #include "constantes.h"
                        6. #include "score.h"
                        7.  void sauvegarderScore(int* tempsActuel)
                        8.  {
                        9.    FILE *fichier = NULL;
                        10.    fichier = fopen("score.txt", "a+");
                        11.    fprintf(fichier, "%.0lf", &tempsSecondes);
                        12.    &tempsActuel = NULL;
                        13.    fclose(fichier);
                        14.  }


                        Mais change aussi
                        1. sauvegarderScore(tempsActuel);

                        En
                        1. sauvegarderScore(&tempsActuel);


                        J'èspère que ca marche.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 janvier 2008 à 22:55:04

                          Citation : Eclyps

                          A euh peut être que ca va changer utilise les pointeur sur :

                          1. void sauvegarderScore(int tempsActuel)


                          en faisant :

                          1. #include <SDL/SDL.h>
                          2. #include <SDL/SDL_image.h>
                          3. #include <SDL/SDL_ttf.h>
                          4. #include <time.h>
                          5. #include "constantes.h"
                          6. #include "score.h"
                          7.  void sauvegarderScore(int* tempsActuel)
                          8.  {
                          9.    FILE *fichier = NULL;
                          10.    fichier = fopen("score.txt", "a+");
                          11.    fprintf(fichier, "%.0lf", &tempsSecondes);
                          12.    &tempsActuel = NULL;
                          13.    fclose(fichier);
                          14.  }

                          Non seulement ça ne compile pas, mais en plus, on a vraiment l'impression que tu tâtonnes et que tu n'as aucune idée de ce que tu écris (utiliser "&tempsActuel" comme l-value par exemple...).

                          Si tu ne sais pas, ce n'est pas grave, mais ne réponds pas n'importe quoi.

                          lefouleo, je te conseille d'ouvrir un nouveau topic pour ton problème, ce serait plus simple.

                          Pour te répondre,
                          1. fprintf(fichier, "%.0lf", tempsSecondes);

                          tu utilises le formateur "%lf" (qui n'existe qu'en C99 au passage) alors que tempsSecondes est de type int. Tu dois donc utiliser le formateur %d.

                          De plus, tu ne testes pas si l'ouverture du fichier a réussi (fopen() pourrait très bien renvoyer NULL), çay mal.

                          Ce qui donnerait (par exemple) :

                          1. #include <stdio.h>
                          2. void sauvegarder (int score)
                          3. {
                          4.     FILE* fichier = fopen ("score.txt", "a+");
                          5.     if (fichier != NULL)
                          6.     {
                          7.         fprintf (fichier, "%d\n", score);
                          8.         fclose (fichier), fichier = NULL;
                          9.     }
                          10.     else
                          11.     {
                          12.         fprintf (stderr, "Impossible d'ouvrir le fichier \"score.txt\".\n");
                          13.     }
                          14. }


                          Sinon, pour en revenir au sujet initial, l'utilisation d'une attente active (100% du CPU utilisé pour faire des NOP) pour mettre un programme en pause est une pratique datant des dinosaures (DOS...). Dans un contexte multitâche, c'est à bannir totalement. Pour faire une pause, on utilise Sleep() sous Windows (windows.h) ou msleep() sous unixoïde (unistd.h).

                          Un moyen simple de rendre le code portable est d'utiliser une macro présente sur le site de -ed-.
                          1. #ifndef H_ED_PSLEEP
                          2. #define H_ED_PSLEEP
                          3. #if defined (WIN32)
                          4. #include <windows.h>
                          5. #define msleep(ms) Sleep(ms)
                          6. #elif defined (linux)
                          7. #include <unistd.h>
                          8. #define msleep(ms) usleep((ms) * 1000)
                          9. #endif
                          10. #endif /* guard */
                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 janvier 2008 à 23:11:59

                            C'est normale que je tatonne je c'est pas ce que j'écris c'est juste un truc que j'ai trouver ^^
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 janvier 2008 à 1:59:45

                              Citation : Eclyps

                              C'est normale que je tatonne je c'est pas ce que j'écris c'est juste un truc que j'ai trouver ^^



                              Alors tu n'écris rien, au lieu de raconter des conneries!
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 janvier 2008 à 10:50:28

                                Citation : Eclyps

                                Dans ce tuto on va apprendre à connaitre le temps entre 2 points et à faire des pauses sans la SDL.
                                <...>
                                Nésiter pas à mettre vos commantaire ;) .


                                Le titre du message est incomplet.

                                Citation : Pas de titre

                                1. #include <unistd.h>


                                pas standard.

                                Sous Windows, c'est <windows.h> et on utilise Sleep(). Pour être portable :

                                http://delahaye.emmanuel.free.fr/clib/psleep/

                                Citation : Pas de titre

                                1. void sleep(int nbr_seconds)
                                2. {
                                3.     clock_t goal;
                                4.     goal = (nbr_seconds * CLOCKS_PER_SEC) + clock();
                                5.     while(goal > clock())
                                6.     {
                                7.         ;
                                8.     }
                                9. }

                                Attention sleep(), bien que non standard C est standard POSIX.1. J'éviterais donc de tenter le diable et de provoquer des collisions de noms...
                                Pas de suspension dans la boucle ? Tu occupes le CPU à 100%. C'est voulu ?

                                C'est pas bien fameux tout ça. Pourquoi réinventer la roue ? Avec le Sleep() de Windows et le usleep() des unixoides, on fait des suspensions passives en ms tout à fait satisfaisantes.

                                Si tu veux faire un boucle de polling avec suspension, c'est autre chose.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Music only !
                                  16 janvier 2008 à 12:08:14

                                  ok merci de votre aide maitreZur, j'ai bien fait un %d , ca marche mais il m'arrive des choses etranges quand je regarde mon fichier score.txt apres quelques tests , voila ce que je vois :

                                  Citation : score.txt

                                  11
                                  110
                                  213
                                  336
                                  1
                                  12
                                  32
                                  46



                                  la partie du fichier ou il ya des centaines c'etais quand mon tempsActuel etais / 100 .
                                  apres c'est quand il est /1000.
                                  ca ne correspond exactement pas au score que j'ai calculé en secondes en jouant , de plus il semblera que le SDL_GetTicks() continue meme quand je suis dans le menu , pouvez vous m'aider?

                                  merci.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 janvier 2008 à 12:31:43

                                    Citation : lefouleo

                                    apres quelques tests , voila ce que je vois :

                                    Citation : score.txt

                                    11
                                    110
                                    213
                                    336
                                    1
                                    12
                                    32
                                    46


                                    la partie du fichier ou il ya des centaines c'etais quand mon tempsActuel etais / 100 .
                                    apres c'est quand il est /1000.
                                    ca ne correspond exactement pas au score que j'ai calculé en secondes en jouant


                                    Sans ton code, je vais avoir du mal à t'aider... Crée un nouveau topic en postant ton code complet, ce sera plus simple.

                                    Citation : lefouleo

                                    de plus il semblera que le SDL_GetTicks() continue meme quand je suis dans le menu

                                    SDL_GetTicks() te renvoie le nombre de millisecondes qui se sont écoulées depuis l'appel du dernier SDL_Init(). Que tu fasses une pause ou pas, ça ne change rien...
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    {TUTO} Gestion

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown