SDL - 像控制台一样打印文本?

时间:2013-06-21 03:58:42

标签: c++ windows mingw sdl true-type-fonts

我有一些使用SDL_ttf的代码(下面),并希望:

  1. 能够像控制台那样对齐文本(来自TTF)(也可以是缓冲区或数组)(将每个字符打印在单独的单元格中)。
  2. 能否利用闪烁的光标(可能渲染和取消渲染下划线,可能?)
  3. 能够让用户从键盘输入文本,并在键入内容时在屏幕上呈现每个字符(使用SDLK_charhere)。
  4. 回到#1:我正在考虑在屏幕上(从TTF)打印上一个字符的宽度,并使用其宽度(以像素为单位)在前一个字符后面打印下一个字符,再加上2个像素。 < - 请告诉我,如果常规WIN32控制台中的字符之间的间距在像素中是不同的大小。

    以下是需要修改的代码:

    #include "include/SDL/SDL.h"
    #include "include/SDL/SDL_ttf.h"
    
    int currentX = 0;
    int currentY = 0;
    int newW;
    int newH;
    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 PrintStr(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();
    
        PrintStr("", 0, 0);
    
        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;
    }
    

1 个答案:

答案 0 :(得分:1)

这不是一件容易的事,但这听起来像是一个很好的学习项目!你可能需要几千行代码而不是几十行代码。也许从考虑这些问题及其答案开始。

  • 您想要固定宽度字体还是可变宽度字体?
  • 如何以智能方式缓冲渲染文本? (例如,字形或线条)
  • 如何以智能方式缓冲文本本身?
  • 如何将按键翻译成文字?
  • 什么是翻译和驾驶这一切?

所有这些都需要与最重要的问题一起考虑:

  • 我想这样做吗?

如果你这样做,它会教你很多关于编程的知识,但它可能无法为你提供最好的全屏控制台。