SDL: Problem with TTF fonts - program crashes

Started by
4 comments, last by rip-off 10 years, 9 months ago

So, following the lazyfoo.net tutorials on SDL, and with the help of a friend/team member who created some neat images for me, I tried to make a simple program that shows a menu with some text, and after a key press (I didn't implement that part yet) goes into the 'main game' (in reality, just another background) and after a short delay shuts down. Here's my code - I know it's not optimal writing all of it in a single source file, but I'm trying to keep things simple before moving into multiple files:


#include "SDL/SDL.h"
#include "SDL/SDL_ttf.h"
#include <string>

//The attributes of the screen
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

//Surfaces to be used
SDL_Surface* screen = NULL;
SDL_Surface* backImage = NULL;
SDL_Surface* batImage = NULL;
SDL_Surface* backMenu = NULL;
SDL_Surface* messageMenu = NULL;

//Fonts to be used
TTF_Font* menuFont = NULL;

//Function definitions
bool init()
{
    //Initialize all SDL subsystems
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
    {
        return false;
    }

    //Set up the screen
    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

    //If there was an error in setting up the screen
    if( screen == NULL )
    {
        return false;
    }

    //Initialize SDL_ttf
    if( TTF_Init() == -1 )
    {
        return false;
    }

    //Set the window caption
    SDL_WM_SetCaption( "TTF Test", NULL );

    //If everything initialized fine
    return true;
}
SDL_Surface* load_image(std::string filename)
{
    //Temporary storage for the image that's loaded
    SDL_Surface* loadedImage = NULL;

    //The optimized image that will be used
    SDL_Surface* optimizedImage = NULL;

    loadedImage = SDL_LoadBMP( filename.c_str());

    if( loadedImage != NULL )
    {
        //Create an optimized image
        optimizedImage = SDL_DisplayFormat( loadedImage );

        //Free the old image
        SDL_FreeSurface( loadedImage );
    }

    //Return the optimized image
    return optimizedImage;

}

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{
    //Make a temporary rectangle to hold the offsets
    SDL_Rect offset;

    //Give the offsets to the rectangle
    offset.x = x;
    offset.y = y;

     //Blit the surface
    SDL_BlitSurface( source, NULL, destination, &offset );
}

/*
void MainMenu()
{
    SDL_Surface* bg_menu = NULL;
    SDL_Surface* msg_menu = NULL;

    TTF_Font* text_menu = NULL;

    SDL_Color textColor = { 255, 255, 255 };


    //load necessary files
    bg_menu = load_image("menu_background.bmp")


}
*/

int main( int argc, char* args[] )
{
    init();

    //  --------------- MAIN MENU START ---------------

    //Load necessary menu files
    backMenu = load_image("menu_background.bmp");
    menuFont = TTF_OpenFont( "lazy.ttf", 28 );

    SDL_Color menuTextColor = {255,255,255};
    messageMenu = TTF_RenderText_Solid( menuFont, "Press Any Key To Continue", menuTextColor );

     //If there was an error in rendering the text
    if( messageMenu == NULL )
    {
        return 1;
    }

    //Render menu
    apply_surface (0,0,backMenu,screen);
    apply_surface (100,600,messageMenu,backMenu);

    SDL_Flip(screen);

    SDL_Delay(4000);

    // --------------- MAIN MENU END ---------------

    //Free surfaces
    SDL_FreeSurface(backMenu);
    SDL_FreeSurface(messageMenu);

    TTF_CloseFont( menuFont );

    SDL_Quit();

    return 0;




}

I think it is a rather simple program but unfortunately it is giving me trouble. When I execute it, I get a brief black screen, the program shuts down and I get a status 3 error. I suspected it has something to do with the newly-installed TTF extension library, so I started commenting lines. Apparently, when I comment the


messageMenu = TTF_RenderText_Solid( menuFont, "Press Any Key To Continue", menuTextColor );

line, the program runs, I just only see the menu background, so I guess the glitch is isolated in that line of code.

I strongly believe that I installed the library correctly - else, would it be going up to that point? Of course I can't take an oath as I'm a beginner, but I don't think that's the problem.

Any ideas, folks? I'm really eager to implement some events, so I need to get over this!

Advertisement

Is menuFont valid when you call TTF_RenderText_Solid? Try checking the return from TTF_OpenFont().

By changing the return of


if( messageMenu == NULL )
    {
        return 2;
    }

to 2 (just to signify the error is coming from there), it seems this is the case. What can I do about it?

Try checking TTF_GetError() for what the error is.

Ah, I found it. Apparently, I had accidentally deleted the font file while moving some of them. Sorry for the hassle.

Still, I got some useful answers; now I know how to check for errors better! Thanks for all your advice!

You should be checking, propagating and handling all errors all the time. It is not a debugging tool, it is an absolutely necessary part of writing robust software for more than your personal use.

This topic is closed to new replies.

Advertisement