Mettre à jour une fenêtre SDL

asprog Messages postés 33 Date d'inscription mercredi 12 novembre 2008 Statut Membre Dernière intervention 26 décembre 2010 - 26 déc. 2010 à 15:41
pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 - 30 déc. 2010 à 21:00
Bonjour;

je me suis chargée de faire un jeu de casse brique sous C++ en utilisant des classes
que je dois les créer(orienté objet) ainsi que la bibliothèque de classe SDL,voici mes classes :Raquette,classe Brique,Classe Balle,...
j'ai commencé par la création de la fenêtre et ça marchait très bien ensuite j'ai créer une raquette qui se déplace quand j'appuie sur les touches Left & right du clavier enfin j'ai créer les briques;mais quand j'exécute; la première fenêtre que j'ai crée s'affiche et il contient l'image du fond et la brique et quand j'appuie sur la touche left ou right du clavier une autre fenêtre qui contient la raquette et la brique s'affiche mais il ne contient pas l'image du fond , je sais bien que le problème provient du SDL_Flip qui met à jour la fenêtre mais je ne sait pas comment la manipuler :voici mon code
Code :

//l'implémentation:  Raquette.cpp
Raquette::Raquette ( int initialX, int initialY, int nbrFramesW, int nbrFramesH, char* file,SDL_Surface* screen){
                 loadSpriteSheet ( file );
  
    _x = initialX;
    _y = initialY;
    _w =nbrFramesW;
    _screen=screen;
    _h =nbrFramesH;
 
                   }
                   
                   
void Raquette::loadSpriteSheet(char* file){
      _spriteSheet = SDL_LoadBMP ( file );
        }
   
void Raquette::move(){
     bool running=true;
       //  Uint8 *keys = SDL_GetKeyState(NULL);
                 SDL_WaitEvent ( &event );
          
           while (running){
                 
     if (SDL_PollEvent(&event)){
       switch ( event.type ) {
               case SDL_QUIT:
                     running = false;
                      break;
                      
                 case SDL_KEYDOWN:
                      
                       switch ( event.key.keysym.sym ) {
                       
                          case SDLK_LEFT:
                   if (_x<0)_x=10;
                                                     
                             _x=_x-15; break;
    
                            
                          case SDLK_RIGHT:
                               if (_x>480)_x=500;
                               _x=_x+15;break;
                                            
                 }
                               
                 }
               
                  show(_screen);
                  
                 
                
                }
                
                 }
               
   
                 }
                         
                 void Raquette::show(SDL_Surface* sscreen){
                      SDL_Rect frameRect;
     
     Brique b(12,12,12,12,"Brique/brique1.bmp",sscreen);
     b.show();
     SDL_Rect pos;
     
     pos.x = _x;
     pos.y = _y;
     
        SDL_FillRect ( _screen, NULL, SDL_MapRGB ( _screen->format, 20, 200, 20 ) );
     SDL_BlitSurface ( _spriteSheet, NULL, sscreen, &pos );
                  //  SDL_Flip ( _screen );
                  //  SDL_Delay ( 60 );  
  
                      }
                 
void Raquette::limite(){
     bool running=true;
     if (_x<0){
     
     while(running){
      _x=_x+15;              
     show(_screen);
    running=false;
    }
     
     }
     
     
     }
//l'implémentation : brique.cpp
 
Brique::Brique(int x,int y,int w,int h,char *file,SDL_Surface * Screen)
{
                   loadFile(file);
                   _x=x;
                   _y=y;
                   _w=w;
                   _h=h;
                   _screen=Screen;
                   }
                   void Brique::loadFile(char* file)
                   {
                        
                        _sbrique=SDL_LoadBMP(file);
                                                }
                                                void Brique::placerBrique(){
                                                        show();
                                                                                                                      
                             }
                             void Brique::show(){
                                  SDL_Rect pos;
     
     pos.x = _x;
     pos.y = _y;
     
      
     SDL_BlitSurface ( _sbrique, NULL, _screen, &pos );
                          SDL_Flip(_screen);
                           //SDL_Delay(60)       ;
                                  }
 
//  main.cpp
    SDL_Init(SDL_INIT_VIDEO);
  Screen=SDL_SetVideoMode(_SCREEN_WIDTH,_SCREEN_HEIGHT,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
  SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL+(1/100));
  
  fond=SDL_LoadBMP("fond.bmp");
   Raquette r(_SCREEN_WIDTH/3,_SCREEN_HEIGHT-20,15,5,"raquet.bmp",Screen);
         
  
   SDL_BlitSurface(fond,NULL,Screen,&rfond);
                
        r.move(); 
        SDL_Flip(Screen);
  SDL_Delay(60);    


merci de m'avoir aider(ce que je dois enlever et ce que je dois ajouter dans mon code) sachant que je suis débutante en C++

1 réponse

pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 10
30 déc. 2010 à 21:00
A mon avis, le problème est le suivant,
le main :

   SDL_BlitSurface(fond,NULL,Screen,&rfond);
                
        r.move(); // Ici le fond n'est pas blitté.
        SDL_Flip(Screen);
  SDL_Delay(60);



On se rend compte que show(_screen) n'affiche que la raquette et les briques, autrement dit, dans la boucle while il n'y a pas le fond n'est pas remis, il disparait.

Ce qu'il faudrait, c'est passer le fond en argument au constructeur de raquette pour que celui-ci puisse l'afficher avant show(_screen).

ça donnerait :

Raquette::Raquette ( int initialX, int initialY, int nbrFramesW, int nbrFramesH, char* file,SDL_Surface* screen, SDL_Surface* fond){
loadSpriteSheet ( file );
{
...
wFond = fond;
}
void Raquette::move()
{
//...
while (running)
{
//...
SDL_Rect posFond;
posFond.x = 0;
posFond.y = 0; 
           SDL_BlitSurface(wFond,NULL,Screen, &posFond);
show(_screen);
}
}



...À essayer

Pop70
0
Rejoignez-nous