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 :

Ecrasement des images bitmap avec SDL_BlitSurface


Sujet :

SDL

  1. #1
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Points : 70
    Points
    70
    Par défaut Ecrasement des images bitmap avec SDL_BlitSurface
    Bonjour à tous.

    Voilà mon problème, j'ai un programme C++ qui crée un plateau 2 dimensions contenant des pointeurs vers des objets. Ces objets peuvent être soit de nature Vide, Poule, Renard, Vipère et Mur.
    Toutes les secondes, j'appelle une fonction qui déplace les individus sur le plateau, et j'affiche alors, à l'aide de la librairie SDL, les images Bitmap correspondant à chaque nature de case.

    Au premier tour dans le while, l'affichage se fait bien, mais au second tour, j'obtiens comme affichage le plateau précédent avec en plus les cases vides remplacées par les individus déplacés, comme si les nouvelles images n'écrasaient pas les anciennes. Pourtant je remet à jour l'écran avant chaque affichage.

    Ma question est : ne faut-il pas "vider" les cases avant de reblitter de nouvelles images ?

    Je vous soumet la partie SDL de mon code au cas où vous trouviez ce qui cloche.
    Merci d'avance.

    PS: je suis sûr que la partie C++ est bonne au niveau des fonctions appelées.


    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
    bool continuer = true;
        SDL_Event event;
     
        SDL_Surface *ecran = NULL;
        SDL_Surface *mur = NULL, *poule = NULL, *renard = NULL, *vipere = NULL, *vide = NULL;
        SDL_Rect position;
     
     
     
        SDL_Init(SDL_INIT_VIDEO);
     
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
     
        // Chargement des sprites (décors, personnage...)
        mur = SDL_LoadBMP("mur.bmp");
        poule = SDL_LoadBMP("poule.bmp");
        renard = SDL_LoadBMP("renard.bmp");
        vipere = SDL_LoadBMP("vipere.bmp");
        vide = SDL_LoadBMP("vide.bmp");
     
     
        int tempsPrecedent = 0, tempsActuel = 0;//TEST
     
     
     
    while (continuer == true)
    {   
        SDL_PollEvent(&event); //récupération d"un évènement éventuel
        switch(event.type)
        {
            case SDL_QUIT: //si on a cliqué sur quitté
                continuer = false; //on sort de la boucle while
                break;
        }
     
     
        tempsActuel = SDL_GetTicks(); //on note le temps courant
     
        if ((tempsActuel - tempsPrecedent) > 1000) //code effectué toutes les secondes
        {
            deplacementPlateau(plateau, plateauTemp); //on déplace chaque individu du plateau
     
     
            //placement des objets à l'écran
            for (int i = 0 ; i < TAILLE_REELLE ; i++) //lignes
            {
                for (int j = 0 ; j < TAILLE_REELLE; j++) //colonnes
                {
                    position.x = i * 50; //on se positionne pour placer une image de 50*50px
                    position.y = j * 50;
     
                    //sleon la nature de la case, on adffiche l'image 
                    if((*plateau[i][j]).getTypeContenu() == ' ') //case vide
                    {
     
                        SDL_BlitSurface(vide, NULL, ecran, &position);
                    }
                    else if ((*plateau[i][j]).getTypeContenu() == 'P') //case poule
                    {
                        SDL_BlitSurface(poule, NULL, ecran, &position);
                    }
                    else if ((*plateau[i][j]).getTypeContenu() == 'R') //case Renard
                    {
                        SDL_BlitSurface(renard, NULL, ecran, &position);
                    }
                    else if ((*plateau[i][j]).getTypeContenu() == 'V') //case Vipere
                    {
                        SDL_BlitSurface(vipere, NULL, ecran, &position);
                    }
                    else if ((*plateau[i][j]).getTypeContenu() == 'M') //case Mur
                    {
                        SDL_BlitSurface(mur, NULL, ecran, &position);
                    }
                }
            }
     
            SDL_Flip(ecran); //on met à jour l'écran
     
            tempsPrecedent = tempsActuel;
            }
    }
        SDL_Quit();
     
        return EXIT_SUCCESS;
     
    }

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

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

    Es-tu sûr que, lorsqu'un animal quitte une case, tu mets un espace dans la case qu'il vient de quitter?

    Sinon:
    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
                    if((*plateau[i][j]).getTypeContenu() == ' ') //case vide
                    {
     
                        SDL_BlitSurface(vide, NULL, ecran, &position);
                    }
                    else if ((*plateau[i][j]).getTypeContenu() == 'P') //case poule
                    {
                        SDL_BlitSurface(poule, NULL, ecran, &position);
                    }
                    else if ((*plateau[i][j]).getTypeContenu() == 'R') //case Renard
                    {
                        SDL_BlitSurface(renard, NULL, ecran, &position);
                    }
                    else if ((*plateau[i][j]).getTypeContenu() == 'V') //case Vipere
                    {
                        SDL_BlitSurface(vipere, NULL, ecran, &position);
                    }
                    else if ((*plateau[i][j]).getTypeContenu() == 'M') //case Mur
                    {
                        SDL_BlitSurface(mur, NULL, ecran, &position);
                    }
    Ca pourrait être remplacé par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    switch((*plateau[i][j]).getTypeContenu())
    {
                    case ' ': //case vide
                        SDL_BlitSurface(vide, NULL, ecran, &position);
                        break;
                    case 'P': //case poule
                        SDL_BlitSurface(poule, NULL, ecran, &position);
                        break;
                    case 'R': //case Renard
                        SDL_BlitSurface(renard, NULL, ecran, &position);
                        break;
                     .....
    }
    Coyotte507

  3. #3
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Points : 70
    Points
    70
    Par défaut
    Oui en effet pour le switch

    En ce qui concerne le déplacement des animaux, j'ai testé avec un affichage sur console et ça fonctionne.

    Le problème viendrait du code SDL.

    J'avais oublié d'ajouter cette instruction avant chaque nouvel affichage, pour effacer l'écran précédent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); // colore l'écran en blanc
    Mais ça ne change pas le problème, les anciens blits restent affichés en plus des noveaux.

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

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

    Peux-tu reposter le code avec cette fois le SDL_FillRect?

    Sinon, une des causes qui auraient pu provoquer ce problème, c'est que par exemple quand un animal quitte une case tu la mets à '\0', ce qui fait que dans le programme console c'est nickel, mais avec SDL ça ne réaffiche rien par-dessus (vu que 0 != ' ').

    Si ce n'est pas ça le problème je crains qu'il ne faille un zip du projet pour trouver la cause.

    Coyotte507

    Edit:
    Si le problème est réglé, il n'y aura pas besoin de remplir l'écran de blanc avant chaque affichage, en effet tu blittes "vide.bmp" sur chaque case vide.

  5. #5
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Points : 70
    Points
    70
    Par défaut
    Waaa merci beaucoup.

    Ta réponse m'a inspiré. En réalité, c'est parce que sur ma console je n'ai fait le test que pour un déplacement. A chaque déplacement, j'utilisai un tableau temporaire que j'avais oublié de réinitialiser à chaque fois, du coup les anciens animaux étaient toujours dessus.

    Donc problème résolu, merci.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/03/2011, 19h15
  2. Réponses: 4
    Dernier message: 19/12/2007, 11h43
  3. image Bitmap avec numéro Random
    Par patrice419 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 19/04/2007, 11h13
  4. Réponses: 1
    Dernier message: 12/12/2006, 17h36
  5. [TP]Gestion des images bmp avec BMP.TPU
    Par Gabi dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 14/05/2004, 23h20

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