【问题标题】:How to print out text (SDL_TTF) from an array?如何从数组中打印出文本(SDL_TTF)?
【发布时间】:2017-05-12 09:50:57
【问题描述】:

我发布了我认为相关的部分代码。我正在尝试通过 SDL_TTF 为我的菜单绘制一些文本。每次单击按钮时,我都会从服务器获取一串字符。 “I1P1I2P1I3P1I4P1I5P1I6P1I7P1I8P1I9P1”之类的东西,“I1”表示大厅 1,P1 表示连接了 1 个玩家。但是我只想打印出“I1”然后有一堆空间说200像素然后打印出“P1”然后跳到下一行打印“I2”和“P1”。我尝试了文本变形,但它忽略了它并打印出整行文本。其次,我如何才能在“I1”和“P1”之间打印空格。有没有更简单/有效的方法来通过数组中的 SDL_TTF 打印文本?

typedef struct
{
    Menu menu;

    SDL_Texture     *label;
    SDL_Renderer    *rendererMenu;
    TTF_Font        *font;
    char            *lobbyResponse;
}   MenuState;

void dispayText(char *text, MenuState *menu)
{
    SDL_Color color         = {255, 255, 255, 255};
    SDL_Surface *surface    = TTF_RenderText_Blended_Wrapped(menu->font, text, color, 4);
    menu->label             = SDL_CreateTextureFromSurface(menu->rendererMenu, surface);
    menu->menu.labelW       = surface->w;
    menu->menu.labelH       = surface->h;
    //pos.x = x;
    //pos.y = y;
    SDL_FreeSurface(surface);
}



int processEventsMenu(SDL_Window *window, MenuState *menu, TCPsocket *tcpsock)
{
    SDL_Event ev;
    menu->lobbyResponse = malloc(sizeof(char[1024])); // <- moved it here for clarity

    while (SDL_PollEvent(&ev))
    {
        switch(ev.type)
        {
            case SDL_MOUSEBUTTONDOWN:
                if (ev.button.button == SDL_BUTTON_LEFT)
                {
                    SendLobbyMessage(tcpsock, refreshCommand);
                    ReceiveLobbyMessage(tcpsock, menu->lobbyResponse);
                    printf("Created lobby with id: %c\n",menu->lobbyResponse[0]);
                    dispayText(menu->lobbyResponse, menu);
                    printf("Lobbys: %c\n", menu->lobbyResponse[0]);
                }
        }
    }
}

【问题讨论】:

  • 执行程序时机器不会考虑不在函数内部的代码。您在函数 displayTextprocessEventsMenu 之间有一行代码。
  • nounoursnoir 实际上我只是剥离了很多代码。您引用的代码在另一个函数中退出。我只是想包含它,以便您可以看到我正确地初始化了它。
  • mm 好的,但我认为您应该将这行代码与您编写的代码块分开编写,并说明这是一个需要注意的重要细节,来自程序中的另一个函数。对我来说,这看起来像是一段毫无意义的代码。

标签: c sdl-ttf


【解决方案1】:
puts("Something \t\t Something\n"); // \t allows to put "empty spaces" 

我建议在打印之前编写一个函数来格式化字符串。考虑使用strtok_r()。另一种解决方案是逐个字符迭代到字符串中,并在每次遇到| 时打印\n 以“跳到下一行”。

似乎对我有用的一种可能的解决方案是:

const char*         s = "I1P1I2P1I3P1I4P1I5P1I6P1I7P1I8P1I9P1";
const unsigned   size = strlen(s);
char*          result = malloc(sizeof(char) * (strlen(s) + 2 * strlen(s) / 4) + 1);
/* We allocated the memory necessary to put the whole of the string `s`
inside of the string `result`, and a tab and a newline, considering
that for every 4 characters inside of `s`, we will put 1 tab and 1
newline*/

int                 i = 0;
int                 j = 0;

while (i < size + 1)
{
    result[j] = s[i];
    if ((i + 1) % 2 == 0)       // Every 2 char that were passed from _s_ to _result_
    {
        if ((i + 1) % 4 == 0)
            result[++j] = '\n'; // Either we add a newline...
        else
            result[++j] = '\t'; // ... or we add a tab
    }
    j++;
    i++;
}
printf("Original String : %s\n", s);
printf("Formatted String : \n%s\n", result);

输出是:

Original String : I1P1I2P1I3P1I4P1I5P1I6P1I7P1I8P1I9P1
Formatted String : 
I1  P1
I2  P1
I3  P1
I4  P1
I5  P1
I6  P1
I7  P1
I8  P1
I9  P1

【讨论】:

  • 您好,感谢您的回复。澄清一下,我的菜单是一个使用 SDL 绘制的图形界面。我有 2 个列,一个是左侧的 Lobby ID,一个是右侧的 #Players。我想以某种方式将数据绘制到我的菜单中 - 我在某种程度上完成了。现在我的函数会将整个字符串打印到我的屏幕/菜单上。即使数组没有空间并且自动换行,我也希望能够添加空间..
  • 如果您编写了一个函数,可以在打印之前正确格式化您的字符串怎么办?我可以帮你解决这个问题
  • 嗨,Badda 我明白你在说什么,我也考虑过。你有任何关于如何实现它的例子吗?
  • @xxFlashxx 我用一个例子编辑了我的答案。可能这对你有用吗?如果你想在I1P1之间有更多的空间,也可以添加复数标签
  • 我允许自己对您的代码进行了一些修改,并试图使其更易于阅读,如果您认为它不是更好或更容易理解,请随时拒绝
【解决方案2】:

你可以在每个 n 字符后放置空格和换行符,因为你有一个规则的字符模式。您想要的是在前 2 个字符之后有一个空格(或制表符或其他),然后在接下来的 2 个字符之后有一个换行符,然后在接下来的 2 个字符之后有一个空格,在接下来的 2 个字符之后有一个换行符,等等。

对我来说,最简单的方法是一个简单的while 循环,它会逐个打印字符,并在需要打印一些空格或换行符时添加空格和换行符。

你可以遍历你想要格式化的字符串:

int     main(void)
{
    int      i = 0;
    int      j = 0;
    char*    s = "I1P1I2P1I3P1I4P1I5P1I6P1I7P1I8P1I9P1";

    while (s[j]) // while we have not reached the end of the string s
    {
        if ((i + 1) % 6 == 0)
            printf("\n");           // print a newline
        else if ((i + 1) % 3 == 0)
            printf("  ");           // print some spaces (or whatever you want)
        else
            printf("%c", s[j++]);   // print a character then increment the index of s
        i++;
    }
}

您还可以在程序正在编写的行中递增:

int main(void)
{
    int     j = 0;
    int     k = 0;        // k is the index of the line we're currently writing
    char*   s = "I1P1I2P1I3P1I4P1I5P1I6P1I7P1I8P1I9P1";
    while (s[j])
    {
        if (k == 5)       // If the program has already written 4 chars from s in the line...
        {
            printf("\n"); // ...go to a new line.
            k = 0;
        }
        else if (k == 2)  // If the program has already written 2 chars from s in the line...
        {
            printf(" ");  // ...add some spaces.
            k++;
        }
        else              // Else, print a char from s in the current line
        {
            printf("%c", s[j++]);
            k++;
        }
    }
}

输出:

I1  P1
I2  P1
I3  P1
I4  P1
I5  P1
I6  P1
I7  P1
I8  P1
I9  P1

【讨论】:

  • if ((i + 1) % 6) == 0 我想你忘了括号
  • 其实我放错地方了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 2023-01-27
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多