-1

我将一些文本绘制到表面(使用 SDL_ttf),然后我想更改表面上的文本。如果我只是重绘表面,文本不会消失。我已经查看了几个关于如何解决问题的论坛帖子,但我似乎无法弄清楚。特别是我不明白为什么这个解决方案不起作用:(代码很长,所以这只是提供了要点)

在声明的类文件中:

       SDL_Surface* box; // These two are initialised to the 
       SDL_Surface* boxCopy; // same image

在我的渲染功能开始时:

       *box = *boxCopy; \\Reset box surface

我对指针和 C++ 的理解(当然是有限的)表明这应该使 box 指向的表面等于 boxCopy 指向的表面。相反,boxCopy 表面变成了 box 的副本。我不知道这行代码如何更改 boxCopy ,但似乎就是这样。

4

1 回答 1

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 之前完成的(使用一些合适的字体大小):

m_Font = TTF_OpenFont("arial.ttf", size);

这是在清理时完成的:

TTF_CloseFont(m_Font);
于 2014-05-02T11:21:27.513 回答