Jump to content

  • Log In with Google      Sign In   
  • Create Account

[C++ & SDL] Some Questions


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 lmsmi1   Members   -  Reputation: 126

Like
0Likes
Like

Posted 20 June 2013 - 09:27 PM

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



Sponsor:

#2 Wooh   Members   -  Reputation: 652

Like
0Likes
Like

Posted 21 June 2013 - 03:58 AM

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.

Edited by Wooh, 21 June 2013 - 04:00 AM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS