Переключатель (event.type) не работает и таймер не отображается - PullRequest
0 голосов
/ 11 мая 2019

Я изучаю французский, чтобы изучать программирование на С, и сейчас я сталкиваюсь с необходимостью создания таймера, который обновляется каждые 100 миллисекунд.Так как учебник для SDL, и я использую SDL2, я смешиваю его с некоторыми знаниями, найденными в Интернете.Если у кого-то здесь есть время и он знает какой-нибудь SDL2 / SDL_TTF, можете ли вы попытаться решить эту проблему?Функция nulos () - это способ найти проработанную инициализацию.Чтобы возобновить, у меня две проблемы: окно закрывается примерно через 2 секунды, и я не могу нажать на опцию закрытия, и вторая - мой текст не отображается.

Хорошего дня!

int compteur()
{
    SDL_Window      *pWindow = NULL;
    SDL_Renderer    *pRenderer = NULL;
    SDL_Texture     *pTexture = NULL;
    SDL_Surface     *pSurface = NULL;
    SDL_Surface     *pTexte = NULL;
    SDL_Event       event;
    TTF_Font        *pFont = NULL;
    SDL_Color       black = {0, 0, 0};
    SDL_Color       white = {255, 255, 255};
    SDL_Rect        position = {200, 200, 0, 0};

    int             bPlay = 1;
    int             tempsActuel = 0;
    int             tempsPrecedent = 0;
    int             compteur = 0;
    char            temps[20];
    temps[0] = '\0';

    if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0)
    {
        fprintf(stderr, "Erreur SDL_Init : %s ", SDL_GetError());
        exit(EXIT_FAILURE);
    }

    TTF_Init();

    pWindow = SDL_CreateWindow("COMPTEUR.C", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
    pRenderer = SDL_CreateRenderer(pWindow, -1, SDL_RENDERER_ACCELERATED);
    pSurface = SDL_GetWindowSurface(pWindow);
    if(nulos(pWindow, pRenderer, pSurface) != 0)
        exit(EXIT_FAILURE);

    pFont = TTF_OpenFont("images/Gabriola.ttf", 40);
    if(pFont == NULL)
    {
        fprintf(stderr, "Error TTF_OpenFont : %s ", TTF_GetError());
        exit(EXIT_FAILURE);
    }

    TTF_SetFontStyle(pFont, TTF_STYLE_ITALIC | TTF_STYLE_UNDERLINE);

    tempsActuel = SDL_GetTicks();
    sprintf(temps, "Temps : %d", compteur);
    pTexte = TTF_RenderText_Shaded(pFont, temps, black, white);

    while(bPlay != 0)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                bPlay = 0;
                break;
        }

        SDL_FillRect(pSurface, NULL, SDL_MapRGB(pSurface->format, black.r, black.g, black.b));
        SDL_RenderClear(pRenderer);

        tempsActuel = SDL_GetTicks();
        if(tempsActuel - tempsPrecedent >= 100)
        {
            compteur += 100;
            sprintf(temps, "Temps : %d", compteur);
            pTexte = TTF_RenderText_Shaded(pFont, temps, black, white);
            tempsPrecedent = tempsActuel;
        }

        SDL_BlitSurface(pTexte, NULL, pSurface, &position);
        SDL_FreeSurface(pTexte);
        pTexture = SDL_CreateTextureFromSurface(pRenderer, pSurface);
        SDL_RenderCopy(pRenderer, pTexture, NULL, NULL);
        SDL_RenderClear(pRenderer);
    }

    SDL_DestroyRenderer(pRenderer);
    SDL_FreeSurface(pSurface);
    SDL_DestroyRenderer(pRenderer);
    SDL_DestroyWindow(pWindow);
    TTF_Quit();
    SDL_Quit();
    return EXIT_SUCCESS;
}
int nulos(SDL_Window *w, SDL_Renderer *r, SDL_Surface *s)
{
    if(w == NULL)
    {
        fprintf(stderr, "Erreur SDL_CreateWindow : %s ", SDL_GetError());
        return -1;
    }
    else if(r == NULL)
    {
        fprintf(stderr, "Erreur SDL_CreateRenderer : %s ", SDL_GetError());
        return -1;
    }
    else if(s == NULL)
    {
        fprintf(stderr, "Erreur SDL_GetWindowSurface : %s ", SDL_GetError());
        return -1;
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Хорошо, я сделал это! Для всех, кто интересуется, вот «хорошее» программирование. Я поместил SDL_PollEvent и переместил pTexte в другое место:

#include "main.h"

int compteur()
{
    SDL_Window      *pWindow = NULL;
    SDL_Renderer    *pRenderer = NULL;
    SDL_Texture     *pTexture = NULL;
    SDL_Surface     *pSurface = NULL;
    SDL_Surface     *pTexte = NULL;
    SDL_Event       event;
    TTF_Font        *pFont = NULL;
    SDL_Color       black = {0, 0, 0};
    SDL_Color       white = {255, 255, 255};
    SDL_Rect        position;
    SDL_bool        bQuit = SDL_FALSE;

    int             tempsActuel = 0;
    int             tempsPrecedent = 0;
    int             compteur = 0;
    char            temps[20];
    temps[0] = '\0';

    if(SDL_Init(SDL_INIT_VIDEO) != 0)
    {
        fprintf(stderr, "Erreur SDL_Init : %s ", SDL_GetError());
        exit(EXIT_FAILURE);
    }

    TTF_Init();

    pWindow = SDL_CreateWindow("COMPTEUR.C", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
    pRenderer = SDL_CreateRenderer(pWindow, -1, SDL_RENDERER_ACCELERATED);
    SDL_RenderClear(pRenderer);
    pSurface = SDL_GetWindowSurface(pWindow);

    if(pWindow == NULL || pRenderer == NULL || pSurface == NULL)
    {
        fprintf(stderr, "Erreur : %s ", SDL_GetError());
        exit(EXIT_FAILURE);
    }

    pFont = TTF_OpenFont("images/Gabriola.ttf", 40); 
    if(pFont == NULL)
    {
        fprintf(stderr, "Error TTF_OpenFont : %s ", TTF_GetError());
        exit(EXIT_FAILURE);
    }

    TTF_SetFontStyle(pFont, TTF_STYLE_ITALIC | TTF_STYLE_UNDERLINE);

    tempsActuel = SDL_GetTicks();
    sprintf(temps, "Temps : %d", compteur);
    pTexte = TTF_RenderText_Shaded(pFont, temps, black, white);
    if(pTexte == NULL)
    {
        fprintf(stderr, "Error TTF_RenderText_Shaded : %s ", TTF_GetError());
        exit(EXIT_FAILURE);
    }

    while(!bQuit) //SDL_FALSE == 0
    {
        while(SDL_PollEvent(&event))
        {
            switch(event.type)
            {
                case SDL_QUIT:
                    bQuit = SDL_TRUE;
                    break; 
            }
        }
        tempsActuel = SDL_GetTicks();
        if(tempsActuel - tempsPrecedent >= 100)
        {
            compteur += 100;
            sprintf(temps, "Temps : %d", compteur);
            tempsPrecedent = tempsActuel;
        }

        position.x = 180;
        position.y = 210;

        pTexte = TTF_RenderText_Shaded(pFont, temps, white, black);
        SDL_FillRect(pSurface, NULL, SDL_MapRGB(pSurface->format, black.r, black.g, black.b));      
        SDL_BlitSurface(pTexte, NULL, pSurface, &position);
        SDL_FreeSurface(pTexte);

        pTexture = SDL_CreateTextureFromSurface(pRenderer, pSurface);
        if(pTexture == NULL)
        {
            fprintf(stderr, "Error SDL_CreateTextureFromSurface : %s ", SDL_GetError());
            exit(EXIT_FAILURE);
        }

        SDL_RenderCopy(pRenderer, pTexture, NULL, NULL);
        SDL_RenderPresent(pRenderer);
    }

    SDL_Delay(20);
    SDL_FreeSurface(pSurface);
    if(pTexture != NULL)
        SDL_DestroyTexture(pTexture);
    if(pRenderer != NULL)
        SDL_DestroyRenderer(pRenderer);
    if(pWindow != NULL)
        SDL_DestroyWindow(pWindow);
    TTF_Quit();
    SDL_Quit();
    return EXIT_SUCCESS;
}
0 голосов
/ 11 мая 2019

Хорошо, я решил первую проблему, это была просто неосторожная ошибка.Это должно было быть:

SDL_RenderPresent(pRenderer);

Вместо

SDL_RenderClear(pRenderer);

Однако окно все равно само закрывается ...

...