我在表面上绘制一些文字(使用SDL_ttf),然后我想更改表面上的文字。如果我只是重绘表面,文本就不会消失。我已经看过几个关于如何解决问题的论坛帖子,但我似乎无法弄明白。特别是我无法理解为什么这个解决方案不起作用:(代码很长,所以这只是提供了必需品)
在声明的类文件中:
SDL_Surface* box; // These two are initialised to the
SDL_Surface* boxCopy; // same image
在渲染功能开始时:
*box = *boxCopy; \\Reset box surface
我对指针和C ++的理解(无可否认是有限的)表明这应该使得框中指向的表面等于boxCopy指向的表面。相反,boxCopy表面变成了框的副本。我不知道这行代码如何改变boxCopy,但看起来就是这样。
答案 0 :(得分:0)
我不确定我是否完全理解你的问题,但希望这可以帮助..只要更新文本,只要更新实际文本,就可以更新文本,而不是更新文本。它可能不是优化的性能明智,但我认为在大多数情况下它更容易。
典型的程序循环包括重新渲染表示屏幕的表面,然后是该表面的SDL_Flip。您当然可以优化重新渲染,因此您只渲染自上一帧以来实际更新的内容。那是你正在做的事情吗?如果是这样,并且如果您使用下面的方法,您应该知道新文本仅涵盖新文本的大小而不是整个旧文本。我通常首先绘制一个填充矩形,然后绘制新文本。
这是一个TTF示例,显示如何在表面上绘制文本(此处称为m_Screen,表面翻转以屏幕每帧),在这种情况下我只有一种背景颜色:
void drawText(const char* string, int x, int y,
int fR, int fG, int fB, int bR, int bG, int bB)
{
SDL_Color foregroundColor = { fR, fG, fB };
SDL_Color backgroundColor = { bR, bG, bB };
SDL_Surface* textSurface = TTF_RenderText_Shaded(m_Font, string,
foregroundColor,
backgroundColor);
SDL_Rect textLocation = { x, y, 0, 0 };
SDL_BlitSurface(textSurface, NULL, m_Screen, &textLocation);
SDL_FreeSurface(textSurface);
}
请注意,这是在调用drawText(使用一些合适的字体 size )之前完成的:
m_Font = TTF_OpenFont("arial.ttf", size);
这是在清理时完成的:
TTF_CloseFont(m_Font);