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 Chargement des BMP dans la memoire RAM ?


Sujet :

SDL

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 371
    Points : 45
    Points
    45
    Par défaut SDL Chargement des BMP dans la memoire RAM ?
    Bonjour
    J'ai créer un petit truc avec SDL qui comporte des MP3( FMOD) et des fichiers bitmap enfin j'ai beaucoup des BMP a charger, mon problème c'est:

    Quand je lance mon programme le truc(mon programme - la fenêtre SDL) reste en noir jusqu'a le chargement des bitmap, ce qui est pas bien c'est que les mp3 commence avant le chargement de mes bitmap, et la durée de chargement ce augment avec l'augmentation des bitmap charger.

    Je veux savoir comment je vais faire pour créer une petite barre de progresse ou bien un chargement de pourcentage pour que tout mes fichiers ce lance en même temp ainsi pour que je reste patienté quand la barre ce charge.
    Merci

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut

    je sais pas mais je pense que tu commences par afficher un écran de chargement, et quand tous les fichiers sont chargés tu lances la lecture des MP3?

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 396
    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 396
    Points : 20 504
    Points
    20 504
    Par défaut
    Citation Envoyé par CLion Voir le message
    Quand je lance mon programme le truc(mon programme - la fenêtre SDL) reste en noir jusqu'a le chargement des bitmap, ce qui est pas bien c'est que les mp3 commence avant le chargement de mes bitmap, et la durée de chargement ce augment avec l'augmentation des bitmap charger.
    Il suffit d'utiliser des booléens et d'abord afficher un écran d'intro

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 371
    Points : 45
    Points
    45
    Par défaut
    j'aimerai avoir un exemple car j'ai tout essayé et rien n'as marcher, donc je pense de faire un chargement de pourcentage de BMP lorsqu'elle ce charge en memoir RAM

  5. #5
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Bon

    Voilà un exemple de programme utilisant SDL_ttf, il faut que tu aies aussi un fichier verdana.ttf dans le répertoire. (Au pire prend une autre police et renomme -la)

    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
    #include <SDL/SDL.h>
    #include <SDL/SDL_ttf.h>
     
    TTF_Font *police;
    SDL_Surface* screen;
     
    void affiche_pourcentage(int pourc)
    {
        SDL_Color white = {255, 255, 255};
        char aff_pourc[10];
     
        sprintf(aff_pourc, "%d %%", pourc);
        SDL_Surface *tmp = TTF_RenderText_Blended(police, aff_pourc, white);
     
        //clears screen
        SDL_FillRect(screen, NULL, 0);
     
        // centre the bitmap on screen
        SDL_Rect dstrect = { (screen->w-tmp->w)/2, (screen->h-tmp->h)/2 };
        SDL_BlitSurface(tmp, NULL, screen, &dstrect);
     
        //affichage
        SDL_Flip(screen);
     
        //libération
        SDL_FreeSurface(tmp);
    }
     
    int main ( int argc, char** argv )
    {
        // initialize SDL video
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "Unable to init SDL: %s\n", SDL_GetError() );
            return 1;
        }
        TTF_Init();
        police = TTF_OpenFont("verdana.ttf", 26);
     
        // create a new window
        screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE|SDL_DOUBLEBUF);
        if ( !screen )
        {
            printf("Unable to set 640x480 video: %s\n", SDL_GetError());
            return 1;
        }
     
        //Ecran de chargement
        {
            int pourcentage = 0;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
     
            affiche_pourcentage(pourcentage);
            SDL_Delay(300);
            pourcentage += 5;
        }
     
        // program main loop
        bool done = false;
        while (!done)
        {
            // message processing loop
            SDL_Event event;
            while (SDL_PollEvent(&event))
            {
                // check for messages
                switch (event.type)
                {
                    // exit if the window is closed
                case SDL_QUIT:
                    done = true;
                    break;
     
                    // check for keypresses
                case SDL_KEYDOWN:
                    {
                        // exit if ESCAPE is pressed
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            done = true;
                        break;
                    }
                } // end switch
            } // end of message processing
     
            SDL_Delay(1);
        } // end main loop
     
        TTF_Quit();
        SDL_Quit();
        // all is well ;)
        printf("Exited cleanly\n");
        return 0;
    }
    Dans ce code, tu peux remplacer chaque SDL_Delay(300) par des chargements d'images pour l'utiliser comme tu veux

  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 : 44
    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 coyotte507 Voir le message
    Voilà un exemple de programme utilisant SDL_ttf, il faut que tu aies aussi un fichier verdana.ttf dans le répertoire. (Au pire prend une autre police et renomme -la)
    Alors je ne suis pas d'accord sur ce code.

    - Pas de test derrière TTF_Init
    - Variables globales qui ne sont pas nécessaire
    - Du code SDL pas entouré par une boucle événementielle
    - Copier-coller de code quand une boucle aurait fait l'affaire

    Voici une version que je trouve un peu plus maniable et propre :
    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
     
    #include <SDL/SDL.h>
    #include <SDL/SDL_ttf.h>
     
    SDL_Surface *getPercentage(int pourc, TTF_Font* font)
    {
        SDL_Color white = {255, 255, 255, 0};
        char aff_pourc[10];
     
        sprintf(aff_pourc, "%d %%", pourc);
        SDL_Surface *tmp = TTF_RenderText_Blended(font, aff_pourc, white);
     
        return tmp;
    }
     
    int main ( int argc, char** argv )
    {
        TTF_Font *font;
        SDL_Surface* screen, *tmp=NULL;
        SDL_Event event;
        char *ttffile = "verdana.ttf";
        int percentage = 0;
        unsigned int next = 0, speed = 1000;
        SDL_Rect dstrect;
     
        // initialize SDL video
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError() );
            return EXIT_FAILURE;
        }
     
        if ( TTF_Init() < 0) {
            fprintf(stderr, "Unable to init SDL_TTF: %s\n", TTF_GetError() );
            return EXIT_FAILURE;
        }
     
     
        font = TTF_OpenFont(ttffile, 26);
     
        if(font == NULL) {
            fprintf(stderr, "Unable to open ttf file %s -> %s\n", ttffile, TTF_GetError() );
            return EXIT_FAILURE;
        }
     
        // create a new window
        screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE|SDL_DOUBLEBUF);
        if ( !screen )
        {
            fprintf(stderr, "Unable to set 640x480 video: %s\n", SDL_GetError());
            return EXIT_FAILURE;
        }
     
        // program main loop
        int done = 0;
        while (!done)
        {
            // message processing loop
            while (SDL_PollEvent(&event))
            {
                // check for messages
                switch (event.type)
                {
                    // exit if the window is closed
                    case SDL_QUIT:
                        done = 1;
                        break;
     
                        // check for keypresses
                    case SDL_KEYDOWN:
                        {
                            // exit if ESCAPE is pressed
                            if (event.key.keysym.sym == SDLK_ESCAPE)
                                done = 1;
                            break;
                        }
                } // end switch
            } // end of message processing
     
            if(SDL_GetTicks() > next) {
                next = SDL_GetTicks() + speed;
                percentage += 5;
     
                //Are we above the maximum ?
                if(percentage > 100) {
                    percentage = 100;
                }
                else { //Otherwise, we need a new surface 
                    //Free memory
                    SDL_FreeSurface(tmp);
                    //Get new surface
                    tmp = getPercentage(percentage, font);
                }
            }
     
            //clears screen
            SDL_FillRect(screen, NULL, 0);
            // centers the bitmap on screen
            dstrect.x = (screen->w-tmp->w)/2;
            dstrect.y = (screen->h-tmp->h)/2;
            SDL_BlitSurface(tmp, NULL, screen, &dstrect);
     
            //display
            SDL_Flip(screen);
     
        } // end main loop
     
        TTF_Quit();
        SDL_Quit();
        // all is well ;)
        printf("Exited cleanly\n");
     
        (void) argc;
        (void) argv;
        return 0;
    }
    Jc

  7. #7
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    en fait j'ai fait du copier-coller, car le but ici est de charger des images, et à moins de stocker tout les noms d'images dans un tableau (et là encore, c'est difficile d'ajuster les pourcentages), on est obligé de tout dérouler quand on effectue un chargement d'images.

    C'est justement pour ca que j'ai dit:
    Dans ce code, tu peux remplacer chaque SDL_Delay(300) par des chargements d'images pour l'utiliser comme tu veux
    Par contre, c'est vrai que j'aurais du faire un test sur TTF_OpenFont() et TTF_Init(), et pour gérer un SDL_QUIT lors du chargement des images, j'aurais dû rajouter un EventFilter.

  8. #8
    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 : 44
    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 coyotte507 Voir le message
    en fait j'ai fait du copier-coller, car le but ici est de charger des images, et à moins de stocker tout les noms d'images dans un tableau (et là encore, c'est difficile d'ajuster les pourcentages), on est obligé de tout dérouler quand on effectue un chargement d'images.
    Ben non, tu mets les noms d'images dans un tableau et le pourcentage est un multiple de l'indice. C'est tout de même plus propre.

    Jc

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 371
    Points : 45
    Points
    45
    Par défaut
    ça fait longtemps , j'ai pense que je vais pas voir un réponse oof voila un site qui donne des idées voyons voir ce qu'est là !!!
    la première idée celle de monsieur coyotte507 sert a rien car le teste va passé et le pourcentage va continue a augmenté dans tout les cas même si les images sont pas charger au mémoire.
    le 2eme idée celle de fearyourself n'as aucun rapport avec le chargement.

    les amis qu'on on dit "condition" c'est pas ecrire n'importe quoi:

    voila un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (image-charger)
    {
    ecrire("l'image est charcher en memoire");
    }
    else
    {
    ecrire("image n'est pas charger");
    break;// ou bien reteste jusqu'a l'image soit charger en memoire ;)
    }
    voilà merci pour l'aide mais je pense qu'il a pas une solution avec SDL, je me suis essayé beaucoup des sources mais sans succes il sont tous de n'import quoi

  10. #10
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    SDL_LoadBMP est bloquante, donc le programme sera bloqué tant que l'image ne sera pas chargée, et donc le pourcentage augmentera au fur et à mesure.

    Si tu développes avec des threads alors là d'accord, mais il est tout aussi facile de faire un écran de chargement qui affiche le bon pourcentage, et on n'est pas censé pouvoir voir ton code à distance.

  11. #11
    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 : 44
    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 CLion Voir le message
    ça fait longtemps , j'ai pense que je vais pas voir un réponse oof voila un site qui donne des idées voyons voir ce qu'est là !!!
    la première idée celle de monsieur coyotte507 sert a rien car le teste va passé et le pourcentage va continue a augmenté dans tout les cas même si les images sont pas charger au mémoire.
    le 2eme idée celle de fearyourself n'as aucun rapport avec le chargement.
    Attention, les deux idées sont équivalentes et fonctionnent. Elles ne sont pas complétes en effet pour ce que tu veux faire. Tu vas devoir les intégrer et les modifier pour ajouter ce que tu veux.

    A toi de :

    - Modifier le code de coyotte pour ajouter tes tests et décider de ce que tu vas faire en cas d'échec;

    - Modifier mon code pour ajouter des tests.

    Jc

  12. #12
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 371
    Points : 45
    Points
    45
    Par défaut
    helas fearyourself j'ai bien remplacé le code avec le mien mais il marche plus, sinon et si tu as le temps?? j'aimerai bien gagner ta gentillece et que tu me fais ce code a ma place et que tu le teste devant t'es eux et si ca marche rassemblé moi t'es fichiers dans un fichier.rar pour voir ce que ça donne , car j'ai bien chercher dans le net et j'ai passé beaucoup du temps avec beaucoup des code différent sans résultat.

    tu peux utilisé n'importe quel méthode et je vais étudier le code après, l'essentiel c'est qu'il faut qu'il marche.

    merci avance.

Discussions similaires

  1. [MySQL] chargement des données dans un formulaire
    Par super-java dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 22/04/2008, 12h49
  2. Chargement des DLL dans le code C++
    Par Triste dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2008, 09h29
  3. probleme de chargement des extensions dans une dll
    Par Syl_20 dans le forum OpenGL
    Réponses: 3
    Dernier message: 03/07/2007, 08h37
  4. chargement des images dans une table
    Par sandy07 dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/04/2007, 09h37
  5. Réponses: 16
    Dernier message: 23/06/2006, 17h48

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