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 :

Ecrire un texte sur un graphique avec TTF en SDL2 [SDL_TTF]


Sujet :

SDL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 21
    Points : 14
    Points
    14
    Par défaut Ecrire un texte sur un graphique avec TTF en SDL2
    Bonsoir à tous,

    Je cherche à écrire du texte sur une fenêtre créée avec SDL2.

    J'ai essayé d'adapter un morceau de code SDL1.2/TTF mais je n'y arrive pas
    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
    //
    //* main.c
    //* test4
    //
    //* Created by Benoit Castagnetto on 10/02/2016.
    //* Copyright © 2016 Benoit Castagnetto. All rights reserved.
    //
    *
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL2_ttf/SDL_ttf.h>
    #include <SDL2_image/SDL_image.h>
    #include <SDL2/SDL.h>
    *
    int main (int argc, char** argv)
    {
    *****
    ****SDL_Window *ecran = NULL, *texte = NULL, *fond = NULL;
    ****SDL_Rect position;
    ****SDL_Event event;
    ****TTF_Font *police = NULL;
    ****SDL_Color couleurNoire = {0, 0, 0};
    ****int continuer = 1;
    *****
    ****SDL_Init(SDL_INIT_VIDEO);
    ****TTF_Init();
    *****
    //*** ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    //*** SDL_WM_SetCaption("Gestion du texte avec SDL_ttf", NULL);
    *
    ****ecran = SDL_CreateWindow("test", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    *
    *****
    //*** fond = IMG_Load("moraira.jpg");
    *****
    ****/* Chargement de la police */
    ****police = TTF_OpenFont("Arial", 65);
    ****/* Écriture du texte dans la SDL_Surface texte en mode Blended (optimal) */
    ****texte = TTF_RenderText_Blended(police, "Salut les Zér0s !", couleurNoire);
    *
    ****while (continuer)
    ****{
    ********SDL_WaitEvent(&event);
    ********switch(event.type)
    ********{
    ************case SDL_QUIT:
    ****************continuer = 0;
    ****************break;
    ********}
    *********
    ********SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
    *********
    ********position.x = 0;
    ********position.y = 0;
    ********SDL_BlitSurface(fond, NULL, ecran, &position); /* Blit du fond */
    *********
    ********position.x = 60;
    ********position.y = 370;
    ********SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte */
    ********SDL_Flip(ecran);
    ****}
    *****
    ****TTF_CloseFont(police);
    ****TTF_Quit();
    *****
    ****SDL_FreeSurface(texte);
    ****SDL_Quit();
    *****
    ****return EXIT_SUCCESS;
    }

    Je bloque sur ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte = TTF_RenderText_Blended(police, "Salut les Zér0s !", couleurNoire);
    Qui me renvoie comme erreur : Incompatible pointer types assigning to 'SDL_Window *' (aka 'struct SDL_Window *') from 'SDL_Surface *' (aka 'struct SDL_Surface *')

    Quelqu'un aurait-il un morceau de code fonctionnel pour faire ça avec TTF mais en SDL2 SVP ? Ou alors un site qui explique clairement comment faire (car j'ai écumé les 10 premières page de google sans trouver quelque chose d'assez simple pour moi) ?

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Pour paraphraser le compilateur : TTF_RenderText_Blended renvoie un SDL_Surface * or texte est un SDL_Window *, je ne sais pas trop quoi te dire d'autre..

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Bah mine de rien la paraphrase ça aide parfois ^^

    Puisque TTF_RenderText_Blended nécessite un SDL_surface j'ai créé cette modification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        SDL_Surface *pSurf = SDL_GetWindowSurface(ecran);
    et modifié le reste du code plus bas en remplaçant le pointeur écran par le pSurf.
    J'ai aussi passé le type du pointeur texte dans les déclarations de variables de SDL_window à SDL_surface (et tant qu'à faire j'ai supprimé le pointeur fond, inutile dans mon exemple je pense).

    Le code donne ça :

    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
    //
    //* main.c
    //* test4
    //
    //* Created by Benoit Castagnetto on 10/02/2016.
    //* Copyright © 2016 Benoit Castagnetto. All rights reserved.
    //
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL2_image/SDL_image.h>
    #include <SDL2/SDL.h>
    #include <SDL2_ttf/SDL_ttf.h>
     
    int main (int argc, char** argv)
    {
     
        SDL_Window *ecran = NULL;
        SDL_Surface *texte = NULL; //*fond = NULL;
        SDL_Rect position;
        SDL_Event event;
        TTF_Font *police = NULL;
        SDL_Color couleurNoire = {0, 0, 0};
        int continuer = 1;
     
        SDL_Init(SDL_INIT_VIDEO);
        TTF_Init();
     
        //*** ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        //*** SDL_WM_SetCaption("Gestion du texte avec SDL_ttf", NULL);
     
        ecran = SDL_CreateWindow("test", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
        SDL_Surface *pSurf = SDL_GetWindowSurface(ecran);
     
        //fond = IMG_Load("moraira.jpg");
     
        /* Chargement de la police */
        police = TTF_OpenFont("/Library/Fonts/Arial.ttf", 65);
        /* Écriture du texte dans la SDL_Surface texte en mode Blended (optimal) */
        texte = TTF_RenderText_Blended(police, "Salut", couleurNoire);
     
        while (continuer)
        {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
            continuer = 0;
            break;
        }
            SDL_FillRect(pSurf, NULL, SDL_MapRGB(pSurf->format, 255, 255, 255));
            position.x = 0;
            position.y = 0;
    //        SDL_BlitSurface(fond, NULL, pSurf, &position); /* Blit du fond */
    //        position.x = 60;
    //        position.y = 370;
            SDL_BlitSurface(texte, NULL, pSurf, &position); /* Blit du texte */
            SDL_UpdateWindowSurface(ecran);
            }
        TTF_CloseFont(police);
        TTF_Quit();
     
        SDL_FreeSurface(texte);
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }

    Et ça fonctionne à condition de mettre le chemin absolu pour la police. Merci ^^

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    C'est bien mais prends l'habitude de vérifier les valeurs de retour des fonctions tierces que tu emploies. SDL et SDL_ttf peuvent rencontrer des difficultés pour une raison x ou y, mieux vaut en être informé.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    J'ai modifié du coup en faisant comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        if((police = TTF_OpenFont("/Library/Fonts/Arial.ttf", 12)) == NULL)
            fprintf(stderr, "Erreur\n");
    C'est bien dans l'idée de ce que tu voulais ?

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    C'est une très très bonne habitude à prendre et cela devrait être obligatoire (de vérifier les codes de retour d'une fonction)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par asanque Voir le message
    C'est bien dans l'idée de ce que tu voulais ?
    Oui mais il faudrait carrément que tu sortes du traitement principal lorsque cette erreur est détectée, là tu affiches seulement un message.

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

Discussions similaires

  1. Ecrire du texte sur une fenêtre de Jeu vidéo (OSD)
    Par zenway dans le forum DirectX
    Réponses: 7
    Dernier message: 07/03/2009, 14h06
  2. Ecrire un texte sur un bitmap avec fond transparent
    Par cincap dans le forum Débuter
    Réponses: 24
    Dernier message: 16/02/2008, 13h46
  3. Réponses: 1
    Dernier message: 01/08/2007, 00h17
  4. [LG] Ecrire du texte en mode graphique
    Par maind5or dans le forum Langage
    Réponses: 2
    Dernier message: 05/08/2005, 12h55
  5. [VMR9][D3D9]ecrire un texte sur une surface
    Par drizztfr dans le forum DirectX
    Réponses: 2
    Dernier message: 13/11/2003, 15h06

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