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 :

Ecran tampon pour afficher du texte sur une image [SDL 2.0]


Sujet :

SDL

  1. #1
    Membre habitué Avatar de vivid
    Profil pro
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 135
    Points
    135
    Par défaut Ecran tampon pour afficher du texte sur une image
    Bonjour,

    Avec la SDL2 travailler en 2d avec un 'renderer tampon' est-ce possible ? ou pas utile ?

    Donc j'ai un renderer, mais j'aimerais essayer de copier tout mes bitmaps dans un tampon a part pour ensuite le copier sur le renderer final. Suis-je clair

    J'ai fait sur Mac (9), Atari... travailler sur un double buffer.

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    La SDL2 travaille deja avec un double buffer.
    Juste que sur SDL2 , le buffer n'est pas facilement accessible parce qu'il sur trouve sur la VRAM et accéder a cette VRAM est longue coté CPU.

    Si tu veux avoir avoir un "buffer" cote CPU tu peux donc utiliser SDL_BlitSurface , mais si c'est pour faire un double buffer ,ça sert à rien par défaut elle ont a deja un.

  3. #3
    Membre habitué Avatar de vivid
    Profil pro
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 135
    Points
    135
    Par défaut
    ok.

    cela aussi m'est venu a l'esprit parce que j'ai affiché une simple image est ensuite un texte est c'est le texte qui a tout écraser il n'y a pas eu de superposition, l'image et le texte.

    Merci.

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    si tu as du code , n'hésite pas à le poster

  5. #5
    Membre habitué Avatar de vivid
    Profil pro
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 135
    Points
    135
    Par défaut
    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
    #include <SDL2/SDL.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <OpenGL/gl3.h>
    #include <SDL2_image/SDL_image.h>
    #include <SDL_ttf/SDL_ttf.h>
    #include <SDL2_ttf/SDL_ttf.h>
     
    int main(int argc, char** argv)
    {
        SDL_Surface * is = NULL,*texte = NULL,*image = NULL;
        SDL_DisplayMode dpm;
        SDL_GetDesktopDisplayMode(0, &dpm);
        SDL_Renderer *renderer = NULL;
     
        TTF_Font *fonts = NULL;
        SDL_Color ct ={ 255, 255, 255 };
        SDL_Rect pt;
        int texW=0, texH=0,tx=0,ty=0;
     
        int quit = 0;
     
        TTF_Init();
     
        if (TTF_Init() != 0){
            SDL_Quit();
            return 1;
        }
       fonts = TTF_OpenFont("Arial.ttf",65);
     
        SDL_Event event;IMG_Init(IMG_INIT_PNG);
        /* Initialisation simple */
        if (SDL_Init(SDL_INIT_VIDEO) != 0 )
        {
            fprintf(stdout,"Échec de l'initialisation de la SDL (%s)\n",SDL_GetError());
            return -1;
        }
     
            /* Création de la fenêtre */
            SDL_Window* pWindow = NULL;
            pWindow = SDL_CreateWindow("Ma première application SDL2",SDL_WINDOWPOS_UNDEFINED,
                                       SDL_WINDOWPOS_UNDEFINED,
                                       800,
                                       600,
                                       SDL_WINDOW_RESIZABLE);
     
     
        renderer = SDL_CreateRenderer(pWindow, -1, SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC);
        image =malloc(sizeof(SDL_Surface));
        image = SDL_LoadBMP("image.bmp");
        if(!image)
        {
            printf("Erreur de chargement de l'image : %s",SDL_GetError());
            return -1;
        }
        SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, image);SDL_FreeSurface(image);
     
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);
     
        pt.x = 10;pt.y = 21;
        texte=TTF_RenderText_Blended(fonts, "Avé frater", ct);
        SDL_Texture* texturet = SDL_CreateTextureFromSurface(renderer, texte);
        SDL_QueryTexture(texturet, NULL, NULL, &tx, &ty);
        SDL_Rect dstrect = { 10, 53, texW, texH };
        dstrect.x = 10;
        dstrect.y = 53;
        dstrect.w = tx;
        dstrect.h = ty;
        SDL_RenderCopy(renderer, texturet, NULL, &dstrect);
        SDL_RenderPresent(renderer);
     
     
        SDL_UpdateWindowSurface(pWindow);
        while (!quit)
        {
            SDL_WaitEvent(&event);
     
            switch (event.type)
            {
                case SDL_QUIT:
                    quit = 1;
                    break;
            }
        }
     
     
        IMG_Quit();SDL_DestroyWindow(pWindow);SDL_DestroyRenderer(renderer);
        SDL_FreeSurface(is);
        SDL_Quit();
        TTF_CloseFont(fonts);
        TTF_Quit();
        return 0;
    }

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 386
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 386
    Points : 20 475
    Points
    20 475
    Par défaut
    Citation Envoyé par vivid Voir le message
    ok.
    cela aussi m'est venu a l'esprit parce que j'ai affiché une simple image est ensuite un texte est c'est le texte qui a tout écraser il n'y a pas eu de superposition, l'image et le texte.
    Merci.
    d'une part SDL met des images en mémoire avec SDL_Surface.
    Ensuite le problème évoqué c'est un problème de tri/séquence dans l'affichage.
    Afin que du texte ne vienne pas écraser l'image précédente il faut définir une "color key" bref une couleur de transparence avec SDL_SetColorKey.
    Et ensuite SDL et la carte graphique affichera tous les pixels sauf cette couleur de transparence.
    Bref c'est le B.A. BA de l'affichage 2d consulter les tutos sur ce site, ça doit être certainement expliqué

  7. #7
    Membre habitué Avatar de vivid
    Profil pro
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 135
    Points
    135
    Par défaut
    Merci Mat

    le principe de transparence je connais... mais jetait loin de me douté de son utilité pour afficher du texte avec la SDL, d’ailleurs survolé parce que dans ma 'culture', transparence=>sprite, bref le Pc ne cesseras pas de me surprendre.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 386
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 386
    Points : 20 475
    Points
    20 475
    Par défaut
    Citation Envoyé par vivid Voir le message
    bref le Pc ne cesseras pas de me surprendre.
    le principe de la transparence n'a rien à voir avec PC, Mac ou smartphone.
    C'est un des trucs de base pour apprendre à programmer un jeu vidéo.
    C'est tout simple, non ?
    Sinon dans le code présenté précédemment pourquoi faire des mallocs ?
    La SDL ne prend pas en charge les allocations mémoires ?

  9. #9
    Membre habitué Avatar de vivid
    Profil pro
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    le principe de la transparence n'a rien à voir avec PC, Mac ou smartphone.
    C'est un des trucs de base pour apprendre à programmer un jeu vidéo.
    C'est tout simple, non ?
    oui, merci c'est tout simple mais c'est bien la première fois qu'il me faut 'jouer' sur la transparence pour afficher... du texte

    Citation Envoyé par Mat.M Voir le message
    Sinon dans le code présenté précédemment pourquoi faire des mallocs ?
    La SDL ne prend pas en charge les allocations mémoires ?
    Ou c'était avec l'exemple, ou un test de ma part.

    Merci.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 042
    Points
    33 042
    Billets dans le blog
    4
    Par défaut
    Le code fait des allocations inutiles et génère des fuites mémoires.
    Tu affiches un truc à l'écran, puis en affiches un autre, forcément le premier a disparu. Justement parce que SDL2 fait du double buffering par défaut.
    La doc de SDL_RenderPresent est il me semble assez claire.
    Puis initialiser TTF avant SDL, curieux que ça marche, ou encore les lignes qui contiennent plusieurs instructions, ça tue la lisibilité.

  11. #11
    Membre habitué Avatar de vivid
    Profil pro
    Inscrit en
    Février 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 174
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    le principe de la transparence n'a rien à voir avec PC, Mac ou smartphone.
    C'est un des trucs de base pour apprendre à programmer un jeu vidéo.
    C'est tout simple, non ?
    Sinon dans le code présenté précédemment pourquoi faire des mallocs ?
    La SDL ne prend pas en charge les allocations mémoires ?
    Cela me paraissait gros de devoir utiliser la transparence pour afficher du texte...

    Bref, la transparence n'avait aucun rapport avec mon problème, j'avais juste un 'renderer' de trop (c'est quand même plus logique).

    Merci.

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 17/10/2002, 20h06
  2. Réponses: 6
    Dernier message: 10/09/2002, 03h35
  3. plein écran
    Par patapetz dans le forum OpenGL
    Réponses: 9
    Dernier message: 21/08/2002, 14h15
  4. Creer un écran de veille
    Par Willand dans le forum C++Builder
    Réponses: 2
    Dernier message: 09/08/2002, 12h36
  5. recuperer la résolution de l'écran
    Par florent dans le forum C++Builder
    Réponses: 11
    Dernier message: 07/06/2002, 15h01

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