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 и почему он работает нормально, когда событие не является событием нажатия клавиши. Заранее спасибо.