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

 C++ Discussion :

mettre à jour la fenêtre SDL


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Par défaut mettre à jour la fenêtre SDL
    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 : 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
     
    //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 );  
     
                          }
     
     
     
     
         }
    //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++

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Salut,

    je n'ai pas regardé ton code (trop long ^^), mais bon le problème vient surement du fait que tu ne re Blit pas ton fond d'écran avant de "bliter" tes briques..etc et de faire un Flip pour mettre à jour l'affichage.

    NeoKript

  3. #3
    Membre actif
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Par défaut
    merci pour votre réponse ;

    je sais qu'il faut re blitter le fond aprés la création des briques mais le problème

    comment je vais re blitter ma fenêtre à l'intérieur de la classe brique j'ai essayé

    mais ça marchait pas.pouvez vous jeter l'oeil sur le code ce sont des classes

    que j'ai crée, juste pour me dire est ce que ce sont correctes et logiques ou pas;merci

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Alors déjà, il y a certain truc pas très logique sauf erreur de ma part :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Raquette::show(SDL_Surface* sscreen)
    Dans cette méthode tu fait passer un SDL_Surface *, alors que tu pourrais avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Raquette::show(void)
    Vu que tu as ta SDL_Surface en attribut de classe :
    this->_screen

    Ensuite :

    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
                     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 );  
     
                          }
         }
    Ça serait plus logique de blitter d'abord le fond d'écran avec SDL_FillRect et ensuite de faire un Show sur la brique (là tu blitte ta brique en premier).

    En faite, il faut que tu vois tes surfaces comme des calques (superposition d'images, comme dans un logiciel de dessin), et quand tu faire un blit tu rajoute ta surface à la surface courante. Donc dans l'ordre, tu dois faire :
    - blitter le fond d'écran
    - blitter tes surfaces dans l'ordre d'apparition.

    Voilà

Discussions similaires

  1. [WD14] mettre à jour à partir d'un fenêtre soeur
    Par loupiloup666 dans le forum WinDev
    Réponses: 3
    Dernier message: 06/04/2010, 22h06
  2. Réponses: 14
    Dernier message: 15/01/2009, 09h54
  3. Réponses: 2
    Dernier message: 08/10/2007, 10h09
  4. Réponses: 10
    Dernier message: 15/10/2006, 17h23
  5. Mettre à jour dynamiquement une fenêtre swing
    Par madina dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 23/11/2005, 19h08

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