Advertisement

[C++ & SDL] Some Questions

Started by June 21, 2013 03:27 AM
0 comments, last by Wooh 11 years, 5 months ago

I've got a few questions about using SDL_ttf to render text:

1. How can I render the text to a buffer or array?

2. How do I get the length of a single character rendered from a TTF document?

3. If it's possible to do 1 and 2, then how exactly do I render a new line ('\n')?

Here's some code I need to modify. Feel free to modify it and post what you can here.


#include "include/SDL/SDL.h"
#include "include/SDL/SDL_ttf.h"

int currentX = 0;
int currentY = 0;
SDL_Surface* screen;
SDL_Surface* fontSurface;
SDL_Color fColor;
SDL_Rect fontRect;

SDL_Event event;

TTF_Font* font;

//Initialize the font, set to white
void fontInit(){
        TTF_Init();
        font = TTF_OpenFont("dos.ttf", 12);
        fColor.r = 0; // 255
        fColor.g = 204; // 255
        fColor.b = 0; //255
}

//Print the designated string at the specified coordinates
void printF(char *c, int x, int y){
        fontSurface = TTF_RenderText_Solid(font, c, fColor);
        fontRect.x = x;
        fontRect.y = y;
        SDL_BlitSurface(fontSurface, NULL, screen, &fontRect);
        SDL_Flip(screen);
}

int main(int argc, char** argv)
{
    // Initialize the SDL library with the Video subsystem
    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);

    //Create the screen
    screen = SDL_SetVideoMode(320, 480, 0, SDL_SWSURFACE);

    //Initialize fonts
    fontInit();

    //Print to center of screen
    // printF("Hello World", screen->w/2 - 11*3, screen->h/2);
    printF("Hello world!", currentX, currentY);

    do {
        // Process the events
        while (SDL_PollEvent(&Event)) {
            switch (Event.type) {

                case SDL_KEYDOWN:
                    switch (Event.key.keysym.sym) {
                    // Escape forces us to quit the app
                        case SDLK_ESCAPE:
                            event.type = SDL_QUIT;
                        break;

                        default:
                        break;
                    }
                break;

            default:
            break;
        }
    }
    SDL_Delay(10);
    } while (Event.type != SDL_QUIT);

    // Cleanup
    SDL_Quit();

    return 0;
}

Thanks in advance.

~lmsmi1

1.
Do you want an array of SDL_Surface*?
SDL_Surface* texts[10];
texts[0] = TTF_RenderText_Solid(font, "txt1", fColor); // error checking ignored
texts[1] = TTF_RenderText_Solid(font, "txt2", fColor);
texts[2] = TTF_RenderText_Solid(font, "txt3", fColor);
...
Or you can use std::vector, and don't have to specify the size beforehand.
std::vector<SDL_Surface*> texts;
texts.push_back(TTF_RenderText_Solid(font, "txt1", fColor));
texts.push_back(TTF_RenderText_Solid(font, "txt2", fColor));
texts.push_back(TTF_RenderText_Solid(font, "txt3", fColor));
...
2.
If you have rendered a single character to a surface you can get the width and height of the surface by accessing the w and h member variables of the SDL_Surface.
SDL_Surface* charSurface = TTF_RenderText_Solid(font, "A", fColor);
std::cout << charSurface->w << ' ' << charSurface->h << std::endl;
If you have not rendered the character you can use TTF_SizeText to calculate the size.
int w, h;
TTF_SizeText(font, "A", &w, &h);
std::cout << w << ' ' << h << std::endl;
3.
If you print line by line you just need to change the Y-coordinate by adding the height of the font each time. You can use TTF_FontHeight if you don't know the height already.

This topic is closed to new replies.

Advertisement