[SDL] Affichage dans un thread

Affichage dans un thread [SDL] - C++ - Programmation

Marsh Posté le 26-06-2006 à 16:16:03    

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, un peu allégé :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include <SDL/SDL.h>
  5. #include <SDL/SDL_thread.h>
  6. SDL_Surface *back;
  7. SDL_Surface *image;
  8. SDL_Surface *screen;
  9. SDL_Thread *thread= NULL;
  10. int xpos=0,ypos=0;
  11. int done=0;
  12. //initialisation des images
  13. int InitImages()
  14. {
  15.   back = SDL_LoadBMP("bleu.bmp" );
  16.   image=SDL_LoadBMP("loup5.bmp" );
  17.  
  18.   Uint32 colorkey = SDL_MapRGB( image->format,0,0xFF,0xFF);
  19.   SDL_SetColorKey( image, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey);
  20.  
  21.  
  22.   return 0;
  23. }
  24. //fonctions d'affichage
  25. void DrawIMG(SDL_Surface *img, int x, int y)
  26. {
  27.   SDL_Rect dest;
  28. [...]
  29.   SDL_BlitSurface(img, NULL, screen, &dest);
  30. }
  31. void DrawIMG(SDL_Surface *img, int x, int y, int w, int h, int x2, int y2)
  32. {
  33.   SDL_Rect dest;
  34.   SDL_Rect dest2;
  35. [...]
  36.   SDL_BlitSurface(img, &dest2, screen, &dest);
  37. }
  38. //dessin du BG
  39. void DrawBG()
  40. {
  41.   DrawIMG(back, 0, 0);
  42. }
  43. //fonction de dessin
  44. void DrawScene()
  45. {
  46.   DrawIMG(back, xpos-2, ypos-2, 132, 132, xpos-2, ypos-2);
  47.   DrawIMG(image, xpos, ypos);
  48.  
  49.   SDL_Flip(screen);
  50. }
  51. //le thread
  52. int my_thread( void *data )
  53. {
  54.   //on dessine la scene  
  55.   while(done == 0)
  56.   {
  57.     DrawScene();
  58.    
  59.   }
  60.     return 0;
  61. }
  62. int main(int argc, char *argv[])
  63. {
  64.   SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO);
  65.   atexit(SDL_Quit);
  66.   screen=SDL_SetVideoMode(1024,768,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
  67.   InitImages();
  68.   DrawBG();
  69.   //on crée le thread
  70.   thread = SDL_CreateThread( my_thread, NULL );
  71.    
  72.   Uint8* keys;
  73.  
  74.   //boucle qui gere les events clavier
  75.   while(done == 0)
  76.   {
  77.     SDL_Event event;
  78.     while ( SDL_PollEvent(&event) )
  79.     {
  80.       if ( event.type == SDL_QUIT )  {  done = 1;  }
  81.       if ( event.type == SDL_KEYDOWN )
  82.       {
  83.         if ( event.key.keysym.sym == SDLK_ESCAPE ) { done = 1; }
  84.       }
  85.     }
  86.    
  87.     keys = SDL_GetKeyState(NULL);
  88.     if ( keys[SDLK_UP] ) { ypos -= 1; }
  89.     if ( keys[SDLK_DOWN] ) { ypos += 1; }
  90.     if ( keys[SDLK_LEFT] ) { xpos -= 1; }
  91.     if ( keys[SDLK_RIGHT] ) { xpos += 1; }
  92.    
  93.   }
  94.  
  95.   return 0;
  96. }


 
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!


Message édité par Phraides le 26-06-2006 à 16:27:03
Reply

Marsh Posté le 26-06-2006 à 16:16:03   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed