Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重置曲面_C++_2d_Sdl_Sdl Ttf - Fatal编程技术网

C++ 重置曲面

C++ 重置曲面,c++,2d,sdl,sdl-ttf,C++,2d,Sdl,Sdl Ttf,我在曲面上绘制了一些文本(使用SDL_ttf),然后我想更改曲面上的文本。如果我只是重新绘制曲面,文本不会消失。我已经看了好几篇关于如何解决这个问题的论坛帖子,但我似乎无法理解。特别是,我无法理解为什么这个解决方案不起作用:(代码很长,所以只给出了要点) 在类文件中声明: SDL_Surface* box; // These two are initialised to the SDL_Surface* boxCopy; // same image 在渲染函数的开

我在曲面上绘制了一些文本(使用SDL_ttf),然后我想更改曲面上的文本。如果我只是重新绘制曲面,文本不会消失。我已经看了好几篇关于如何解决这个问题的论坛帖子,但我似乎无法理解。特别是,我无法理解为什么这个解决方案不起作用:(代码很长,所以只给出了要点)

在类文件中声明:

       SDL_Surface* box; // These two are initialised to the 
       SDL_Surface* boxCopy; // same image
在渲染函数的开始处:

       *box = *boxCopy; \\Reset box surface

我对指针和C++的理解(这是公认的有限)表明,这应该使BoScript指向的表面等于BOX的指向。相反,boxCopy曲面将成为长方体的副本。我不知道这一行代码如何改变boxCopy,但这似乎就是正在发生的事情。

我不确定我是否完全理解您的问题,但希望这能有所帮助。。无论何时更新绘制在其上的曲面,都更容易更新文本,而不是在实际文本更新时更新文本。在性能方面,它可能没有优化,但我想说,在大多数情况下,它更容易实现

典型的程序循环包括重新渲染表示屏幕的曲面,然后再对该曲面进行SDL_翻转。当然,您可以优化重新渲染,以便只渲染自上一帧以来实际更新的内容。这可能就是你正在做的吗?如果是这样,并且使用下面的方法,您应该知道新文本只覆盖新文本的大小,而不是整个旧文本。我通常先画一个填充的矩形,然后再画新的文本来解决这个问题

下面是一个TTF示例,显示了在我只有一种背景色的简单情况下,如何在曲面(这里称为m_屏幕,它是每帧翻转到屏幕的曲面)上绘制文本:

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

这是在清理时完成的:

TTF_CloseFont(m_Font);

当然它不会消失,如果你在一个表面上画,它会永远改变。如果需要复制,请使用SDL_CreateRGBSurface()并手动复制像素数据。
TTF_CloseFont(m_Font);