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 :

Methode de gestion d'évenement + affichage


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Methode de gestion d'évenement + affichage
    Bonjour a tous,

    Je tient a préciser que c'est mon premier post sur les forums de Developpez.com
    Je souhaiterais avoir vos critiques sur ce morceau de code, j'ai utiliser les tutos disponibles ici-même pour essayer de gérer le déplacement d'une image sur un fond avec les fleches du clavier. A mon avis la méthode utilisé n'est pas très "propre" et j'aimerai avoir vos critiques pour l'améliorer.
    En outre je me retrouve coincé par la suite car je souhaiterais disposé des sprites diférents selon les evenements. Par exemple si la fleche droite est enfoncée le sprite d'un personnage tourné vers la droite etc ... Mais avec ce systeme, le sprite contenu dans "message" se retrouve rafraichi a chaque passage dans la boucle ce qui donne un rendu très sacadé
    D'avance merci

    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
     //Tant que l'utilisateur n'a pas quitter
        while( quit == false ) {
     
     
     
               //Récupération du keystates 
               Uint8 *keystates = SDL_GetKeyState( NULL );
     
               //Si Haut est pressé 
               if( keystates[ SDLK_UP ] ) { 
     
                   j=j-1;
     
                   if(j<0)
                   {
                           j=480;
                   }
     
     
                    //Application du message sur l'ecran
                    apply_surface( i,j, message, screen);
     
     
     
                    //mise à jour de l'ecran
                    if( SDL_Flip( screen ) == -1 ) {
                    return 1;
                    } 
     
               } 
     
               //Si bas est pressé 
               if( keystates[ SDLK_DOWN ] ) { 
     
                   j=j+1;
     
                   if(j>480)
                   {
                           j=0;
                   }
     
    	            //Application du message sur l'ecran
                    apply_surface( i, j, message, screen );
     
                    //mise à jour de l'ecran
                    if( SDL_Flip( screen ) == -1 ) {
                    return 1;
                    } 
               } 
     
               //Si gauche est pressé 
               if( keystates[ SDLK_LEFT ] ) { 
     
                   i=i-1;
                   if(i<0)
     
                   {
                           i=640;
                   }
     
    	            //Application du message sur l'ecran
                    apply_surface( i, j, message, screen );
     
                    //mise à jour de l'ecran
                    if( SDL_Flip( screen ) == -1 ) {
                    return 1;
                    } 
               } 
     
               //Si droite est pressé 
               if( keystates[ SDLK_RIGHT ] ) { 
     
                   i=i+1;
                   if(i>640)
                   {
                           i=0;
                   }
     
    	            //Application du message sur l'ecran
                    apply_surface( i, j, message, screen );
     
                    //mise à jour de l'ecran
                    if( SDL_Flip( screen ) == -1 ) {
                    return 1;
                    } 
               } 
     
               //Application des surfaces sur l'ecran
                apply_surface( 0, 0, background, screen );
     
     
               //Application du message sur l'ecran
               apply_surface( i, j, message, screen);
     
                    //mise à jour de l'ecran
                    if( SDL_Flip( screen ) == -1 ) {
                    return 1;
                    } 
     
            //tant qu'il y a un evenement dans le handler
            while( SDL_PollEvent( &event ) ) {
                //Si l'utilisateur ferme la fenetre avec le X
                if( event.type == SDL_QUIT ) {
                    //On quitte le programme
                    quit = true;
                }
            }
        }
    Aarbaal

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je ne comprends pas pourquoi tu fais un apply_surface(message) et un SDL_Flip dans chacune de tes conditions concernant l'appui des flèches, vu que tu le fais de toute façon (et de manière correcte) à la fin de ta boucle de rendu.

    Virer ces lignes redondantes devrait régler ton problème de saccades.

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    En fait j'effectuais cette afichage dans l' optique dajouter une série de sprites a la place de "message" . dans ce style la
    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
      //Si Haut est pressé 
               if( keystates[ SDLK_UP ] ) { 
     
                   j=j-10;
     
                   if(j<0)
                   {
                           j=480;
                   }
     
     
                 //Application du message sur l'ecran
                 apply_surface( i, j, message, screen,&clip[ 0 ]);
                 //mise à jour de l'ecran
                    if( SDL_Flip( screen ) == -1 ) {
                    return 1;
                    }
                    SDL_Delay(200);
                //Application des surfaces sur l'ecran
                apply_surface( 0, 0, background, screen);   
     
               //Application du message sur l'ecran
               apply_surface( i, j, message, screen,&clip[ 1 ]);
                //mise à jour de l'ecran
                    if( SDL_Flip( screen ) == -1 ) {
                    return 1;
                    } 
                    SDL_Delay(200);
                 //Application des surfaces sur l'ecran
                apply_surface( 0, 0, background, screen);        
     
               //Application du message sur l'ecran
               apply_surface( i, j, message, screen,&clip[ 2 ]);
     
                //mise à jour de l'ecran
                    if( SDL_Flip( screen ) == -1 ) {
                    return 1;
                    } 
                     SDL_Delay(200);
     
     
               }
    les clip 0, 1 & 2 corespondant aux parties de ma sprite sheet découpé mais mon probleme de sacade persiste

  4. #4
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Il ne faut pas voir SDL_Flip comme une fonction qui met à jour l'écran mais une fonction qui dit à la carte graphique que le code de rendu est fini.

    Entre chaque SDL_Flip, il faut redessiner (par précaution) TOUTE la scéne.

    Donc :
    - Un seul appel à SDL_Flip par code de rendu de toute la scéne
    - Pas de SDL_Delay dans le code de rendu
    - Si tu veux faire afficher quelque chose pendant un certain temps, utilise un entier qui servira d'état et fais un switch dessus pour dessiner ce qui t'intéresse. Test le temps que tu es dedans et après X ms, change d'état. Vouloir bloquer la boucle générale SDL est une erreur de conception.

    Jc

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour ces explications

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

Discussions similaires

  1. [VB2005] Gestion des évenement dans une fonction
    Par arnolem dans le forum Windows Forms
    Réponses: 8
    Dernier message: 24/07/2006, 09h07
  2. Question sur la gestion de l'affichage en VBA
    Par papilou86 dans le forum Access
    Réponses: 5
    Dernier message: 29/05/2006, 10h26
  3. [TComPort] gestion des évenements
    Par akabane dans le forum Composants VCL
    Réponses: 2
    Dernier message: 10/05/2006, 10h29
  4. gestion de l'affichage des composants
    Par Foub dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 25/08/2005, 11h37
  5. [texte] gestion de l'affichage d'une page
    Par guy2004 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 10/07/2005, 18h37

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