Программа SDL2 записывает только часть строки - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть код с функцией TextOut, который записывает один символ в окно каждый раз с некоторой задержкой.Все было в норме, но моя программа записывает в окно только часть строки.Однако иногда программа пишет весь текст.

Эта функция создает wchar из char

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;
}

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Проблема, которую вы описываете, связана с вашим циклом событий - вы вызываете там свою функцию рендеринга.Когда отображается ваше окно, генерируется несколько событий (SDL_WINDOWEVENT_EXPOSED и т. Д.), Поэтому ваша функция рендеринга вызывается несколько раз, но этого недостаточно для вашего «всего» текста.Когда приходит больше событий (движение мыши, нажатие клавиш, манипуляции с окнами, ...) - вы можете увидеть больше.Если это нежелательное поведение - вы должны использовать цикл обработки событий для обработки событий, например:

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

Сомнительно, как вы собираетесь продолжать рисовать после того, как все символы показаны, или почему вынужен malloc (не надо).

0 голосов
/ 23 сентября 2018

Для меня весь текст появлялся неизменно, поэтому я не смог проверить, решат ли эти улучшения вашу проблему или нет, но они определенно связаны с вашим кодом.

Вы должны освободить памятьвыделенный 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;
...