如何从数组中打印出文本 (SDL_TTF)?
How to print out text (SDL_TTF) from an array?
我发布了我认为相关的部分代码。我正在尝试通过 SDL_TTF 为我的菜单绘制一些文本。每次单击按钮时,我都会从服务器获取一串字符。 "I1P1I2P1I3P1I4P1I5P1I6P1I7P1I8P1I9P1" "I1" 表示大厅 1,P1 表示连接了 1 个玩家。但是我只想打印出 "I1" 然后有一堆 space 说 200 像素然后打印出 "P1" 然后跳到下一行打印 "I2" 和 "P1".我尝试了文本变形,但它忽略了它并打印出整行文本。其次,我怎样才能在 "I1" 和 "P1" 之间打印空的 spaces。是否有一种 easier/efficient 方法可以通过 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]);
}
}
}
}
puts("Something \t\t Something\n"); // \t allows to put "empty spaces"
我建议编写一个函数,在打印之前按照您的意愿格式化字符串。考虑使用 strtok_r()
。另一种解决方案是每次遇到 |
.
时,将 char 逐个迭代到字符串中并打印 \n
到 "jump to the next line"
一个似乎对我有用的可能解决方案是:
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
您可以在每个 n 个字符后放置 space 和换行符,因为您有规则的字符模式。你想要的是在前 2 个字符之后有一个 space (或制表符或其他),然后在接下来的 2 个字符之后有一个换行符,然后在接下来的 2 个字符之后有一个 space 并且在接下来的 2 个字符等
对我来说,最简单的方法是一个简单的 while
循环,一个一个地打印字符,添加 spaces 和换行符,每当一些 spaces 或换行符应该打印出来。
您可以遍历要格式化的字符串:
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
我发布了我认为相关的部分代码。我正在尝试通过 SDL_TTF 为我的菜单绘制一些文本。每次单击按钮时,我都会从服务器获取一串字符。 "I1P1I2P1I3P1I4P1I5P1I6P1I7P1I8P1I9P1" "I1" 表示大厅 1,P1 表示连接了 1 个玩家。但是我只想打印出 "I1" 然后有一堆 space 说 200 像素然后打印出 "P1" 然后跳到下一行打印 "I2" 和 "P1".我尝试了文本变形,但它忽略了它并打印出整行文本。其次,我怎样才能在 "I1" 和 "P1" 之间打印空的 spaces。是否有一种 easier/efficient 方法可以通过 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]);
}
}
}
}
puts("Something \t\t Something\n"); // \t allows to put "empty spaces"
我建议编写一个函数,在打印之前按照您的意愿格式化字符串。考虑使用 strtok_r()
。另一种解决方案是每次遇到 |
.
\n
到 "jump to the next line"
一个似乎对我有用的可能解决方案是:
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
您可以在每个 n 个字符后放置 space 和换行符,因为您有规则的字符模式。你想要的是在前 2 个字符之后有一个 space (或制表符或其他),然后在接下来的 2 个字符之后有一个换行符,然后在接下来的 2 个字符之后有一个 space 并且在接下来的 2 个字符等
对我来说,最简单的方法是一个简单的 while
循环,一个一个地打印字符,添加 spaces 和换行符,每当一些 spaces 或换行符应该打印出来。
您可以遍历要格式化的字符串:
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