【问题标题】:How to update text in a loop?如何循环更新文本?
【发布时间】:2012-10-27 12:44:45
【问题描述】:

我基本上是 C++ 的初学者,但正在研究如何更新处于 while 循环中的字符串?

目前,循环的每次迭代都会将文本写在前一个之上,但基本上还是白色的模糊。

这是我正在测试的循环:

while(!quit){
    while( SDL_PollEvent( &event ) ){
        switch(event.type){
            case SDL_QUIT: quit = true; break;
            case SDL_MOUSEMOTION: handle_mouse_position();
        }
    }

    SDL_Rect offset;
    offset.x = 400;
    offset.y = 290;

    std::stringstream s;
    s << "Mouse xpos: " << mouseX << " Mouse ypos: " << mouseY;

    font_surface = TTF_RenderText_Solid(font,s.str().c_str(),font_color);
    SDL_BlitSurface(font_surface, NULL, screen, &offset);   

    //Update the screen
    if( SDL_Flip( screen ) == -1 ) {
        return 1;    
    }
}

有没有办法清除之前的文本输出并在每个循环中更新它,以便清楚地显示鼠标位置?

【问题讨论】:

    标签: c++ sdl


    【解决方案1】:

    你没有在重绘之间清除屏幕,所以它只是在已经绘制的文本(或任何东西)上绘制,就像你说的那样,它变成了“白色模糊”。

    例如,每帧都在屏幕上尝试填充矩形。

    额外说明:您似乎没有释放 font_surface --> 内存泄漏。

    【讨论】:

    • 什么是正确的语法我似乎无法解决=/
    • 它是我无法解决的颜色 =/ 我想要的特定颜色的格式。
    • 查找颜色:font_color = SDL_MapRGB(screen->format, 0xFF, 0x00, 0x00);
    【解决方案2】:

    您可以每次都重新绘制所有内容,或者如果您的背景是纯色,则绘制一个矩形并在其上方绘制文本。

    第二个效率更高。但是如果你有一个复杂的场景,最好使用图层。首先渲染底层,然后渲染第二层,依此类推……我的意思是,你可以有一个background() 来绘制背景,foreground() 显然可以绘制前景。所以你会得到类似的东西:

    while (main_loop) {
        background();
        foreground();
    }
    

    因此您可以轻松处理更复杂的场景。

    【讨论】:

    • 哪个更有效,我将如何为它做语法?
    • 第二种效率更高。但是如果你有一个复杂的场景,最好使用图层。首先渲染底层,然后是第二层,以此类推...
    • 我试过这个:font_color SDL_MapRGB(SDL_PixelFormat, 92,132,205); SDL_FillRect(font_surface,&amp;offset,font_color); 但不开心 =/
    • 你忘了SDL_BlitSurface()吗?
    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2021-12-11
    • 2013-10-18
    • 2017-01-27
    相关资源
    最近更新 更多