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 :

[SDL_ttf] Problèmes d'écriture


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité4
    Invité(e)
    Par défaut [SDL_ttf] Problèmes d'écriture
    Bonjour,

    pour un projet,
    j'ai crée une fonction afin d'écrire du texte.
    Le TTF est inité dans le main()

    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
    SDL_Surface* QualityStandardText(string text, int size) 
    {
        SDL_Surface *message;
     
        TTF_Font *font;
     
        SDL_Color textColor = {0, 0, 0};
     
        font = TTF_OpenFont("Main.ttf", size);
     
        message = TTF_RenderText_Blended(font, text.c_str(), textColor); // BUG ICI
     
        TTF_CloseFont(font);
     
        return message;
    }
    Mais lorsque je l'appelle,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SurfacesFusion(QualityStandardText("retour au menu", 14), textes, 350, 200, false);
    (ici un blit).

    ça me crée une surface noire, ou bien ça plante.

    Savez-vous quel est le problème ?

    Merci

    PS: SurfaceFusion()
    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
    void SurfacesFusion(SDL_Surface *surface_source, SDL_Surface *surface_master, int x, int y, bool ScreenSize)
    {
        SDL_Rect pos;
        if (ScreenSize)
        {
            pos.y = 0;
            pos.x = 0;
        }
        else
        {
            pos.y = y;
            pos.x = x;
        }
        pos.w = surface_source->w;
        pos.h = surface_source->h;
     
        SDL_BlitSurface(surface_source, NULL, surface_master, &pos);
    }
    Dernière modification par Invité4 ; 04/03/2008 à 09h40.

  2. #2
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Bonjour,

    - Est-ce que tu testes le retour de l'initialisation de TTF ?
    - Il faut tester le retour de TTF_OpenFont, TTF_Render*.
    - Ce n'est pas forcément une bonne idée d'ouvrir et fermer une police...
    - Tu devrais toujours tester le retour de ta fonction QualityStandardText pour vérifier si tout s'est bien passé.

    Jc

  3. #3
    Invité4
    Invité(e)
    Par défaut
    EN fait, le premier appel passe, mais retourne une surface noire.
    Dès le deuxième appel,
    font = TTF_OpenFont("Main.ttf", size);
    j'ai (font == NULL)
    Donc c'est sûrement là que ça coince.

    Et les autres fonctions d'initialisations TTF se lancent correctement.

    Que faire au lieu d'ouvrir une police ?

    Merci de ta réponse

    PS: TTF_GetError() me dit "Could not open Main.ttf" au deuxième appel.
    Je l'ai remplacé par le Verdana du système, ça ne fonctionne pas non plus.
    La police est dans le path du projet.

    PS2 J'ai refait le fichier de gestion des police, plus d'erreur n'est affichée, mais le rendu est toujours noir.
    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
    TTF_Font *Main12;
    TTF_Font *Main13;
    TTF_Font *Main14;
     
    bool LoadFonts(void)
    {
        Main12 = TTF_OpenFont("Main.ttf", 12);
        Main13 = TTF_OpenFont("Main.ttf", 13);
        Main14 = TTF_OpenFont("Main.ttf", 14);
     
        if (Main12 == NULL || Main13 == NULL || Main14 == NULL)
        {
            MessageDiag("Le moteur de rendu de texte a rencontré un problème. Surface vide retournée.", "Erreur");
            return false;
        }
        return true;
    }
     
    void FreeFonts(void)
    {
        TTF_CloseFont(Main12);
        TTF_CloseFont(Main13);
        TTF_CloseFont(Main14);
     
    }
     
    SDL_Surface *QualityStandardText(string text, int size) // Possible memory loss with message pointer
    {
     
     
        SDL_Color textColor = {0, 0, 0};
     
        SDL_Surface *message = NULL;
     
        switch (size)
        {
            case 12:
                message = TTF_RenderText_Blended(Main12, text.c_str(), textColor);
            break;
            case 13:
                message = TTF_RenderText_Blended(Main13, text.c_str(), textColor);
            break;
            case 14:
                message = TTF_RenderText_Blended(Main14, text.c_str(), textColor);
            break;
            default:
                message = TTF_RenderText_Blended(Main12, text.c_str(), textColor);
            break;
        }
     
        if (message == NULL)
        {
            MessageDiag("Le rendu du texte a échoué.", "Erreur");
        }
     
        return message;
    }
    Dernière modification par Invité4 ; 04/03/2008 à 22h53.

  4. #4
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    C'est pas un peu bizarre de mettre la couleur à 0,0,0 ?

    Tentes 255,255,255...

    Jc

  5. #5
    Invité4
    Invité(e)
    Par défaut
    Bien joué, ça fonctionne avec 255, 255, 255. ça écrit en blanc.

    Donc mon problème se situe maintenant dans ma compréhension de SDL.

    En fait je crée une surface en 800x600 et en HWSURFACE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface *temp = SDL_CreateRGBSurface(SDL_HWSURFACE, width, height, 32, 0, 0, 0, 0);
    Je la veux transparente, mais c'est elle qui se remplit de noir.

    Car ensuite je blitte le texte dessus.

    Comment la créer transparente ?

    J'avoue avoir eu des problèmes de compréhension avec les tutoriaux.

    Merci encore.

    EDIT
    J'ai ajouté ça à ma surface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        SDL_FillRect(temp, NULL, SDL_MapRGB(temp->format, 26, 255, 164)); // Transparency color
        Uint32 colorkey = SDL_MapRGB(temp->format, 26, 255, 164);
        SDL_SetColorKey(temp, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey );
    La couleur alpha est un vert-pistache moche. Le problème est que le texte blitté dessus a des contours verts.
    Dernière modification par Invité4 ; 05/03/2008 à 09h49.

  6. #6
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Pourquoi ne pas faire un rendu en noir et ensuite faire un Set_Colorkey avec la couleur noir ?

    Mais pourquoi ne pas juste directement faire le rendu sur la surface destination ?

    Jc

Discussions similaires

  1. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15
  2. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28
  3. Problème d'écriture dans un tableau
    Par Hokagge dans le forum MFC
    Réponses: 46
    Dernier message: 08/07/2005, 16h47
  4. problème d'écriture dans la BD
    Par billy_ze_kid dans le forum ASP
    Réponses: 6
    Dernier message: 12/06/2005, 20h30
  5. [communication série] problème lecture/écriture
    Par davinout dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 01/06/2005, 13h14

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