Phraides | 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 :
- #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;
- [...]
- 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;
- SDL_Rect dest2;
- [...]
- 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! Message édité par Phraides le 26-06-2006 à 16:27:03
|