IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

[SDL-jeux]problème gestion de temps


Sujet :

SDL

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut [SDL-jeux]problème gestion de temps
    bonjour à tous,

    je suis en train de développer(ou de créer ça revient au même )un jeu de tir(sorte visuer qui bouge avec la souris et qui met du son lorsqu'on appuie sue le bouton et tous ce bazar),j'ai voulu que je fasse une gestion du temps pour que je puisse enregistrer les meilleurs temps comme des scores,donc j'ai essayer de faire çela avec SDL_GetTicks() mais ça me donne pas le résultat que je veux
    donc j'ai besoin de votre aide:comment on fait un compteur de temps qui marche en secondes et qui s'affiche au fur et à mesure de l'avancement du temps et qui se lance du zéro au début du jeu et de chaque niveau?? je veux pas du code tout prêt je veux juste des idées(algo en autre mot )et les commandes qu'il faut utiliser avec leurs librairies

    et merci beaucoup

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Et bien ce sera forcément à partir de SDL_GetTicks...

    Ensuite, il suffit de stocker la valeur au début du jeu/niveau et faire une soustraction avec le temps actuel. Ensuite, pour avoir les secondes il faut diviser par 1000.

    Jc

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tempsActuel = SDL_GetTicks();
     
    tempsActuel = (tempsActuel/1000) - (tempsDebut/1000);
     
    sprintf(temps,"%d", tempsActuel);
     
    texteTemps = TTF_RenderText_Blended(police2, temps, couleurJeSaisPas);
     
    SDL_BlitSurface(texteTemps, NULL, ecran, &positionTexteTemps);

    pour afficher en seconde,c'est simple
    ces bout de code m'affiche le temps passé dès le lancement du 1er stage,lorsqu'on gagne et on passe au 2ème stage le temps ne se remet pas à zero,c'est ça mon problème

    aussi le compteur ne s'actualise(affiche le nombre de seconde)si seulement si ilya un evenement,si la sourie ne bouge pas et je touche pas le clavier le temps affiché reste constant et quand je fais quelque chose il affiche le temps normal(c-a-d il continue à compter mais il ne l'affiche pas que lorsque un évènement se produit),c'est mon 2ème problème

    et merci beaucoup

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par men1n2 Voir le message
    pour afficher en seconde,c'est simple
    ces bout de code m'affiche le temps passé dès le lancement du 1er stage,lorsqu'on gagne et on passe au 2ème stage le temps ne se remet pas à zero,c'est ça mon problème
    Remet tempsDebut à jour à l'entrée du deuxième stage.

    aussi le compteur ne s'actualise(affiche le nombre de seconde)si seulement si ilya un evenement,si la sourie ne bouge pas et je touche pas le clavier le temps affiché reste constant et quand je fais quelque chose il affiche le temps normal(c-a-d il continue à compter mais il ne l'affiche pas que lorsque un évènement se produit),c'est mon 2ème problème
    Tu utilises donc SDL_WaitEvent, passes à SDL_PollEvent et du coups tu pourras réactualiser l'affichage et ce calcul peu importe s'il y a eu un événement.

    Jc

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    Remet tempsDebut à jour à l'entrée du deuxième stage.



    Tu utilises donc SDL_WaitEvent, passes à SDL_PollEvent et du coups tu pourras réactualiser l'affichage et ce calcul peu importe s'il y a eu un événement.

    Jc
    merci pour l'idée pour la reinitialisation du temps,ça marche

    mais j'ai mis PollEvent mais comme ça le CPU est utilisé à 98% par mon jeu,l'ordinateur rame...y'a pas une autre solution??

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par men1n2 Voir le message
    merci pour l'idée pour la reinitialisation du temps,ça marche

    mais j'ai mis PollEvent mais comme ça le CPU est utilisé à 98% par mon jeu,l'ordinateur rame...y'a pas une autre solution??
    Cela rame sûrement parce que tu as mal programmé ton système à cause du fait que SDL_WaitEvent bloquer tout... Modifie ton code pour que s'il n'y a pas de nouvel événement, seul la mise à jour du compteur et le réaffichage se fait.

    Jc

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    Cela rame sûrement parce que tu as mal programmé ton système à cause du fait que SDL_WaitEvent bloquer tout... Modifie ton code pour que s'il n'y a pas de nouvel événement, seul la mise à jour du compteur et le réaffichage se fait.

    Jc
    explique un peu plu car j'ai pas trouvé comment je fais(dsl si je pose beaucoup de question,j'ai pas une grande carrière dans la programmation,ce sont juste 6-7 semaines c'est tout)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par men1n2 Voir le message
    mais j'ai mis PollEvent mais comme ça le CPU est utilisé à 98% par mon jeu,l'ordinateur rame...y'a pas une autre solution??
    En quoi, est ce un problème ? Sinon il est possible d'utiliser la fonction SDL_Delay(...), pour limiter l'occupation du CPU

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par men1n2 Voir le message
    mais j'ai mis PollEvent mais comme ça le CPU est utilisé à 98% par mon jeu,l'ordinateur rame...y'a pas une autre solution??
    nan les programmes qui utilisent Direct X ,SDL sollicitent énormément le CPU.
    Le jeu est il en mode fenêtré ?
    Si tel est le cas c'est normal que le CPU soit sollicité parce que sous Windows notamment , SDL utilise Direct X et des surfaces DirectDraw qui demandent une certaine exclusivité de traitement ( mode coopératif avec le GDI )
    Comme l'OS doit fréquemment commuter de tâches entre les applications et que les surfaces SDL requièrent de la puissance c'est pour cette raison que l'utilisation CPU grimpe.
    En plein écran le CPU est moins sollicité ou alors si on veut faire du fenêtré il faut utiliser des petites résolutions genre 640x480 mais les graphismes seront moins bien

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Bibicy Voir le message
    En quoi, est ce un problème ? Sinon il est possible d'utiliser la fonction SDL_Delay(...), pour limiter l'occupation du CPU
    nn je peut pas car le programme doit pas s'arreter,comme j'ai dit c'est un jeu de tir,le visuer doit bouger avec la souris tout le temps
    Citation Envoyé par Mat.M Voir le message
    nan les programmes qui utilisent Direct X ,SDL sollicitent énormément le CPU.
    Le jeu est il en mode fenêtré ?
    Si tel est le cas c'est normal que le CPU soit sollicité parce que sous Windows notamment , SDL utilise Direct X et des surfaces DirectDraw qui demandent une certaine exclusivité de traitement ( mode coopératif avec le GDI )
    Comme l'OS doit fréquemment commuter de tâches entre les applications et que les surfaces SDL requièrent de la puissance c'est pour cette raison que l'utilisation CPU grimpe.
    En plein écran le CPU est moins sollicité ou alors si on veut faire du fenêtré il faut utiliser des petites résolutions genre 640x480 mais les graphismes seront moins bien
    c'est une fenêtre 500X400,pas de problème de graphisme(juste un arrière plan , un viseur et un spirite qui bouge),lorsque je met SDL_WaitEvent ça n'utilise pas beaucoup de CPU(2-5%) malgré que je bouge la souris tout le temps

    alors y'a pa de solution??même un exemple proche ou un bout de code j'accepte

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par men1n2 Voir le message
    nn je peut pas car le programme doit pas s'arreter,comme j'ai dit c'est un jeu de tir,le visuer doit bouger avec la souris tout le temps
    En mettant un delai faible, genre SDL_Delay(25), je pense que tu peux avoir le même résultat, tout en réduisant l'occupation du CPU.

    Citation Envoyé par men1n2 Voir le message
    alors y'a pa de solution??même un exemple proche ou un bout de code j'accepte
    A la rigueur poste ton code (y a une balise pour), ça aidera à te conseiller. Tu peux peut-être essayer d'utiliser WaitEvent + un thread pour mesurer le temp, mais je déconseille cette solution.

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Bibicy Voir le message
    En mettant un delai faible, genre SDL_Delay(25), je pense que tu peux avoir le même résultat, tout en réduisant l'occupation du CPU.



    A la rigueur poste ton code (y a une balise pour), ça aidera à te conseiller. Tu peux peut-être essayer d'utiliser WaitEvent + un thread pour mesurer le temp, mais je déconseille cette solution.
    j'ai essayer mais y'a un gros problème:lorsque je laisse le bouton de la souris appuié le nombre de cartouches diminue en vitesse et la partie se termine(car nombre de cartouches limités)
    bon pour le code source je pense pas que c'est une bonne idée car il est gros et pas de comments mais le voilà en tout cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <FMOD/fmod.h>
    #include <SDL/SDL_ttf.h>
     
    #include "constantes.h"
     
     
     
    void jouer(SDL_Surface* ecran)
    {
            SDL_Surface *ecran1 = NULL, *arriere = NULL, *viseur = NULL, *target = NULL,*texte = NULL, *texteGagne = NULL, *texteCartouches = NULL, *texteTemps = NULL;
            SDL_Rect positionArriere,positionViseur,positionTarget,positionTexte,positionTexteGagne,positionTexteCartouches,positionTexteTemps,positionTexteTermine;
            SDL_Event event;
            SDL_Color couleurRouge = {255, 0, 0}, couleurJeSaisPas = {0, 0, 0};
            FMUSIC_MODULE *musique = NULL;
            FSOUND_SAMPLE *tir = NULL;
            TTF_Font *police1 = NULL, *police2 = NULL;
            FILE* fichierStage = NULL;
            char nombreDeFois[5] = "", nombreDeCartouches[5] = "", temps[20] = "";
            int continuer = 1, compteur = 0, limite = 10, nombreCartouches = 15, stage = 1;
            int tempsActuel = 0, tempsDebut =0;
            long random = 0, random2 = 0;
            srand(time(NULL));
            arriere = IMG_Load("mario.jpg");
            viseur = IMG_Load("viseur.png");
            target = IMG_Load("mario2.gif");
            ecran1=ecran;
            positionArriere.x = 0;
            positionArriere.y = 0;
            positionViseur.x = 200-16;
            positionViseur.y = 200-16;
            random = (rand() % ((400-16) - 16 + 1)) + 16;
            random2 = (rand() % ((400-16) - 16 + 1)) + 16;
            positionTarget.x = random;
            positionTarget.y = random2;
            positionTexte.x = 120;
            positionTexte.y = 6;
            positionTexteGagne.x = 110;
            positionTexteGagne.y = 190;
            positionTexteCartouches.x = 252;
            positionTexteCartouches.y = 28;
            positionTexteTemps.x = 517;
            positionTexteTemps.y = 30;
            positionTexteTermine.x = 180;
            positionTexteTermine.y = 180;
            musique = FMUSIC_LoadSong("mario.mid");
            tir = FSOUND_Sample_Load(FSOUND_FREE, "gun.wav", 0, 0, 0);
            FMUSIC_SetMasterVolume(musique, 60);
            police1 = TTF_OpenFont("comic.ttf", 32);
            police2 = TTF_OpenFont("graffiti.ttf", 22);
            fichierStage = fopen("stage.stg", "r");
            // Effacement de l'écran
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
            SDL_BlitSurface(arriere, NULL, ecran, &positionArriere);
            SDL_BlitSurface(texteCartouches, NULL, ecran, &positionTexteCartouches);
            SDL_BlitSurface(texteTemps, NULL, ecran, &positionTexteTemps);
            SDL_BlitSurface(target, NULL, ecran, &positionTarget);
            SDL_BlitSurface(viseur, NULL, ecran, &positionViseur);
            SDL_Flip(ecran1);
            SDL_ShowCursor(SDL_DISABLE);
            FMUSIC_PlaySong(musique);
            FMUSIC_SetLooping(musique, 1);
            tempsDebut = SDL_GetTicks();
     
            while(continuer)
            {
                if ((event.active.state & SDL_APPACTIVE) == SDL_APPACTIVE || (event.active.state & SDL_APPINPUTFOCUS) == SDL_APPINPUTFOCUS)
                {
            if (FMUSIC_GetPaused(musique)) // Si la chanson est en pause
                FMUSIC_SetPaused(musique, 0); // On enlève la pause
            else // Sinon, elle est en cours de lecture
                FMUSIC_SetPaused(musique, 1); // On met en pause
            }
            //Start the timer
            tempsActuel = SDL_GetTicks();
     
     
            SDL_WaitEvent(&event);
            switch(event.type)
            {
     
                    case SDL_QUIT:
                    FMUSIC_StopSong(musique);
                    continuer = 0;
                    break;
                    case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
                    FMUSIC_StopSong(musique);
                    continuer = 0;
                    break;
                }
     
                 break;
                 case SDL_MOUSEMOTION:
                    /* Lorsqu'on déplace la souris, on place le centre du viseur à la position de la souris
                    ... D'où notamment le "viseur->w / 2" pour réussir à faire cela */
                    positionViseur.x = event.motion.x -(viseur->w / 2);
                    positionViseur.y = event.motion.y -(viseur->h / 2);
                    break;
                 case SDL_MOUSEBUTTONDOWN:
                    /* Lorqu'on clique, on joue le son */
                    FSOUND_PlaySound(FSOUND_FREE, tir);
                    nombreCartouches --;
                    sprintf(nombreDeCartouches,"%d", nombreCartouches);
                    SDL_FreeSurface(texteCartouches);
                    texteCartouches = TTF_RenderText_Blended(police2, nombreDeCartouches, couleurJeSaisPas);
                    if( positionViseur.x>=positionTarget.x-16  && positionViseur.x<=positionTarget.x+16 && positionViseur.y>=positionTarget.y-16 && positionViseur.y<=positionTarget.y+16){
                        positionTarget.x = (rand() % ((400-32) - 32 + 1)) + 32;
                        positionTarget.y = (rand() % ((400-32) - 32 + 1)) + 32;
                        compteur++;
                        sprintf(nombreDeFois,"%d", compteur);
                        SDL_FreeSurface(texte); /* On supprime la surface précédente de la mémoire avant d'en charger une nouvelle (IMPORTANT) */
                        texte = TTF_RenderText_Blended(police2, nombreDeFois, couleurJeSaisPas);
                    break;
             }
     
            }
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
            SDL_BlitSurface(arriere, NULL, ecran, &positionArriere);
            SDL_BlitSurface(target, NULL, ecran, &positionTarget);
            SDL_BlitSurface(texte, NULL, ecran, &positionTexte);
            SDL_BlitSurface(texteCartouches, NULL, ecran, &positionTexteCartouches);
            SDL_BlitSurface(texteTemps, NULL, ecran, &positionTexteTemps);
            SDL_BlitSurface(viseur, NULL, ecran, &positionViseur);
             if (compteur == limite && limite<50){
            texteGagne = TTF_RenderText_Blended(police1,"Gagné,Appuiyez sur Entrée", couleurRouge);
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
            SDL_BlitSurface(arriere, NULL, ecran, &positionArriere);
            SDL_BlitSurface(texteGagne, NULL, ecran, &positionTexteGagne);
            SDL_WaitEvent(&event);
             switch(event.type)
            {
                case SDL_QUIT:
                FMUSIC_StopSong(musique);
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                      case SDLK_RETURN:
                      compteur = 0;
                      stage ++ ;
                      tempsActuel = SDL_GetTicks();
                      tempsDebut = SDL_GetTicks();
                      switch(stage)
                      {
                          case 2 :
                          nombreCartouches += 20;
                          break;
                          case 3 :
                          nombreCartouches += 30;
                          break;
                          case 4 :
                          nombreCartouches += 40;
                          break;
                          case 5 :
                          nombreCartouches += 50;
                          break;
                      }
                      limite += 10;
     
                        }
                        }
     
     
                        }
                        if (compteur == limite && limite == 50 || nombreCartouches == 0){
                            texteGagne = TTF_RenderText_Blended(police1,"Terminée", couleurRouge);
                            SDL_BlitSurface(texteGagne, NULL, ecran, &positionTexteTermine);
                            SDL_Flip(ecran1);
                            SDL_Delay(3000);
                            FMUSIC_StopSong(musique);
                            continuer = 0;
                        }
            tempsActuel = (tempsActuel/1000) - (tempsDebut/1000);
            sprintf(temps,"%d", tempsActuel);
            texteTemps = TTF_RenderText_Blended(police2, temps, couleurJeSaisPas);
            SDL_Flip(ecran1);
     
     
     
     
     
            }
            FMUSIC_FreeSong(musique);
            fclose(fichierStage);
    }
    PS:ne vous interessez pas par le fichier car c'est pour futur option de sauvgarder

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bonjour,

    Voici mes remarques sur le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    void jouer(SDL_Surface* ecran)
    {
        SDL_Surface *ecran1 = NULL, *arriere = NULL, *viseur = NULL, *target = NULL,*texte = NULL, *texteGagne = NULL, *texteCartouches = NULL, *texteTemps = NULL;
        SDL_Rect positionArriere,positionViseur,positionTarget,positionTexte,positionTexteGagne,positionTexteCartouches,positionTexteTemps,positionTexteTermine;
        SDL_Event event;
        SDL_Color couleurRouge = {255, 0, 0}, couleurJeSaisPas = {0, 0, 0};
        FMUSIC_MODULE *musique = NULL;
        FSOUND_SAMPLE *tir = NULL;
        TTF_Font *police1 = NULL, *police2 = NULL;
        FILE* fichierStage = NULL;
        char nombreDeFois[5] = "", nombreDeCartouches[5] = "", temps[20] = "";
        int continuer = 1, compteur = 0, limite = 10, nombreCartouches = 15, stage = 1;
        int tempsActuel = 0, tempsDebut =0;
        long random = 0, random2 = 0;
    C'est trop de paramètres. Cela montre un grand problème de conception car il est vraiment rare d'avoir besoin d'autant de choses dans une même fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        srand(time(NULL));
    Choix discutable de mettre ceci ici. Je suppose que ta fonction est appelée une seule fois par le programme donc pourquoi pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        arriere = IMG_Load("mario.jpg");
        viseur = IMG_Load("viseur.png");
        target = IMG_Load("mario2.gif");
    Aucun test de retour, il faut tester le retour des fonctions SDL.

    Je ne vois pas l'intérêt d'avoir ecran1...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
        positionArriere.x = 0;
        positionArriere.y = 0;
        positionViseur.x = 200-16;
        positionViseur.y = 200-16;
        random = (rand() % ((400-16) - 16 + 1)) + 16;
        random2 = (rand() % ((400-16) - 16 + 1)) + 16;
        positionTarget.x = random;
        positionTarget.y = random2;
        positionTexte.x = 120;
        positionTexte.y = 6;
        positionTexteGagne.x = 110;
        positionTexteGagne.y = 190;
        positionTexteCartouches.x = 252;
        positionTexteCartouches.y = 28;
        positionTexteTemps.x = 517;
        positionTexteTemps.y = 30;
        positionTexteTermine.x = 180;
        positionTexteTermine.y = 180;
    Ah non ! C'est quoi ces valeurs ? On met tout cela dans un joli fichier et on le charge. Soit c'est un code en création mais cela n'est pas une excuse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        musique = FMUSIC_LoadSong("mario.mid");
        tir = FSOUND_Sample_Load(FSOUND_FREE, "gun.wav", 0, 0, 0);
        FMUSIC_SetMasterVolume(musique, 60);
        police1 = TTF_OpenFont("comic.ttf", 32);
        police2 = TTF_OpenFont("graffiti.ttf", 22);
        fichierStage = fopen("stage.stg", "r");
    On teste tous ces retours. Il faut être sûr que tout c'est bien passé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        // Effacement de l'écran
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        SDL_BlitSurface(arriere, NULL, ecran, &positionArriere);
        SDL_BlitSurface(texteCartouches, NULL, ecran, &positionTexteCartouches);
        SDL_BlitSurface(texteTemps, NULL, ecran, &positionTexteTemps);
        SDL_BlitSurface(target, NULL, ecran, &positionTarget);
        SDL_BlitSurface(viseur, NULL, ecran, &positionViseur);
        SDL_Flip(ecran1);
        SDL_ShowCursor(SDL_DISABLE);
        FMUSIC_PlaySong(musique);
        FMUSIC_SetLooping(musique, 1);
        tempsDebut = SDL_GetTicks();
    Cela a un intérêt car tu as utiliser SDL_WaitEvent, mais si tu mettais ton code de rendu au début de ta boucle générale, ce ne serait pas nécessaire.

    Ensuite, je fais remarquer que texteTemps est NULL pour le moment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            if ((event.active.state & SDL_APPACTIVE) == SDL_APPACTIVE || (event.active.state & SDL_APPINPUTFOCUS) == SDL_APPINPUTFOCUS)
            {
                if (FMUSIC_GetPaused(musique)) // Si la chanson est en pause
                    FMUSIC_SetPaused(musique, 0); // On enlève la pause
                else // Sinon, elle est en cours de lecture
                    FMUSIC_SetPaused(musique, 1); // On met en pause
            }
    Soit je comprends le code mais je fais remarquer que le but d'un masque binaire est que l'égalité n'est pas nécessaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            if ((event.active.state & SDL_APPACTIVE) != 0)
    Suffit.

    Par contre :
    - Ce test est fait avant un seul SDL_WaitEvent/SDL_PollEvent sur une variable non initialisée.
    - C'est un événement à par entière qu'il faut tester de type SDL_ACTIVEEVENT qu'il faut tester dans le switch(event.type).
    - C'est inutile et à mon avis dangereux de tester si la musique est en pause. Vaut mieux tester le champs event.active.gain pour savoir si on a regagner le controle.
    - Enfin, ce n'est pas forcément le moment de jouer avec ce genre de détail

    Il faut faire attention à ce qu'on fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            //Start the timer
            tempsActuel = SDL_GetTicks();
    Ceci est fait avant plein d'autre chose et le code qui s'en sert est beaucoup plus loin. Du coup, cela ne représente plus le temps actuel mais un temps dans le passé...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            SDL_WaitEvent(&event);
            switch(event.type)
    Il faut tester le retour de SDL_WaitEvent.
    http://jeux.developpez.com/faq/sdl/?...NTS_repetition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                case SDL_QUIT:
                    FMUSIC_StopSong(musique);
                    continuer = 0;
                    break;
    Soit tu veux sortir mais ton code ne te laissera pas sortir vu que tu vas te retrouver bloquer au prochain SDL_WaitEvent. Pire, si SDL_WaitEvent ne bloque pas, tu ne testes pas le retour du coup tu auras un comportement indéterminé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                    texteCartouches = TTF_RenderText_Blended(police2, nombreDeCartouches, couleurJeSaisPas);
    Il faut tester le retour...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                        texte = TTF_RenderText_Blended(police2, nombreDeFois, couleurJeSaisPas);
    Il faut tester le retour...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            if (compteur == limite && limite<50){
                texteGagne = TTF_RenderText_Blended(police1,"Gagné,Appuiyez sur Entrée", couleurRouge);
    Tu ne libéres pas la mémoire de texteGagne et tu ne testes pas le retour de la fonction SDL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
                                switch(stage)
                                {
                                    case 2 :
                                        nombreCartouches += 20;
                                        break;
                                    case 3 :
                                        nombreCartouches += 30;
                                        break;
                                    case 4 :
                                        nombreCartouches += 40;
                                        break;
                                    case 5 :
                                        nombreCartouches += 50;
                                        break;
                                }
    Inutile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nombreCartouches += 10 * stage;
    Suffirait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                texteGagne = TTF_RenderText_Blended(police1,"Terminée", couleurRouge);
    Tu ne libéres pas la mémoire de texteGagne et tu ne testes pas le retour de la fonction SDL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            texteTemps = TTF_RenderText_Blended(police2, temps, couleurJeSaisPas);
    Tu ne libéres pas la mémoire de texteTemps et tu ne testes pas le retour de la fonction SDL.

    Enfin, pour résoudre ton problème il faut d'abord remanier ton code. Il faudra d'abord centraliser tes switch(event.type) en un seul. Cela va te demander de faire un système d'état de jeu.

    Jc

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Points : 63
    Points
    63
    Par défaut
    Bon, j'ai pas eu le courage de lire dans le détail ton code. Mais il y un problème de structure : Pour ce que tu veux faire, on s'attend a une boucle de jeu principale (déplacement de la souris), imbriquée dans une boucle qui gére les différent niveau de jeu.
    Pour un bien il faudrait une seule fonction de gestion d'événement et une seule fonction d'affichage.

    Alors ça répond pas à ta question initiale, mais en l'état cela me permet très difficile de faire une gestion du temps sans reprendre la structure de ton programme.

  15. #15
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par men1n2 Voir le message
    c'est une fenêtre 500X400,pas de problème de graphisme(juste un arrière plan , un viseur et un spirite qui bouge)
    Parce que tu as une carte graphique puissante.
    Sous Linux je ne sais pas trop comment cela fonctionne mais sous Windows il faut que tu connaisses la programmation Windows.

    Une appli fenêtrée GDI n'est jamais redessinée la plupart du temps sauf si le Program Manager place le message WM_PAINT dans la boucle de message.
    Dans ce cas-là, tu places le code dessin de la fenêtre dans ce message.

    Dans une appli avec SDL ou Direct X c;est différent la fenêtre est constamment redessinée et tu boucles indéfiniment sur un "render"
    Donc que cela soit en 1024*768 ou en 500*400 il faut voir combien d'octets soient nécessaires pour rafraichir l'écran théoriquement.
    Si tu as un affichage de 70khz par seconde donc on va admettre grossièrement un rafraichissement de 70fps si tu as une SDL_Surface à rafraichir que la résolution est en 640*480 de cette surface il faudra gérer toutes les secondes 640*480*24 bits=900 000 ko * 60 soit presque 60 megaoctets à rafraichir ce qui explique une sollicitation élevée du CPU.
    En 8 bits cela sera moins mais de toute façon le CPU sera sollicité car il doit gérer des lectures /écritures en RAM et commuté vers d'autres taches

  16. #16
    Nouveau Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    c-a-d il faut reformuler le tout le code??

  17. #17
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par men1n2 Voir le message
    c-a-d il faut reformuler le tout le code??
    Ben si tu regardes mes remarques, tu verras que y en a pas mal donc -> oui

    Jc

  18. #18
    Nouveau Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    alors vous pouvez pas me donner un exemple de code(ou une idée) pour faire la gestion de temps et son affichage??

    autre chose on peut pas utiliser un timer qui fait appel à la fonction de l'affichage du temps toutes les secondes avec une intervalle d'une seconde entre chaque appel??si c'est possible donner moi comment et ce que je doit mettre dans la fonction de l'affichage du temps et les paramètres a envoyeés(avec code et explication si vous pouvez)

    et merci

  19. #19
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Pour la gestion du temps et son affichage c'est pas compliqué
    Dans ton code tu initialise tes variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
     
    /*Déclaration des variables*/
    int actualTime = 0; 
    int previousTime = 0; 
    int i; 
     
    ...
    Puis tu met quelque chose qui ressemble à ça dans ta boucle générale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /*Gestion du temps*/
    actualTime = SDL_GetTicks(); 
     
    if (actualTime - previousTime == 1000)//Si 1 seconde s'est écoulée
    {
        /*Code de blitage du texte*/
        ...
     
       previousTime = actualTime; //Mise à jour du compteur
    }
    C'est aussi simple que ça.
    J'espère avoir répondu à ta question

  20. #20
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Jordinateur Voir le message
    Puis tu met quelque chose qui ressemble à ça dans ta boucle générale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /*Gestion du temps*/
    actualTime = SDL_GetTicks(); 
     
    if (actualTime - previousTime == 1000)//Si 1 seconde s'est écoulée
    {
        /*Code de blitage du texte*/
        ...
     
       previousTime = actualTime; //Mise à jour du compteur
    }
    Sauf que faire un test d'égalité comme cela est dangereux vu qu'il faut vraiment tomber sur le bon milliseconde. Il faut préférer l'inégalité dans ce genre de cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (actualTime - previousTime > 1000)//Si 1 seconde s'est écoulée
    Jc

Discussions similaires

  1. problème avec la gestion du temps
    Par jurams dans le forum SDL
    Réponses: 10
    Dernier message: 08/07/2011, 10h24
  2. SDL + Gestion de temps
    Par autregalaxie dans le forum C
    Réponses: 3
    Dernier message: 14/05/2010, 23h57
  3. Aide pour l'analyse d'un problème de gestion de temps
    Par PAINCO dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 03/06/2005, 15h49
  4. [VB.NET] Gestion en temps réel d'une bdd access
    Par qwiskas dans le forum Windows Forms
    Réponses: 6
    Dernier message: 12/02/2005, 19h37
  5. fonction de gestion du temps
    Par fati dans le forum C
    Réponses: 5
    Dernier message: 26/12/2002, 16h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo