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 :

Double buffering : affichage de sprite


Sujet :

SDL

  1. #1
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut Double buffering : affichage de sprite
    Salut,

    Je me lance dans la 2d (bas niveau) avec SDL et j'ai un peu de mal...
    Si je comprend bien le principe du bouble buffering, il me faut (par exemple pour afficher un sprite) 3 SDL_Surface : screen, buffer et sprite.
    Je charge la bmp dans sprite, je blit sprite dans le buffer, je blit le buffer sur l'ecran..Etc..
    Voila deja peut etre que ma theorie est incorrecte, si c'est le cas, n'hesitez pas à me corriger

    Voici maintenant ma pratique :
    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
    int main(int argc, char *argv[])
    {
    	SDL_Surface *screen, *buffer, *sprite;
    	SDL_Rect rect;
    	/* Initialisation de SDL */
    	if &#40; SDL_Init&#40;SDL_INIT_VIDEO&#41; < 0 &#41; 
    	&#123;
    		printf&#40;"Erreur initialisation de SDL !\n"&#41;;
    	&#125;
    	else
    	&#123;
    		printf&#40;"Initialisation de SDL reussit !!\n"&#41;;
    		screen = SDL_SetVideoMode&#40;800,600,16,SDL_SWSURFACE | SDL_DOUBLEBUF&#41;;
    		if &#40; screen == NULL &#41;
    		&#123;
    			printf&#40;"Impossible d'initialiser le mode video !\n"&#41;;
    		&#125;
    		else
    		&#123;
    			SDL_FillRect&#40;screen,NULL,0&#41;;
    			sprite = SDL_LoadBMP&#40;"./test.bmp"&#41;;
    			if &#40; sprite == NULL &#41;
    			&#123;
    				printf&#40;"Impossible de charger le bmp !\n"&#41;;
    			&#125;
    			else
    			&#123;
    				buffer = SDL_CreateRGBSurface&#40;SDL_SWSURFACE,800,600,16,0,0,0,0&#41;;
    				if &#40; buffer == NULL &#41;
    				&#123;
    					printf&#40;"Impossible de créer le buffer !\n"&#41;;
    				&#125;
    				else
    				&#123;
    					SDL_FillRect&#40;buffer,NULL,0&#41;;
    					SDL_BlitSurface&#40;sprite,NULL,buffer,NULL&#41;;
    					SDL_BlitSurface&#40;buffer,NULL,screen,NULL&#41;;
    					SDL_Flip&#40;screen&#41;;
    					printf&#40;"Flip effectué\n"&#41;;
    				&#125;
    			&#125;
    		&#125;
    	&#125;
    	return 0;
    &#125;
    L'affichage est catastrophique..des morceaux de la bmp sont eparpillés un peu partout
    J'espere que c'est pas trop grave,

    Merci pour toute reponse
    A+
    Sorry
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  2. #2
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    J'ai modifié mon code (j'ai retiré un SDL_Surface et trifouillé les mode video..).
    Maintenant ça s'affiche nickel !

    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
    int main&#40;int argc, char *argv&#91;&#93;&#41;
    &#123;
    	SDL_Surface *screen, *sprite;
    	SDL_Rect src, dest;
    	/* Initialisation de SDL */
    	if &#40; SDL_Init&#40;SDL_INIT_VIDEO&#41; < 0 &#41; 
    	&#123;
    		printf&#40;"Erreur initialisation de SDL !\n"&#41;;
    	&#125;
    	else
    	&#123;
    		printf&#40;"Initialisation de SDL reussit !!\n"&#41;;
    		screen = SDL_SetVideoMode&#40;640,480,8,SDL_SWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN&#41;;
    		if &#40; screen == NULL &#41;
    		&#123;
    			printf&#40;"Impossible d'initialiser le mode video !\n"&#41;;
    		&#125;
    		else
    		&#123;
    			SDL_FillRect&#40;screen,NULL,0&#41;;
    			sprite = SDL_LoadBMP&#40;"./test.bmp"&#41;;
    			if &#40; sprite == NULL &#41;
    			&#123;
    				printf&#40;"Impossible de charger le bmp !\n"&#41;;
    			&#125;
    			else
    			&#123;
    					src.w = sprite->w;
    					src.h = sprite->h;
    					dest.w = sprite->w;
    					dest.h = sprite->h;
    					src.x = 0;
    					src.y = 0;
    					dest.x = 200;
    					dest.y = 200;
    					SDL_BlitSurface&#40;sprite,&src,screen,&dest&#41;;
    					SDL_Flip&#40;screen&#41;;
    					printf&#40;"Flip effectué\n"&#41;;
    			&#125;
    		&#125;
    	&#125;
    	return 0;
    &#125;
    Mais est-ce bien du bouble buffering ? Ce code est-il correct ?
    Je precise que je developpe pour la ps2, c'est donc sur ma vieille télé qu'est affiché mon sprite. Cela ne s'affiche correctement qu'en mettant 640*480*8 en resolution, sinon ça "merdasse".
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  3. #3
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Du moment que tu initialise SDL avec le flag SDL_DOUBLEBUF et que tu flip l'écran à la fin de ta boucle d'affiche, tu as du double buffering. Il est geré par SDL et tu n'as pas à faire de buffer toi-même comme dans ton premier code.

    Ton deuxième me semble correct.

    Bonne continuation

    [edit] Comment tu fais pour développer sur PS2 ? Tu dois avoir le kit de développement et recompiler et ça suffit ? Je ne savais pas que SDL était compatible pour PS2. [/edit]
    Fiquet
    - FAQ SDL
    - FAQ C++

  4. #4
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Fiquet
    Du moment que tu initialise SDL avec le flag SDL_DOUBLEBUF et que tu flip l'écran à la fin de ta boucle d'affiche, tu as du double buffering. Il est geré par SDL et tu n'as pas à faire de buffer toi-même comme dans ton premier code.

    Ton deuxième me semble correct.

    Bonne continuation

    [edit] Comment tu fais pour développer sur PS2 ? Tu dois avoir le kit de développement et recompiler et ça suffit ? Je ne savais pas que SDL était compatible pour PS2. [/edit]
    Salut,

    Oui en effet je me suis apperçu après que SDL gérait toute seule le deuxième buffer.

    Pour le developpement sur ps2, il existe un kit de developpement gratuit, fait par des génies, le ps2dev (disponible sur le site ICI.
    Pour SDL, il y a en effet un autre génie qui réalise son portage pour le ps2dev.
    Si tu l'installes, je te conseil la version linux (ou cygwin).
    Si tu as d'autres questions ou des problèmes n'hesite pas mais je ne suis pas (encore ) un expert...

    A+
    Sorry
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Moi aussi j'ai commencé y'a pas longtemps sur SDL et j'avais trouvé un très bon tutorial sur les bases, dont le double buffering.

    En fait, lorsque tu indiques SDL_BOUBLEBUF, SDL crée deux surfaces d'écran. Pendant que y'en a une qui est affiché, le blitage se fait sur l'autre surface, et lorsque tu appelles SDL_Flip, tu fais en fait pointer le pointeur de la vidéo sur l'autre surface (sur laquelle tu désinais), et ainsi, tu dessineras ensuite sur le première.

    Si tu ne savais pas, j'espère que tu as compris.
    Mes sites :
    - Portail : http://www.azharis.fr/
    - Neuroshima Hex : http://neuroshima-hex.azharis.fr/
    - Monolith Arena : http://monolith-arena.azharis.fr/

  6. #6
    mat.M
    Invité(e)
    Par défaut
    oui c'est correct sorry60.
    qu'est ce que tu ne comprends pas ?
    Tu dessines tout d'abord dans des tampons mémoires et le dernier tampon est copié en mémoire vidéo

  7. #7
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par mat.M
    oui c'est correct sorry60.
    qu'est ce que tu ne comprends pas ?
    Tu dessines tout d'abord dans des tampons mémoires et le dernier tampon est copié en mémoire vidéo
    non c'est bon maintenant je comprends tout
    C'est juste que je restais sur allegro où pour faire du double buffering il fallait avoir 2 buffers..
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

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

Discussions similaires

  1. [MFC] Scinttillement vs Double buffering
    Par DamessS dans le forum MFC
    Réponses: 9
    Dernier message: 07/04/2005, 10h01
  2. Réponses: 1
    Dernier message: 04/04/2005, 12h19
  3. Tri à bulle - Affichage de sprite
    Par Gory dans le forum Assembleur
    Réponses: 5
    Dernier message: 10/03/2005, 16h27
  4. Réponses: 7
    Dernier message: 03/08/2004, 17h33
  5. [Exception]Double buffering & NullPointerException
    Par Seiya dans le forum API standards et tierces
    Réponses: 25
    Dernier message: 09/07/2004, 19h41

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