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 :

L'affichage d'une image BMP ne se fait qu'aprés avoir réduit la fenêtre


Sujet :

SDL

  1. #1
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Par défaut L'affichage d'une image BMP ne se fait qu'aprés avoir réduit la fenêtre
    Bonjour a tous
    Il se trouve que j'ai un problème car mon programme doit charger une image BMP (menu.bmp) pour orienter le choix du joueur mais cette image ne se charge qu'aprés avoir réduit la fenêtre et aprés l'avoir récupéré
    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
     
    /*
    main.c
    ------
    Rôle : sert de menu dans le jeu mario , c'est elle qui fait appel aux fonctions correspondant au jeu , 
    aux mini-jeux , aux bonus,aux credits , aux tests et a l'éditeur de niveau.
    */
     
    #include <stdio.h>              
    #include <stdlib.h>
    #include <SDL\SDL.h>
    #include <SDL\SDL_Image.h>
     
    int main(int argc,char* argv[])
    {
        SDL_Surface*ecran, * mario=NULL;
        int continuer=1;
        SDL_Event event;
        SDL_Rect positionMario;
        positionMario.x=0;
        positionMario.y=0;
        if(SDL_Init(SDL_INIT_VIDEO)==-1)
        {
        fprintf(stderr,"Erreur de chargement de la librairie SDL \n Détails \n %s \n",SDL_GetError);
        }
        ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
        fprintf(stdout,"lancement de mario");
        if(ecran==NULL)
        {
        fprintf(stderr,"Erreur de chargement de la librairie SDL \n Détails : \n %s \n",SDL_GetError);
        }
        SDL_WM_SetCaption("Mario",NULL);
        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
        mario = SDL_LoadBMP("menu.bmp");
        SDL_BlitSurface(mario,NULL,ecran,&positionMario);
        while(continuer)
        {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
        case SDL_QUIT:
             continuer=0;
             SDL_Quit();
             break;
        case SDLK_KP0:
             continuer=0;
             SDL_Quit();
             break;
        case SDL_KEYDOWN:
        switch(event.key.keysym.sym)
        {
             }     
             }
             SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
             SDL_BlitSurface(mario,NULL,ecran,&positionMario);
             }
             SDL_FreeSurface(mario);
             return 0;
    }
    Est ce que quelqu'un aurait une idée du problème ?
    Merci d'avance pour vos réponses
    Bye

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    oui, tu utilise du double buffering, il faut donc flipper les surfaces pour afficher le back buffer.
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Par défaut Donc il faut que je mette un Flip
    Donc si j'ai bien compris il faut que je mette un Flip pour rappeller l'écran en préparation avec l'image , c'est ca ?
    Donc ca ca marche :
    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
     
    /*
    main.c
    ------
    Rôle : sert de menu dans le jeu mario , c'est elle qui fait appel aux fonctions correspondant au jeu , 
    aux mini-jeux , aux bonus,aux credits , aux tests et a l'éditeur de niveau.
    */
     
    #include <stdio.h>              
    #include <stdlib.h>
    #include <SDL\SDL.h>
    #include <SDL\SDL_Image.h>
     
    int main(int argc,char* argv[])
    {
        SDL_Surface*ecran, * mario=NULL;
        int continuer=1;
        SDL_Event event;
        SDL_Rect positionMario;
        positionMario.x=0;
        positionMario.y=0;
        if(SDL_Init(SDL_INIT_VIDEO)==-1)
        {
        fprintf(stderr,"Erreur de chargement de la librairie SDL \n Détails \n %s \n",SDL_GetError);
        }
        ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
        fprintf(stdout,"lancement de mario");
        if(ecran==NULL)
        {
        fprintf(stderr,"Erreur de chargement de la librairie SDL \n Détails : \n %s \n",SDL_GetError);
        }
        SDL_WM_SetCaption("Mario",NULL);
        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
        mario = SDL_LoadBMP("menu.bmp");
        SDL_BlitSurface(mario,NULL,ecran,&positionMario);
        SDL_Flip(ecran); //rappel de l'écran sur lequel l'image est chargé
        while(continuer)
        {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
        case SDL_QUIT:
             continuer=0;
             SDL_Quit();
             break;
        case SDLK_KP0:
             continuer=0;
             SDL_Quit();
             break;
        case SDL_KEYDOWN:
        switch(event.key.keysym.sym)
        {
             }     
             }
             SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
             SDL_BlitSurface(mario,NULL,ecran,&positionMario);
             }
             SDL_FreeSurface(mario);
             return 0;
    }
    Merci encore

  4. #4
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Par défaut Je mets le résolu
    Hello
    Merci encore ,je met le résolu
    Merci

  5. #5
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Shugo78
    Donc ca ca marche :
    Oui sauf que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        mario = SDL_LoadBMP("menu.bmp");
    Il faut tester la valeur de mario...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        SDL_WaitEvent(&event);
    Il faut tester le retour de SDL_WaitEvent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
             SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
             SDL_BlitSurface(mario,NULL,ecran,&positionMario);
    Il manque un SDL_Flip ici aussi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
             SDL_FreeSurface(mario);
    Il manque un SDL_Quit ici.

    Jc

  6. #6
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Par défaut
    Hello
    Désolé
    C'est arrangé :
    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
     
    /*
    main.c
    ------
    Rôle : sert de menu dans le jeu mario , c'est elle qui fait appel aux fonctions correspondant au jeu , 
    aux mini-jeux , aux bonus,aux credits , aux tests et a l'éditeur de niveau.
    */
     
    #include <stdio.h>              
    #include <stdlib.h>
    #include <SDL\SDL.h>
    #include <SDL\SDL_Image.h>
     
    int main(int argc,char* argv[])
    {
        SDL_Surface*ecran, * mario=NULL;
        int continuer=1;
        SDL_Event event;
        SDL_Rect positionMario;
        positionMario.x=0;
        positionMario.y=0;
        if(SDL_Init(SDL_INIT_VIDEO)==-1)
        {
        fprintf(stderr,"Erreur de chargement de la librairie SDL \n Détails \n %s \n",SDL_GetError);
        }
        ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
        fprintf(stdout,"lancement de mario");
        if(ecran==NULL)
        {
        fprintf(stderr,"Erreur de chargement de la librairie SDL \n Détails : \n %s \n",SDL_GetError);
        }
        SDL_WM_SetCaption("Mario",NULL);
        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
        mario = SDL_LoadBMP("menu.bmp");
        if(mario == NULL)
    {
        fprintf(stderr,"Erreur de chargement de l'image menu.bmp");
        exit(EXIT_FAILURE);
    }
        SDL_BlitSurface(mario,NULL,ecran,&positionMario);
        SDL_Flip(ecran); //rappel de l'écran sur lequel l'image est chargé
        while(continuer)
        {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
        case SDL_QUIT:
             continuer=0;
             SDL_Quit();
             break;
        case SDLK_KP0:
             continuer=0;
             SDL_Quit();
             break;
        case SDL_KEYDOWN:
        switch(event.key.keysym.sym)
        {
             }     
             }
             SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
             SDL_BlitSurface(mario,NULL,ecran,&positionMario);
             }
             SDL_FreeSurface(mario);
             SDL_Flip(ecran); // Pourquoi ??????? 
             SDL_Quit();
             return 0;
    }
    Merci encore mais pourquoi mettre un Flip a la fin ???

  7. #7
    Membre éprouvé Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Par défaut
    La réponse à ta question ici !

    Le flip va de paire avec le doublebuffer, au final ça donne de meilleures performances.

  8. #8
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Par défaut D'accord flip = doublebuffer
    Ok
    merci a tous je comprends maintenant un peu mieu la SDL ( c'est toujours ca de pris )
    Merci encore a tous
    Cette fois je mets le définitivement cette fois

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 519
    Par défaut
    Citation Envoyé par fearyourself
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        SDL_WaitEvent(&event);
    Il faut tester le retour de SDL_WaitEvent.
    Pourquoi ? SDL_WaitEvent ne retournant pas d'évènement jusqu'à ce qu'il y en ait un, la variable event contiendra FORCÉMENT un évènement après l'appel de la fonction.

    Il en serait autrement avec SDL_PollEvent.

  10. #10
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par spidermario
    Pourquoi ? SDL_WaitEvent ne retournant pas d'évènement jusqu'à ce qu'il y en ait un, la variable event contiendra FORCÉMENT un évènement après l'appel de la fonction.
    Non ! Que fais-tu du cas d'erreur qui peut arriver (certes rare mais il faut le tester) ?

    http://jeux.developpez.com/faq/sdl/?...NTS_repetition

    Jc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Affichage d'une image .bmp impossible dans une userform (erreur d'éxécution 481)
    Par juliien dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/03/2015, 09h46
  2. Affichage d'une image png sur un fond bmp
    Par hjr.hajer dans le forum SDL
    Réponses: 5
    Dernier message: 28/01/2014, 14h51
  3. [DirectDraw7] Affichage de plusieurs image bmp
    Par SteelBox dans le forum DirectX
    Réponses: 3
    Dernier message: 24/04/2004, 19h00
  4. [BPW] Impression d'une image BMP
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 21/08/2003, 14h34
  5. Affichage d'une image sous linux
    Par Braim dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 25/03/2003, 10h41

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