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, tuto de Fiquet et dbgheap.c


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Par défaut SDL_ttf, tuto de Fiquet et dbgheap.c
    Bonjour,

    Une fois installé SDL (confer poste un peu en dessous xD), j'installe SDL_ttf. Pas de problème tout ça. Je prends le petit programme de Fiquet: http://jeux.developpez.com/faq/sdl/?page=texte.

    Bien sûr j'initie tout avec le tuto de base de SDL. Mais problème, le programme de Fiquet n'est pas écrit en C, et je ne peux travailler qu'en C et sur VC6, pour des raisons de compatibilités dans la suite de mon projet.

    Je me dis, je vais mettre un petit sous programme d'initialisation pour ne pas avoir de problèmes avec ça, puis après initialisation je déclare tout d'un coup, en allocation directe, sans malloc. Tout marche bien jusqu'à la ligne :

    SDL_Surface* TextSurface = TTF_RenderText_Solid(Font, "Salut tout le monde !", TextColor);

    Où il me trouve un : Access violation reading location 0x00000000.

    Bon tant pis, je fais ça en deux morceaux, et je vais mettre du gros malloc, comme ça je prends pas de risque (dix millions pour une image 600 * 800). Je relance et cette fois il m'amène dans dbgheap.c, ligne 475 :

    _munlock(_HEAP_LOCK);

    Avec le même acces violation.

    En fait je me demande si on peut utiliser SDL_ttf en C, et si on peut, comment faire face à ce problème d'allocation ?

    PS : je ne suis pas un vieux routard du C ni du C++, je n'en fais que depuis un mois, avant je travaillais sur Java, alors j'ai encore beaucoup de mal avec les histoires d'allocation.

  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,

    - Que vaut la variable Font ?
    - Montres comment tu initialises la SDL, SDL_ttf.

    Un code minimal, compilable qui expose ton problème serait pas mal.

    Jc

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Par défaut
    Voilà mon code compilable ultra simplifié (mais même erreur)

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
     
    #include <stdlib.h>
    #include <stdio.h>
    #include "SDL.h"
    #include "SDL_ttf.h"
     
     
    SDL_Surface* affichage;
    TTF_Font*    Font;
    SDL_Color TextColor;
     
    void initSDL(int width, int height);
    void attendreTouche(void);
    void actualiser(void);
    void dessiner();
     
     
    int main(int argc, char** argv)
    {
      initSDL(600,800);
      dessiner();
      actualiser();
      attendreTouche();
      return EXIT_SUCCESS;
    }
     
    void initSDL(int width, int height)
    {
     
      if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        fprintf(stderr, "Erreur à l'initialisation de la SDL : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
      }
     
      atexit(SDL_Quit);
      affichage = SDL_SetVideoMode(width, height, 32, SDL_SWSURFACE);
     
      if (affichage == NULL) {
        fprintf(stderr, "Impossible d'activer le mode graphique : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
      }
     
      SDL_WM_SetCaption("Image", NULL);
     
    	 /* Initialisation de SDL_ttf */
    	if(TTF_Init() < 0 )
    	{
    	 printf("Impossible d'initialiser SDL_ttf : %s", TTF_GetError());
    	 return;
    	}
     
    	/* Charge une police depuis un fichier, avec une taille de point à 50 */
    	Font = TTF_OpenFont("comic.ttf", 50);
     
    	/* Si la police est nulle, il y a eu une erreur */
    	if(!Font)
    	{
    	 printf("Erreur de création de la police : %s", TTF_GetError());
    	  return;
    	}
     
    	/* Couleur du texte (ici rouge) */
     
    	TextColor.r = 255;
    	TextColor.g = 0;
    	TextColor.b = 0;
     
    }
     
    void attendreTouche(void)
    {
      SDL_Event			event;
        do
        SDL_WaitEvent(&event);
      while (event.type != SDL_QUIT && event.type != SDL_KEYDOWN);
     
    }
     
    void actualiser(void)
    {
      SDL_UpdateRect(affichage, 0, 0, 0, 0);
    }
     
    void dessiner()
    {
      SDL_Rect DstRect;
      SDL_Surface* TextSurface;
     
      TextSurface = (SDL_Surface*) malloc (10000000);
      TextSurface = TTF_RenderText_Solid(Font, "Salut tout le monde !", TextColor);; /*Unhandled exception at 0x00331d3b in autreTest.exe: 0xC0000005: Access violation reading location 0x00000000.*/
     
      /* On rend un texte sur une surface SDL, en utilisant notre police et notre couleur */
     
    	/* Si la surface est nulle, il y a eu une erreur */
    	if(!TextSurface)
    	{
    	   printf("Erreur de rendu du texte : %s", TTF_GetError());
    	   return;
    	}
     
    	/* On peut maintenant blitter notre surface comme n'importe quelle autre */
     
    	DstRect.x = 0;
    	DstRect.y = 0;
    	DstRect.w = TextSurface->w;
    	DstRect.h = TextSurface->h;
     
    	/* Affiche toute la surface en 0,0 */
    	SDL_BlitSurface(TextSurface, NULL, affichage, &DstRect);
    }

  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
    En fait, c'est un bug connu de la version Solid du rendu de texte.

    Utilise Shaded et ca devrait passer :

    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
        TextSurface = TTF_RenderText_Shaded(Font, "Salut tout le monde !", TextColor, bgd);; /*Unhandled exception at 0x
     
        /* On rend un texte sur une surface SDL, en utilisant notre police et notre couleur */
     
        /* Si la surface est nulle, il y a eu une erreur */
        if(TextSurface == NULL)
        {
            printf("Erreur de rendu du texte : %s", TTF_GetError());
            exit(EXIT_FAILURE);
        }
     
        /* On peut maintenant blitter notre surface comme n'importe quelle autre */
        DstRect.x = 0;
        DstRect.y = 0;
        DstRect.w = TextSurface->w;
        DstRect.h = TextSurface->h;
     
        /* Affiche toute la surface en 0,0 */
        SDL_BlitSurface(TextSurface, NULL, affichage, &DstRect);
     
        SDL_FreeSurface(TextSurface);
    Par contre, ton allocation avant ne servait à rien, la fonction TTF fera l'allocation en interne.

    Jc

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Par défaut
    Bon bah ça marche merci

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

Discussions similaires

  1. Un tuto pour direct show
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 11
    Dernier message: 04/04/2003, 21h28
  2. tuto sur MDI
    Par nicholz dans le forum Composants VCL
    Réponses: 2
    Dernier message: 25/01/2003, 17h37

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