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 :

problème de compréhension de la méthode de base


Sujet :

SDL

  1. #1
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut problème de compréhension de la méthode de base
    Bonjour a tous,
    Apres un long moment passé sur les différent tutoriels du net, je ne m'en sors pas. Je veux pour le moment pouvoir déplacer un rectangle (sans image ni rien).

    J'ai réussi a le faire en affichant mon rectangle a une position puis a chaque boucle d'évènement, j'éffacais entièrement l'écran (solution limité).

    Je m'attaque au double buffer.

    Si j'ai bien compris je déclare deux surface (qui seront intervertient par SDL_Flip() ).
    Donc mes deux surfaces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SDL_Surface *screen;
    SDL_Surface *srcbuf;
    Je déclare aussi un rectangle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SDL_Rect rec;
      rec.x=50;//ainsi que ses attributs
      rec.y=50;
      rec.h=100;
      rec.w=100;
    Et la je bloque, si j'ai bien compris je dois enregistrer le rectangle dans ma surface template, ici srcbuf, mais avec quelle fonction. J'ai éssayer de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_FillRect(srcbuf, &rec, SDL_MapRGB(screen->format, 0, 0, 255));
    mais ca renvoi une erreur (Fatal signal: Segmentation Fault (SDL Parachute Deployed)).

    Donc en fait je dois enregistrer rec dans srcbuf avant de faire un SDL_Flip(screen); mais comment le faire?

    Ce que je ne comprend pas non plus, c'est le SDL_BlitSurface();, cette fonction copie le rectangle d'une surface dans un rectangle de destination d'une autre surface, alors pourquoi utilliser SDL_Flip ensuite.

    Désolé tout ca n'ets pas tres clair, a l'image de ma pensé par rapport a ce problème. C'est la base de SDL ce doublebuff.

    Merci beaucoup !

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_Surface *srcbuf;
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_FillRect(srcbuf, &rec, SDL_MapRGB(screen->format, 0, 0, 255));
    Entre les deux, tu as initialisé ta variable srcbuf ?
    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

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par skysee
    Je m'attaque au double buffer.

    Si j'ai bien compris je déclare deux surface (qui seront intervertient par SDL_Flip() ).
    Donc mes deux surfaces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SDL_Surface *screen;
    SDL_Surface *srcbuf;
    Le double buffering est un processus interne qui est appliqué à une seule surface en même temps donc dans ton cas cela s'applique à ta surface screen ( SDL_Flip (screen); ) !

    Ta surface srcbuf n'est utilisée ici que pour l'affichage du rectangle mais pour pouvoir dessiner dessus, il te faut l'initialiser avec SDL_CreateRGBSurface (sauf si tu y charge une image, cela va de soi !) soit de la manière suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    srcbuf = SDL_CreateRGBSurface (
          SDL_SWSURFACE,
          rec.w,
          rec.h,
          screen->format->BitsPerPixel,
          screen->format->Rmask,
          screen->format->Gmask,
          screen->format->Bmask,
          screen->format->Amask
    );
    Ici la surface est initialisée avec les mêmes paramètres de profondeur des pixels que ta fenêtre !
    Maintenant tu peux dessiner dedans !

    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par skysee
    Donc en fait je dois enregistrer rec dans srcbuf avant de faire un SDL_Flip(screen); mais comment le faire?

    Ce que je ne comprend pas non plus, c'est le SDL_BlitSurface();, cette fonction copie le rectangle d'une surface dans un rectangle de destination d'une autre surface, alors pourquoi utilliser SDL_Flip ensuite.

    Désolé tout ca n'ets pas tres clair, a l'image de ma pensé par rapport a ce problème. C'est la base de SDL ce doublebuff.

    Merci beaucoup !
    La procédure à suivre est la suivante:

    • Création de la fenetre
    • Initialisation d'une surface de dessin
    • On dessine dans la surface de dessin
    • On Blit la surface de dessin sur celle de l'écran
    • On inverse les buffer dans le cas d'un Double Buffering d'après la surface de l'écran


    Pour ton Blit tu peux procéder ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_BlitSurface (srcbuf, NULL, screen, & rec);
    Puis tu inverse les buffers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_Flip (screen);
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    HA
    merci beaucoup!
    Oui donc pour le moment je ne charge pas d'image dans mon rectangle. Merci de m'avoir donné cette fonction

    Seulement un problème subsiste :
    Le double buffering est un processus interne qui est appliqué à une seule surface en même temps donc dans ton cas cela s'applique à ta surface screen ( SDL_Flip (screen); ) !
    La je ne saisi pas trop... une seule surface mais 2 surfaces...
    En fait ca veut dire que ce que je vois a l'écran est ma surface en cour(screen), c'est bien ca, ensuite quand le programme se déroule et qu'il rencontre un blitsurface, il colle le rectangle (par exemple) dans un double de screen qui est en attente de sdl_flip dans la pile?
    Le sdl_flip intervertie alors les deux screen (les deux emplacements dans la pile)?

    Si c'est bien ca, c'est ce que je ne comprenait pas.

    Merci

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par skysee
    HA
    merci beaucoup!
    Oui donc pour le moment je ne charge pas d'image dans mon rectangle. Merci de m'avoir donné cette fonction

    Seulement un problème subsiste :

    La je ne saisi pas trop... une seule surface mais 2 surfaces...
    En fait ca veut dire que ce que je vois a l'écran est ma surface en cour(screen), c'est bien ca, ensuite quand le programme se déroule et qu'il rencontre un blitsurface, il colle le rectangle (par exemple) dans un double de screen qui est en attente de sdl_flip dans la pile?
    Le sdl_flip intervertie alors les deux screen (les deux emplacements dans la pile)?

    Si c'est bien ca, c'est ce que je ne comprenait pas.

    Merci
    C'est bien ca

    Dès que tu fait un Blit ou autre opérations, cela se déroule dans un buffer temporaire, une fois que tu fait ton SDL_Flip, là le buffer temporaire est dessiné sur ton screen et ainsi de suite !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    Merci a vous de m'avoir éclairer
    bye bye

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Au plaisir
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    Apres plusieurs test une autre question arrive, en effet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      rec.x=50;dst.x = 200;
      rec.y=50;dst.y = 200;
      rec.h=200;dst.h = 50;
      rec.w=200;dst.w = 50;
    ......
    SDL_BlitSurface(srcbuf, &rec, screen, &dst);
    la je colle rec dans dst, pas de problème jusque la, mais je décare mon rectangle de destination de 50*50 alors que mon rectangle source est de 200*200.
    Quand je test les dimenssions de mon rectangle de destination sont modifié et prennent celle de mon rectangle source c'est a dire 200*200.

    c'est embetant, je sais que sdl ne gere pas tout seul les transformations mais la il ne s'agit pas d'un problème de transformation mais d'affichage, en effet je ne devrais voir qu'un rectangle 50*50 et le reste du rectangle devrait etre caché non?

    J'en demande trop?

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Si tu veux effectuer des transformations sur ton rectangle il faut le redessiner completement sur ta surface, le Blit tout seul ne suffit plus. Le Blit ne sert qu'à déclaquer en quelques sortes une surface sur une autre, ici sur le buffer de dessin de ta fenetre !

    Quel est le but de ton programme ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    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 skysee
    Apres plusieurs test une autre question arrive, en effet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      rec.x=50;dst.x = 200;
      rec.y=50;dst.y = 200;
      rec.h=200;dst.h = 50;
      rec.w=200;dst.w = 50;
    ......
    SDL_BlitSurface(srcbuf, &rec, screen, &dst);
    la je colle rec dans dst, pas de problème jusque la, mais je décare mon rectangle de destination de 50*50 alors que mon rectangle source est de 200*200.
    Quand je test les dimenssions de mon rectangle de destination sont modifié et prennent celle de mon rectangle source c'est a dire 200*200.

    c'est embetant, je sais que sdl ne gere pas tout seul les transformations mais la il ne s'agit pas d'un problème de transformation mais d'affichage, en effet je ne devrais voir qu'un rectangle 50*50 et le reste du rectangle devrait etre caché non?

    J'en demande trop?
    En fait, la taille de la destination est ignoré, c'est la position et la taille de la source qui sont utilisés pour afficher une partie ou non d'une image SDL.

    Voir le bon tutoriel de loka pour plus d'informations :
    http://loka.developpez.com/tutoriel/sdl/sprites/

    Jc

  12. #12
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    D'accord, merci pour ces précisions. Mon programma n'a pas but, je fais simplement divers test
    Bonne nuit et merci

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 01/02/2014, 20h42
  2. Problémes mémoire avec le bde sur des bases paradox
    Par Keke des Iles dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/05/2004, 16h55
  3. onclipevent (problème de compréhension)
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 24/09/2003, 15h09
  4. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

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