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 :

Affichage dans un thread // gestion du clavier!


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut Affichage dans un thread // gestion du clavier!
    Bonjour a tous,

    Je m'initie en ce moment a la librairie SDL, et je voudrais realiser un simple programme qui affiche une image que l'on peut faire bouger a l'aide des fleches directionnelles.
    J'y arrive tres bien en introduisant une boucle infini dans la procedure main, mais comme je prevois d'introduire un systeme client-server, j'ai décidé de mettre tout ce qui concernait l'affichage dans un thread SDL.
    Donc je resume :

    Dans la fonction main, on a la boucle qui gere les events au clavier,
    dans le thread my_thread, on a la boucle qui dessine.

    Seulement cela ne marche pas, j'ai bien mon ecran qui s'affiche, la background, et l'image que je veux faire bouger, et quand j'appuie sur les fleches, je vois des bugs d'affichage, mon image qiu se dessine un peu partout, puis ca ne repond plus, etc...
    Je pense que cela vient du thread puisque sans, cela marche bien...

    Voila 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
    130
    131
    132
    133
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
     
    #include <SDL/SDL.h>
    #include <SDL/SDL_thread.h>
     
    SDL_Surface *back;
    SDL_Surface *image;
    SDL_Surface *screen;
     
     
    SDL_Thread *thread= NULL;
     
    int xpos=0,ypos=0;
    int done=0;
     
    //initialisation des images
    int InitImages()
    {
      back = SDL_LoadBMP("bleu.bmp");
      image=SDL_LoadBMP("loup5.bmp");
     
      Uint32 colorkey = SDL_MapRGB( image->format,0,0xFF,0xFF);
      SDL_SetColorKey( image, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey);
     
     
      return 0;
    }
     
    //fonctions d'affichage
    void DrawIMG(SDL_Surface *img, int x, int y)
    {
      SDL_Rect dest;
      dest.x = x;
      dest.y = y;
      SDL_BlitSurface(img, NULL, screen, &dest);
    }
     
    void DrawIMG(SDL_Surface *img, int x, int y, int w, int h, int x2, int y2)
    {
      SDL_Rect dest;
      dest.x = x;
      dest.y = y;
      SDL_Rect dest2;
      dest2.x = x2;
      dest2.y = y2;
      dest2.w = w;
      dest2.h = h;
      SDL_BlitSurface(img, &dest2, screen, &dest);
    }
     
    //dessin du BG
    void DrawBG()
    {
     
      DrawIMG(back, 0, 0);
     
    }
     
    //fonction de dessin
    void DrawScene()
    {
     
      DrawIMG(back, xpos-2, ypos-2, 132, 132, xpos-2, ypos-2);
     
      DrawIMG(image, xpos, ypos);
     
      SDL_Flip(screen);
     
    }
     
    //le thread
    int my_thread( void *data ) 
    {
     
      //on dessine la scene 
      while(done == 0)
      {
     
        DrawScene();
     
      }
        return 0;
     
    }
     
    int main(int argc, char *argv[])
    {
     
     
      SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO);
     
      atexit(SDL_Quit);
     
      screen=SDL_SetVideoMode(1024,768,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
     
      InitImages();
     
      DrawBG();
     
      //on crée le thread
      thread = SDL_CreateThread( my_thread, NULL );
     
      Uint8* keys;
     
      //boucle qui gere les events clavier
      while(done == 0)
      {
        SDL_Event event;
     
        while ( SDL_PollEvent(&event) )
        {
          if ( event.type == SDL_QUIT )  {  done = 1;  }
     
          if ( event.type == SDL_KEYDOWN )
          {
            if ( event.key.keysym.sym == SDLK_ESCAPE ) { done = 1; }
          }
        }
     
        keys = SDL_GetKeyState(NULL);
        if ( keys[SDLK_UP] ) { ypos -= 1; }
        if ( keys[SDLK_DOWN] ) { ypos += 1; }
        if ( keys[SDLK_LEFT] ) { xpos -= 1; }
        if ( keys[SDLK_RIGHT] ) { xpos += 1; }
     
      }
     
      return 0;
     
     
    }
    Est ce que c'est un probleme de conflit entre le thread et la procedure main? Faut t'il que j'utlise des mutex?
    Si quelqu'un a une idée je suis preneur

    Merci!

  2. #2
    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
    C'est plutôt une question que tu ne laisses pas le temps aux 2 threads de travailler ensembles...

    Lorsque j'appuie à droite, il est possible de bouger 5 fois vers la droite (dans la boucle événementielle) avant que ton thread de dessin le voit...

    C'est pour cela qu'il faut changer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      DrawIMG(back, xpos-2, ypos-2, 132, 132, xpos-2, ypos-2);
    en une version qui dessine au-dessus de la dernière position qui peut être plus petit que xpos-2... Tente d'utiliser deux variables pour sauvegarder la position.

    Ensuite, en mettant :
    à la fin des deux boucles (pour chaque thread) cela permettra de donner du temps à l'autre.

    Du moins, comme cela, ton programme fonctionne nettement mieux chez moi,
    Jc

    PS: Je n'ai pas fait la première correction (pour l'image de fond, je redessine entièrement)
    PPS: Ce n'est vraiment pas la peine d'utiliser des threads pour ton programme... Cela ne fera que compliquer les choses...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Daccord merci je vais essayer ca !

    Je prevois d'utiliser des threads pour gerer d'un coté l'affichage, et de l'autre coté le reseau, je ne vois pas comment faire sans threads sachant que certaines methodes utilisant le reseau sont bloquantes !

  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
    Citation Envoyé par phraides
    Daccord merci je vais essayer ca !

    Je prevois d'utiliser des threads pour gerer d'un coté l'affichage, et de l'autre coté le reseau, je ne vois pas comment faire sans threads sachant que certaines methodes utilisant le reseau sont bloquantes !
    Pour le réseau je suis d'accord mais pour l'affichage, je ne pense pas que ce soit nécessaire.

    Jc

  5. #5
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    oui je serai du même avis, ne te complique pas trop la tache , gère l'affichage et le clavier dans le même bloc (enfin en séparant en fonction quand même ;-) ), et puis gère le reseau par un thread a coté si tu ne peux pas faire autrement.
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  6. #6
    Invité4
    Invité(e)
    Par défaut
    Exact!
    Dans mon jeu en SDL, je gère clavier, affichage et tsoin-tsoin dans un thread.
    Le son dans un autre.
    Et la communication avec le serveur dans un autre.
    C'est très fluide.

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

Discussions similaires

  1. Problème d'affichage dans un thread
    Par mouette999 dans le forum C#
    Réponses: 8
    Dernier message: 29/11/2011, 17h15
  2. Gestion du clavier dans une application vb
    Par Mac Alceste dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 03/03/2007, 15h40
  3. Gestion d'un IdIcmpClient dans un thread
    Par yamino dans le forum Delphi
    Réponses: 3
    Dernier message: 27/12/2006, 13h21
  4. problème d'affichage dans un thread
    Par innosang dans le forum POSIX
    Réponses: 8
    Dernier message: 20/12/2006, 20h40
  5. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25

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