SDL2程序只写字符串的一部分

问题描述 投票:0回答:2

我有一个带有TextOut函数的代码,每次都会在窗口上写一个字符并有一些延迟。一切正常,但我的程序只将部分字符串写入窗口。但有时程序会写入整个文本。

此函数从char创建wchar

char* cts(char c)
{
    char *ptr = (char*)malloc(2 * sizeof(char));
    ptr[0] = c;
    ptr[1] = '\0';
    return ptr;
}



void TextOut(SDL_Renderer *ren, TTF_Font *f)
{
    SDL_Surface *sur;
    SDL_Texture *tex;
    static SDL_Rect rect;
    static int32_t x;

   //Checking if string is end  
    if (OUT_STRING[x] == '\0') return;

    //Get a wide char from string 
    char *temp = cts(OUT_STRING[x]);

    //Get the size of font
    TTF_SizeText(f, temp, &rect.w, &rect.h);

    sur = TTF_RenderText_Blended(f, temp, color)

    free(temp);

    tex = SDL_CreateTextureFromSurface(ren, sur);
    SDL_RenderCopy(ren, tex, NULL, &rect);
    SDL_RenderPresent(ren);
    rect.x += rect.w;
    x++;
    SDL_FreeSurface(sur);
    SDL_Delay(50);
}

int main(int argc, char* argv[])
{

    /*

    Initialization of Window, Renderer, Font and other things

    */

    OUT_STRING = "We are waiting";


    while (!quit)
    {
        while (SDL_PollEvent(&e) != 0)
        {
            TextOut(renderer, font);
            if (e.type == SDL_QUIT) quit = true;
        }
    }
    return 0;
}
c++ sdl-2 true-type-fonts
2个回答
2
投票

您描述的问题是由于您的事件循环 - 您在那里调用渲染功能。当您的窗口显示时,会生成几个事件(SDL_WINDOWEVENT_EXPOSED等),因此您的渲染函数称为severnal times,但不足以满足您的“整个”文本。当更多事件到来时(鼠标移动,按键,窗口操作......) - 您可以看到更多。如果这是不受欢迎的行为 - 您应该使用事件循环,它是什么,事件处理,例如:

while (!quit)
{
    while (SDL_PollEvent(&e) != 0)
    {
        if (e.type == SDL_QUIT) quit = true;
    }
    TextOut(renderer, font);
}

在显示所有角色之后你将如何继续绘画,或者为什么你需要malloc(你没有),这是值得怀疑的。


1
投票

对我来说,整个文本总是出现,所以我无法测试这些改进是否能解决您的问题,但它们肯定是您的代码问题。

你应该释放malloc里面的cts分配的内存,例如你可以这样做:

char* temp = cts(OUT_STRING[x]);
TTF_SizeText(f, temp, &rect.w, &rect.h);
free(temp);

检查退出事件是否已发生时,请勿使用赋值而不是比较。正确的方法是:

if (e.type == SDL_QUIT) quit = true;

检查是否已到达char数组的末尾时,请勿使用NULL。这样做是这样的:

if (OUT_STRING[x] == '\0') return;
© www.soinside.com 2019 - 2024. All rights reserved.