Как переместить анимацию крупье с помощью ключевых событий SDL? - PullRequest
0 голосов
/ 15 марта 2020

TOP EDIT : я заменил инкремент frame и использовал вместо него frame = (int)(SDL_GetTicks()*0.01)%5. Что, я думаю, решило проблему. Но я оставляю пост на тот случай, если он будет полезен для других людей, и я открыт для предложений о лучших путях.

Я пытаюсь запрограммировать базовую c анимацию Stickman с SDL2. Я хочу, чтобы фигура двигалась при нажатии клавиш со стрелками вправо-влево. Я создал walk(std::string direction) функцию для перемещения и рендеринга текстуры. Это прекрасно работает, если я поставлю из SDL_PollEvent l oop. Но когда я создаю условие if(e.key.keysym.sym) внутри него, чтобы проверить, нажата ли клавиша и есть ли walk функция в , анимация запускается медленно и неуклюже. Я установил событие по умолчанию в режим ожидания анимации, и когда я например перемещаю курсор, анимация по умолчанию работает отлично. Я использую SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC параметр для рендерера.

Вот несколько примеров из моего кода:

void walk ( std::string direction )
{
    static int frame = 0;
    static double offset = 0;

    SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
    SDL_RenderClear( gRenderer );

    if ( direction == "right" )
    {
        SDL_Rect* currentClip = &gWalkingRightClips[frame/5];
        gWalkingRightTexture.render( ( (SCREEN_WIDTH - currentClip->w) / 2 ) + ( offset+=1.5) , ( SCREEN_HEIGHT - currentClip->h ) / 2, currentClip );
    }

    else if ( direction == "left" )
    {
        SDL_Rect* currentClip = &gWalkingLeftClips[frame/5];
        gWalkingLeftTexture.render( ( (SCREEN_WIDTH - currentClip->w) / 2 ) + ( offset-=1.5), ( SCREEN_HEIGHT - currentClip->h ) / 2, currentClip );
    }

    else
    {
        SDL_Rect* currentClip = &gStandingClips[frame/5];
        gStandingTexture.render( ( (SCREEN_WIDTH - currentClip->w) / 2 ) + offset, ( SCREEN_HEIGHT - currentClip->h ) / 2, currentClip );
    }


    SDL_RenderPresent( gRenderer );

    ++frame;
    if ( frame / 5 >= FRAMES ) { frame = 0; }
}

Это когда я помещаю анимацию в событие l oop:

    while ( SDL_PollEvent(&event) != 0 )
    {
        if ( event.type == SDL_QUIT )
        {
            quit = true;
        }
        else if ( event.key.keysym.sym )
        {
            switch ( event.key.keysym.sym )
            {
            case SDLK_RIGHT:
                walk("right");
                break;
            case SDLK_LEFT:
                walk("left");
                break;
            default :
                walk("don't");
            }
        }
    }

... и вот как это работает должным образом:

while ( SDL_PollEvent(&event) != 0 )
{
    if ( event.type == SDL_QUIT )
    {
        quit = true;
    }

}
walk(&event);

... где я изменяю walk функцию для принятия и SDL_Event* указатель. Я не поместил все функции, которые я написал, для вызова реальных функций SDL и т. Д. c. Да, это, вероятно, не самый лучший способ сделать это, но мне интересно, почему он так по-разному ведет себя в событии l oop и почему он работает нормально, когда событие не является событием нажатия клавиши. Заранее спасибо.

...