Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème plusieurs surfaces

une seule est affichée !!!

Sujet résolu
    26 novembre 2008 à 20:35:47

    Bonjour,
    j'ai un problème concernant l'affichage de surfaces, en SDL, avec le code suivant :
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *arivee = NULL, *zozor = NULL;
        SDL_Rect positionZozor, positionArivee;
        SDL_Event event;
        int continuer = 1;
        long gg = 0;
    
        SDL_Init(SDL_INIT_VIDEO);
    
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); /* Double Buffering */
        SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);
    
        //load ARRIVEE
        arivee = SDL_CreateRGBSurface(SDL_HWSURFACE, 100, 100, 32, 0, 0, 0, 0);
        positionArivee.x = 0;
        positionArivee.y = 0;
        SDL_FillRect(arivee, NULL, SDL_MapRGB(ecran->format, 255, 255, 0));
        SDL_BlitSurface(arivee, NULL, ecran, &positionArivee);
    
        SDL_Flip(ecran);
    
        //load ZOZOR
        zozor = SDL_LoadBMP("zozor.bmp");
        SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 255, 0));
    
        positionZozor.x = 640 - zozor->w;
        positionZozor.y = 480 - zozor->h;
    
        SDL_EnableKeyRepeat(10, 10); /* Activation de la répétition des touches */
    
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                        case SDLK_UP:
                            positionZozor.y--;
                            break;
                        case SDLK_DOWN:
                            if(positionZozor.y<470-zozor->h)
                            {
                                positionZozor.y++;
                            }
                            break;
                        case SDLK_RIGHT:
                            if(positionZozor.x<640-zozor->w)
                            {
                                positionZozor.x++;
                            }
                            break;
                        case SDLK_LEFT:
                            positionZozor.x--;
                            break;
                    }
                    break;
            }
    
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 20, 104, 0));
            SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
            SDL_Flip(ecran);
            if (positionZozor.x<10 && positionZozor.y<10)
            {
                continuer = 0;
                gg = 1;
            }
        }
    
        if (gg)
        {
            printf("vous avez gagné la dernière partie ;-)");
        }
        else
        {
            printf("vous avez perdu la dernière partie :-( ");
        }
    
        system("start stdout.txt");
        continuer = 1;
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
            }
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                    continuer = 0;
                    break;
                }
        }
        SDL_FreeSurface(zozor);
        SDL_FreeSurface(arivee);
        SDL_Quit();
    
        return EXIT_SUCCESS;
    }
    

    Comme vous le constatez, je suis parti du code de l'exo de m@teo21 "déplacer Zozor"
    mon problème est le suivant : la surface "arivee" ne s'affiche pas ...
    Je suppose que l'erreur est toute bête, mais je ne la trouve pas !

    PS: Je ne comprends pas non plus pourquoi la ligne
    system("start stdout.txt");
    
    ne fonctionne pas : en effet, après avoir placé stdout.txt dans le bon dossier, le programme "saute" cette ligne.

    Merci de votre aide,
    Cordialement, Tobast.
    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2008 à 21:02:20

      Bonsoir , pour la surface "arrivé" , c'est normale , tu fais une boucle dans laquelle tu "rafraîchis" l'écran (grace à SDL_Flip) mais tu ne renouvelle pas ton "blitage" . il faut que la ligne


      SDL_BlitSurface(arivee, NULL, ecran, &positionArivee);
      


      soit dans la boucle principale .
      De plus je ne vois pas à quoi sert la deuxième boucle ni le system("start stdout.txt");...

      Bonne chance ;) .
      • Partager sur Facebook
      • Partager sur Twitter
        28 novembre 2008 à 16:24:19

        Bonjour,
        et merci de ta réponse (c'était vraiment tout bête ! )

        La deuxième boucle sert a faire patienter le programme après l'arrivée du personnage et le
        system("start stdout.txt");
        

        sert tout simplement (mais là ça marche pas :( ) à ouvrir avec le programme par défaut pour l'extension donnée le fichier donné.
        exemple (et là ça marche :D ):
        printf("bonjour, cette partie contient une carte qui permet de s'entrainer a placer les pays de l'Europe, et de placer les capitales des villes de l'U.E. [...]");
            system("start carteDEurope.jpg");
        

        Mais bon, là, c'était en console... peut être que ça vient de là ?
        Merci de vos réponses, Tobast.
        • Partager sur Facebook
        • Partager sur Twitter

        problème plusieurs surfaces

        × 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